fetch和forall插入rowtype中的变量tablename

时间:2016-09-23 16:16:04

标签: plsql forall

我打开一个光标,然后进行一次获取批量收集。当我执行FORALL来插入表中的所有记录时,问题就来了,因为这个表是一个变量。这是代码:

TYPE DST_TYPE IS TABLE OF DST_TABLE%ROWTYPE;
TYPE CURSOR IS REF CURSOR;

v_srcTable := 'my_src_table'; /* Dynamic Variable */
v_dstTable := 'my_dst_table'; /* Dynamic Variable */
v_partition := 'my_partition'; /* Dynamic Variable */
v_dstRecords DST_TYPE;
v_Cursor CURSOR;

OPEN v_Cursor FOR 
           'SELECT /*+ PARALLEL (TT 2) */ field1,field2,field3,...,field50 FROM' || v_srcTable || ' TT ';
    LOOP
        FETCH v_Cursor BULK COLLECT INTO v_dstRecords LIMIT 1000;
        FORALL i in 1 .. v_dstRecords.COUNT
        INSERT /*+ APPEND */ INTO v_dstTable PARTITION(v_partition) MT VALUES v_dstRecords(i); 

        COMMIT;             
        EXIT WHEN v_Cursor%NOTFOUND; 
    END LOOP;
CLOSE v_Cursor;

此操作失败,因为v_dstTable不是有效表(有效表为“my_dst_table”)。所以,如果我想解析表名,我需要更改“EXECUTE IMMEDIATE INSERT ...:”语法。问题是,如果我使用这种语法,我无法在VALUES中传递行类型

v_SQL := 'INSERT /*+ APPEND */ INTO ' || v_dstTable || ' PARTITION(' || v_partition || ') MT VALUES :1';

FORALL i in 1 .. v_dstRecords.COUNT
EXECUTE IMMEDIATE v_SQL USING v_dstRecords(i);

我看到的唯一选择是将rowtype的所有参数作为绑定变量传递,但是有50个参数......

v_SQL := 'INSERT /*+ APPEND */ INTO ' || v_dstTable || ' PARTITION(' || v_partition || ') MT VALUES (:1,:2,:3,...,:50)';

FORALL i in 1 .. v_dstRecords.COUNT
EXECUTE IMMEDIATE v_SQL USING v_dstRecords(i).field1, v_dstRecords(i).field2, ..., v_dstRecords(i).field50;

如果不使用绑定变量的语法,有没有办法做到这一点?如果你只有1个参数可以,但如果你有50个......

由于

0 个答案:

没有答案