Вопрос

Вот упрощенная версия псевдокода, которую я хотел бы делать в 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.) Конвейерные функции. В основном функция возвращает данные, которые выглядят как таблица.

Эта ссылка обобщает параметры и содержит несколько списков кодов, объясняющих их.

http://www.databasejournal.com/features/oracle/article.php/3352091/CASTing-About-For-a-Solution-Using-CAST-and-Table-Functions -в-PLSQL.htm

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top