предоставить тип данных столбца в DBSMS_SQL.DEFINE_COLUMN oracle 12C - PullRequest
0 голосов
/ 29 сентября 2018

Мне нужно скопировать данные из одной таблицы в другую с двумя условиями ниже

  1. имена таблиц будут известны во время выполнения
  2. записи необходимо копировать по одной за раз, поэтомучто изменения могут быть сделаны в значениях столбца, когда требуется

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

, который будет скопирован в таблицу назначения.

...