2011-03-08 106 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