Массивы в Oracle SQL
Вопрос
Вот упрощенная версия псевдокода, которую я хотел бы делать в PL-SQL (Oracle):
DECLARE
mylist as ARRAY
BEGIN
mylist (1) := '1'
mylist (2) := '3'
...
SELECT *
FROM aTable
WHERE aKey IN mylist;
END;
SELECT должен возвращать совпадающие записи для mylist (1), mylist (2) и т. д. Он должен быть похож на ORing для всех значений, но, конечно, мы заранее не знаем, сколько значений мы получаем. р>
Как мне этого добиться? Я знаю, что PL / SQL имеет некоторые типы данных коллекций, но я не могу заставить их работать должным образом в инструкциях SQL.
Спасибо за любые идеи.
Решение
Это легко сделать с помощью функции TABLE ()
. Единственный улов заключается в том, что переменная массива должна использовать тип, объявленный в SQL. Это связано с тем, что SELECT
использует механизм SQL, поэтому объявления PL / SQL находятся вне области видимости.
SQL> create or replace type numbers_nt as table of number
2 /
Type created.
SQL>
SQL> declare
2 l_array numbers_nt;
3 begin
4 l_array := numbers_nt (7521,7566,7654);
5 for r in ( select ename
6 from emp
7 where empno in ( select *
8 from table (l_array)
9 )
10 )
11 loop
12 dbms_output.put_line ( 'employee name = '||r.ename);
13 end loop;
14 end;
15 /
employee name = PADFIELD
employee name = ROBERTSON
employee name = BILLINGTON
PL/SQL procedure successfully completed.
SQL>
Другие советы
Несколько предложений:
1.) Есть ключевое слово CAST SQL, которое вы можете сделать, чтобы выполнить эту работу ... оно делает вашу коллекцию обработанной, как если бы она была таблицей.
2.) Конвейерные функции. В основном функция возвращает данные, которые выглядят как таблица.
Эта ссылка обобщает параметры и содержит несколько списков кодов, объясняющих их.