繁体   English   中英

ORACLE PL / SQL:使用集合进行动态SQL选择

[英]ORACLE PL/SQL: Dynamic SQL Select using a Collection

是否可以创建从现有集合中提取的动态SQL语句?

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

现在,假设我要使用动态SQL从该集合中选择一个COUNT。 那可能吗? 此外,我也想从该集合中进行子选择。

如果集合类型是在模式级别声明的,则可以在SQL语句(包括动态语句)中使用它。 您需要将其显式转换为适当的集合类型,否则SQL引擎不知道它是什么类型。

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

我不确定是否还有其他原因要使用动态SQL,或者只是假设在这种情况下有必要使用动态SQL。 如果您只想选择计数,就没有必要了。 此内联SQL应该可以正常工作:

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

当然,如果仅此l_count := l_collection.COUNT ,则根本不需要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;
/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM