Мне нужно скопировать данные из одной таблицы в другую с двумя условиями ниже
- имена таблиц будут известны во время выполнения
- записи необходимо копировать по одной за раз, поэтомучто изменения могут быть сделаны в значениях столбца, когда требуется
Я создал процедуру, чтобы сделать это с помощью динамического запроса.Поскольку список столбцов еще не известен, я не могу объявить переменную типа строки.Я видел пример DBMS_SQL, где вы можете определить столбцы для предложения select.Ниже приведен формат
DBMS_SQL.DEFINE_COLUMN(cursor_var,position,column_var);
Проблема здесь в том, что во всех примерах, которые я обнаружил, column_var уже было объявлено.Однако в моем случае я узнаю количество столбцов, которые будут в курсоре sql, и их тип данных во время выполнения.поэтому мне нужно найти способ передать тип данных "column_var" как часть DBMS_SQL.DEFINE_COLUMN.Есть способ сделать это?Есть ли лучший способ?
Ниже приведен пример кода
CREATE OR REPLACE PROCEDURE pr_test (P_TABLE_NAME IN VARCHAR2)
IS
V_SQL VARCHAR2(500);
SRC_CUR INT;
DEST_CUR INT;
TYPE COL_DTL_TYPE IS RECORD
(
COLUMN_ID INT,
COLUMN_NAME VARCHAR2(250),
DATA_TYPE VARCHAR2(250),
DATA_LENGTH INT
);
COL_DTL_REC COL_DTL_TYPE;
TYPE TBL_COL_LIST_TYPE IS TABLE OF COL_DTL_TYPE;
TBL_COL_LIST TBL_COL_LIST_TYPE;
V_CNT INT := 0;
BEGIN
V_SQL := 'SELECT * FROM ' || P_TABLE_NAME;
SRC_CUR := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(SRC_CUR,V_SQL,DBMS_SQL.NATIVE);
TBL_COL_LIST := TBL_COL_LIST_TYPE();
FOR COL_DTL_REC IN (
SELECT COLUMN_ID,COLUMN_NAME,DATA_TYPE,DATA_LENGTH
FROM ALL_TAB_COLUMNS WHERE TABLE_NAME =P_TABLE_NAME
)
LOOP
V_CNT := V_CNT + 1;
TBL_COL_LIST.EXTEND;
TBL_COL_LIST(V_CNT) := COL_DTL_REC;
-- Here is where I am stuck and not able to give column data type
DBMS_SQL.DEFINE_COLUMN(SRC_CUR,V_CNT,COL_DTL_REC.COLUMN_NAME COL_DTL_REC.DATA_TYPE , COL_DTL_REC.DATA_LENGTH)
END LOOP;
END;
, который будет скопирован в таблицу назначения.