2011-03-08 53 views
5

是否可以创建从现有集合中抽取的动态SQL语句?ORACLE PL/SQL:使用集合动态SQL选择

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

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

回答

6

如果集合类型是在模式级别声明的,则可以在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; 
/
+0

嗯...似乎没有工作。给我一个表达是错误的类型错误。 – jlrolin 2011-03-08 16:20:44

+0

我添加了一个更完整的示例,可以为我成功运行。它看起来像“表达是错误的类型”通常意味着你正试图将对象分配给非对象变量,反之亦然。如果你仍然有麻烦,也许你应该发布一个小代码示例,显示你的具体问题。 – 2011-03-08 16:38:27

+0

是的,我的SQL Developer安装有些奇怪。即使我删除了代码,我也会收到此错误。 – jlrolin 2011-03-08 16:38:31