Вставьте и выберите из таблицы / массива в оракуле - PullRequest
2 голосов
/ 27 августа 2010

У меня довольно большой оператор SQL, который возвращает список идентификаторов.Мне нужен этот список в качестве базы для других заявлений.Например:

open crs_result1 for ' select * from ... where id in ( select <ids> from <base_statement> ) ';
open crs_result2 for ' select * from ... where id in ( select <ids> from <base_statement> ) ';
open crs_result3 for ' select * from ... where id in ( select <ids> from <base_statement> ) ';
...

Конечно, я не хочу каждый раз выбирать весь список идентификаторов для разных вариантов выбора.

Итак, моя идея заключалась в том, чтобы использовать таблицу / массив:

TYPE gt_result_rec IS RECORD
(
    id NUMBER
);
TYPE gt_result_tab IS TABLE OF gt_result_rec INDEX BY BINARY_INTEGER;

t_results gt_result_tab;

execute immediate 'insert into t_results select <ids> from <base_statement>';

И затем используйте его для всех других утверждений:

open crs_result1 for ' select * from ... where id in ( select id from t_results ) ';
...

Но это на самом деле не работает.

Кто-нибудь знает проблему ИЛИлучшее решение для этого?

1 Ответ

2 голосов
/ 27 августа 2010

Подобного можно добиться с помощью таблиц TEMPORARY, например:

create global temporary table temp_ids(id number) on commit preserve rows ;

... чем вставить данные:

execute immediate 'insert into temp_ids(id) select id from <big statement>';
execute immediate 'insert into temp_ids(id) select id from <other big statement>';
execute immediate 'insert into temp_ids(id) select id from <other big statement>';

.. наконец, вы можете использовать свою идею:

open crs_result1 for ' select * from ... where id in ( select id from temp_ids ) ';

Использование TEPORARY TABLES достигает того, что EXECUTE IMMEDIATE будет принимать данные из того же контекста, в котором выполняется ваш другой код PL / SQL.

Если вы хотите использовать TABLE OF RECORDS (таблица / массив), вам нужно объявить этот массив в ПАКЕТЕ (заголовок, а не BODY!), Поэтому поле будет видно из контекста EXECUTE IMMEDIATE,Массив должен быть общедоступным.

...