2013-01-07 109 views
1

我在oracle數據庫中使用plsql 9i 我有一個存儲過程, 使用一個名爲numbers的「number of table」的in參數。 我現在想要從列表中選擇所有行,列名爲:ID等於「數字」內的數字 就像我能做的那樣select * from table name where Id in (!,!,!,...) 感謝您的幫助。在一個過程中使用plsql表

更新: 只是爲了清理, 我有一個用戶定義的類型命名號碼, 號碼定義:數字表。 所以在程序decleration我有 「P_array在數字」 我需要select * from a table where Id is found in p_array

回答

0
SELECT * FROM A_TABLE WHERE ID IN (SELECT SAVED_NUMBERs FROM TABLE_NUMBER); 

你的意思呢?

+0

我試過「SELECT * FROM atable其中Id的(選擇數saved_numbers)。我得到ORA 04044錯誤 – user1333057

+0

從頭開始,我嘗試 「SELECT * FROM表名其中id中(從myArrayName選擇saved_numbers)」。我得到了一個00942 ora錯誤 – user1333057

+0

等等,所以你有一個包含所有數字的數組?如果是這種情況,請嘗試:SELECT * FROM WHERE ID IN ; –

1

嘗試以下操作: -

select * from tableName where id in (select c.column_value from table(cast(p_array as numbers)) c); 

其中數字是編號爲

+0

這個編譯,但我得到一個ora 22905當exceling的 – user1333057

+0

編輯我的代碼... – Max

2

這樣的表?

SQL> create type numbers as table of number; 
    2/

Type created. 

SQL> create table foo (id number) ; 

Table created. 

SQL> insert into foo select rownum from dual connect by level <= 10; 

10 rows created. 

SQL> select * from foo; 

     ID 
---------- 
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
     10 

10 rows selected. 

SQL> create procedure testnum(p_num in numbers) 
    2 is 
    3 begin 
    4 for r_row in (select id 
    5     from foo f 
    6     where f.id in (select /*+ cardinality(t, 10) */ column_value 
    7         from table(p_num) t)) 
    8 loop 
    9  dbms_output.put_line(r_row.id); 
10 end loop; 
11 end; 
12/

Procedure created. 

SQL> set serverout on 
SQL> exec testnum(numbers(2, 6, 9)); 
2 
6 
9 

基數提示用於告訴oracle大致有多少元素在你的表中。沒有它,Oracle會假設〜8k行,這可能太高,並導致計劃中的不必要的全面掃描。

如果您願意,也可以直接加入。

for r_row in (select /*+ cardinality(t, 10) */ f.id 
       from foo f 
        inner join table(p_num) t 
          on t.column_value = f.id)