2011-12-01 189 views
4

我有一個存儲過程正在執行兩步查詢。第一步是從表中收集的VARCHAR2類型的字符的列表,並將其收集到一個表變量,定義如下:可以在select語句where子句中使用表變量嗎?

TYPE t_cids IS TABLE OF VARCHAR2(50) INDEX BY PLS_INTEGER; 
v_cids t_cids; 

所以基本上我有:

SELECT item BULK COLLECT INTO v_cids FROM table_one; 

這工作正常了直到下一個位。

現在我想用該集合另一個查詢的WHERE子句中的相同的過程中,像這樣:

SELECT * FROM table_two WHERE cid IN v_cids; 

有沒有辦法做到這一點?我可以選擇一個單獨的元素,但我想使用表變量,就像使用常規表一樣。我嘗試過使用嵌套選擇的變體,但似乎也不起作用。

非常感謝,

扎克

回答

6

對於如何實現這一點,您有幾種選擇。

如果你想使用一個集合,那麼你可以使用TABLE函數從中進行選擇,但是你使用的集合的類型變得很重要。

爲一個簡單的例子,這將創建一個數據庫類型是數字表:

CREATE TYPE number_tab AS TABLE OF NUMBER 
/

創建的類型。

下一塊,然後填充的收集和使用它作爲一個表,並將其加入到EMP表(有一些輸出,所以你可以看到發生了什麼),從它執行一個基本的選擇:

DECLARE 
    -- Create a variable and initialise it 
    v_num_tab number_tab := number_tab(); 
    -- 
    -- This is a collection for showing the output 
    TYPE v_emp_tabtype IS TABLE OF emp%ROWTYPE 
     INDEX BY PLS_INTEGER; 
    v_emp_tab v_emp_tabtype; 
BEGIN 
    -- Populate the number_tab collection 
    v_num_tab.extend(2); 
    v_num_tab(1) := 7788; 
    v_num_tab(2) := 7902; 
    -- 
    -- Show output to prove it is populated 
    FOR i IN 1 .. v_num_tab.COUNT 
    LOOP 
     dbms_output.put_line(v_num_tab(i)); 
    END LOOP; 
    -- 
    -- Perform a select using the collection as a table 
    SELECT e.* 
    BULK COLLECT INTO v_emp_tab 
    FROM emp e 
    INNER JOIN TABLE(v_num_tab) nt 
     ON (e.empno = nt.column_value); 
    -- 
    -- Display the select output 
    FOR i IN 1 .. v_emp_tab.COUNT 
    LOOP 
     dbms_output.put_line(v_emp_tab(i).empno||' is a '||v_emp_tab(i).job); 
    END LOOP; 
END; 

您可以從中看到數據庫TYPE集合(number_tab)被視爲一個表,並可以像這樣使用。

另一種選擇是簡單地加入你選擇你的兩個表從你的例子:

SELECT tt.* 
    FROM table_two tt 
INNER JOIN table_one to 
    ON (to.item = tt.cid); 

有這樣做的其他方式,但第一可能滿足您的需求最好的。

希望這會有所幫助。

+0

啊。這工作完美。我將該變量作爲我的類型進行投射,然後加入,並且出現錯誤。更好的是直接加入表格的選項......我做了很多動態SQL,並且陷入了這個事情的流程中,並完全錯過了明顯的表現。非常感謝! – zmouser

+0

很高興幫助解決問題。 – Ollie

-1
--Doesn't work. 
--SELECT item BULK COLLECT AS 'mySelectedItems' INTO v_cids FROM table_one; 

SELECT table_two.* 
FROM table_two INNER JOIN v_cids 
ON table_two.paramname = v_cids.mySelectedItems; 

除非我誤解的問題,這應該只是返回的結果是在表變量。

注意:我從來沒有使用Oracle,但我想這種情況會是一樣的。

+0

感謝您的回答。我怎麼知道參數在表格變量中被命名?它是否默認爲選定的列名稱? – zmouser

+0

我相信它如您所說默認。我對此並不十分確定。即使沒有,你也可以在你的原始select語句中使用'AS'columnname''來明確地調用它。 - 我編輯了這個答案。 – Toast

+0

我試圖在select語句中產生相同的錯誤('不能從非嵌套表訪問行')的顯式強制轉換,然後嘗試添加'AS',就像你那樣,但是這會導致語法錯誤。 – zmouser

相關問題