如果集合类型是在模式级别声明的,则可以在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;
/
嗯...似乎没有工作。给我一个表达是错误的类型错误。 – jlrolin 2011-03-08 16:20:44
我添加了一个更完整的示例,可以为我成功运行。它看起来像“表达是错误的类型”通常意味着你正试图将对象分配给非对象变量,反之亦然。如果你仍然有麻烦,也许你应该发布一个小代码示例,显示你的具体问题。 – 2011-03-08 16:38:27
是的,我的SQL Developer安装有些奇怪。即使我删除了代码,我也会收到此错误。 – jlrolin 2011-03-08 16:38:31