Резюме
Точно так же, как мой вопрос утверждает, мне любопытно узнать, как я могу определить запись, чтобы я мог хранить значения, полученные с помощью динамического SQL. У меня есть таблица, которая хранит SQL в столбцах CLOB. Целью END будет вызов функции PIPELINED с использованием query_id запроса, который должен быть запущен. На данный момент моя проблема не в том, как определить ТИП, чтобы я мог ТРУБОПРОВОДИТЬ данные. Я не могу определить функцию PIPELINED из-за того, что при объявлении функции PIPELINED ей требуется тип. В моем случае ТИП изменится в зависимости от желаемого запроса, содержащегося в таблице запросов.
Что я пробовал
Я прочитал об использовании DBMS_SQL и вижу, что есть особенность DBMS_SQL, которая DBMS_SQL.DEFINE_COLUMN
, однако она требует, чтобы я явно определил столбцы - если я что-то здесь не упустил. Опять же ... я не знаю типы столбцов, возвращаемые из динамического sql ... они могут быть любыми и в любом порядке.
Пример моей проблемы
Приведенный ниже код является простейшим примером моей проблемы. ЗАПИСЬ, которую я хочу заполнить в приведенном ниже примере кода: rec_cursor_query
. Во всех других не динамических SQL это будет определяться на основе таблицы или явно определены с использованием имен столбцов и ключевого слова% TYPE. Can't use this: rec_cursor_query employees%ROWTYPE;
.
DECLARE
/* Cursor Pointer */
cur_Query SYS_REFCURSOR;
/* Store Dynamic SQL */
q VARCHAR2(2000);
/* Declare Record based on Dynamic SQL */
--rec_cursor_query ????table%ROWTYPE; /* I realize I can't do this... but what can I do? */
BEGIN
/* Fake Query Below saved into q */
q := q'~SELECT 1001 AS pkey, 'Jake' AS firstname, 'Johnson' AS lastname FROM dual~';
/* Output Query just to show query was saved */
dbms_output.put_line(q);
OPEN cur_Query FOR
q;
LOOP
FETCH cur_Query INTO rec_cursor_query; /* Again here... I can't do this due to it not being Defined */
EXIT WHEN cur_Query%NOTFOUND;
END LOOP;
CLOSE cur_Query;
END
;