基本上,我想创建一个脚本,自动从一个表中选择并插入plsql中的新表(两个表的结构相同(。这必须是通用的,可以适用于任何表。类似于使用dba_tab_cols,只在循环中传递表名(获取表的select查询(,并使用它插入到另一个表中。
类似于下面的内容,但这给了我错误bcoz额外的",",在末尾的INSERT INTO语句中SQL错误:ORA-00936:缺少表达式
FOR i IN (SELECT 'v_rec(i).'||column_name||',' AS col
FROM dba_tab_cols
WHERE table_name=v_table_name AND owner = 'XYZ'
ORDER BY column_id
) LOOP
v_col := v_col||i.col;
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_col);
END;
v_sql_data :='
DECLARE
TYPE c_cur IS REF CURSOR;
v_cur c_cur;
TYPE t_table IS TABLE OF '||v_table_name||'%ROWTYPE;
v_rec t_table;
v_sql VARCHAR2(4000 CHAR);
BEGIN
v_sql := ''select * from '||v_table_name||''';
OPEN v_cur FOR v_sql;
LOOP
FETCH v_cur BULK COLLECT INTO v_rec LIMIT 10000 ;
EXIT WHEN v_rec.COUNT=0;
FORALL i IN 1..v_rec.COUNT
INSERT INTO '||v_new_table_name||' VALUES ('||v_col||');
COMMIT;
END LOOP;
END;
';
EXECUTE IMMEDIATE v_sql_data;
有人能提出建议吗。?
谢谢。
我想说,你的问题不是一个额外的逗号,而是所有那些错位和不匹配的单引号。对于初学者:
v_sql_data :='
这句话本身在做什么?在解析器找到终止引号之前,它后面的所有内容都被视为文字字符串。
再次:
TYPE t_table IS TABLE OF '||v_table_name||'%ROWTYPE;
看看这两句话所附的内容。你的代码中充满了这种东西。
我们甚至不知道PL/SQL是如何开始的。块(存储的或匿名的(肯定不会以FOR语句开头。
但是,归根结底,你让WAAAYYYY变得比它需要的更复杂。为什么不做一个简单的呢
create table_b as select * from table_a;