使用元数据表创建自动通用脚本,以插入到具有相同结构的另一个表中



基本上,我想创建一个脚本,自动从一个表中选择并插入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;

相关内容

  • 没有找到相关文章

最新更新