如果集合類型是在模式級別聲明的,則可以在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