ORACLE PL / SQL: динамический выбор SQL с использованием коллекции - PullRequest
5 голосов
/ 08 марта 2011

Можно ли создать динамический оператор SQL, который извлекает из существующей коллекции?

l_collection := pack.get_items(
                i_code => get_items_list.i_code ,
                i_name => get_items_list.i_name );

Теперь, допустим, я хочу выбрать COUNT из этой коллекции, используя динамический SQL. Это возможно? Кроме того, я хочу сделать дополнительный выбор из этой коллекции.

1 Ответ

6 голосов
/ 08 марта 2011

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

EXECUTE IMMEDIATE
  'SELECT COUNT(*) FROM TABLE(CAST(:collection AS collection_type))'
   INTO l_count
   USING l_collection
  ;

Я не уверен, есть ли другая причина, по которой вы хотите использовать динамический SQL,или если вы просто предполагаете, что это необходимо в этом случае.Это не должно быть необходимо, если все, что вы хотите сделать, это выбрать количество.Этот встроенный SQL должен работать нормально:

SELECT COUNT(*) INTO l_count FROM TABLE(CAST(l_collection AS collection_type));

Конечно, если это все, что вам нужно, SQL вообще не нужен, просто l_count := l_collection.COUNT.

Редактироватьдобавление полностью проработанного примера

CREATE OR REPLACE TYPE testtype AS OBJECT( x NUMBER, y NUMBER);
/

CREATE OR REPLACE TYPE testtypetab AS TABLE OF testtype;
/

DECLARE
  t  testtypetab := testtypetab();
  l_count integer;
BEGIN
  -- Populate the collection with some data
  SELECT testtype(LEVEL, LEVEL) BULK COLLECT INTO t FROM dual CONNECT BY LEVEL<21;

  -- Show that we can query it using inline SQL
  SELECT count(*) INTO l_count FROM TABLE(CAST(t AS testtypetab));
  dbms_output.put_line( l_count );

  -- Clear the collection
  t.DELETE;

  -- Show that we can query it using dynamic SQL
  EXECUTE IMMEDIATE 'select count(*) from table(cast(:collection as testtypetab))'
    into l_count using t;
  dbms_output.put_line( l_count );
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...