Переменное имя таблицы внутри выборки и типа строки вставки
Я открываю курсор и делаю выборочную сборку. Проблема возникает, когда я делаю 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...
Спасибо