Объявить переменную таблицы в процедуре Oracle

Вопрос: У меня есть чертовски время, пытаясь найти пример этого. У меня есть процедура, и в рамках этой процедуры я хочу сохранить результаты инструкции SELECT, чтобы я мог работать против этого набора, а затем использовать его в качестве ссылки для обновления исходных записей, когда все это делается. Трудность, с которой я сталкиваюсь, заключается в объявлении

Вопрос:

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

Трудность, с которой я сталкиваюсь, заключается в объявлении переменной временной таблицы. Вот пример того, что я пытаюсь сделать:

PROCEDURE my_procedure IS output_text clob; temp_table IS TABLE OF MY_TABLE%ROWTYPE; — Error on this line BEGIN SELECT * BULK COLLECT INTO temp_table FROM MY_TABLE WHERE SOME_DATE IS NULL; — Correlate results into the clob for sending to email (working) — Set the SOME_DATE value of the original record set where record is in temp_table

Я получаю ошибку во втором вхождении IS, говоря, что это неожиданный символ. Это говорит о том, что мое объявление переменной таблицы либо неверно, либо не в том месте. Я попытался поместить его в блок DECLARE после BEGIN, но я просто получил еще одну ошибку.

Куда должна идти эта декларация? В качестве альтернативы, если есть лучшее решение, я возьму это тоже!

Лучший ответ:CREATE OR REPLACE PROCEDURE PROCEDURE1 AS output_text clob; type temp_table_type IS TABLE OF MY_TABLE%ROWTYPE; temp_table temp_table_type; BEGIN SELECT * BULK COLLECT INTO temp_table FROM MY_TABLE; END PROCEDURE1;

или

CREATE OR REPLACE PROCEDURE PROCEDURE1 ( output_text OUT clob ) IS type temp_table_type IS TABLE OF MY_TABLE%ROWTYPE INDEX BY BINARY_INTEGER; temp_table temp_table_type; BEGIN SELECT * BULK COLLECT INTO temp_table FROM MY_TABLE; FOR indx IN 1 .. temp_table.COUNT LOOP something := temp_table(indx).col_name; END LOOP; END PROCEDURE1; Ответ №1

У меня была аналогичная проблема и нашла это: Выбор значений из Oracle Table Variable/Array?

Глобальная временная таблица может использоваться как обычная таблица, но ее содержимое является временным (удаляется в конце сеанса/транзакции), и каждый сеанс имеет собственный контент таблицы. Если вам не нужен динамический SQL, это может быть использовано в качестве хорошего решения:

CREATE GLOBAL TEMPORARY TABLE temp_table ( column1 NUMBER, column2 NUMBER ) ON COMMIT DELETE ROWS; PROCEDURE my_procedure IS output_text clob; BEGIN — Clear temporary table for this session (to be sure) DELETE FROM temp_table; — Insert data into temporary table (only for this session) INSERT INTO temp_table SELECT * FROM MY_TABLE WHERE SOME_DATE IS NULL; — … END;

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

Оцените статью
Добавить комментарий