0

カーソルを開き、フェッチ バルク コレクトを実行します。このテーブルは変数であるため、テーブル内のすべてのレコードを INSERT するために 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);

私が見る唯一の代替手段は、行タイプのすべてのパラメーターをバインド変数として渡すことですが、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個ある場合は...

ありがとう

4

0 に答える 0