2010-07-08 58 views
2

如何將3或4個不同的值附加(插入)到oracle類型,然後再爲遊標打開它。如何將值附加到oracle類型

例如(僞):

insert into mytype select 1 from dual; 
insert into mytype select 3 from dual; 
insert into mytype select 5 from dual; 

open cursor_1 for select * from table(mytype); 

這是可能在PL/SQL辦?

我知道這很簡單,可以組合成一個查詢,但我真正的需要是有不同的查詢,並將結果附加到mytype。

回答

5

假設你的意思是你有一個自定義的SQL類型(可能是一個嵌套的表類型)和一個這種類型的PL/SQL變量:我不相信你可以INSERT進去,我認爲你可以SELECT可以附加到集合中。

您可以選擇一個標量變量,然後將其附加到程序集合中。

SQL> create type mytype as table of integer; 
    2/

Type created. 

SQL> set serveroutput on 
SQL> l 
    1 declare 
    2 mytable mytype := mytype(); 
    3 cursor_1 sys_refcursor; 
    4 x integer; 
    5 procedure append_to_table(t IN OUT mytype, y IN INTEGER) 
    6  is 
    7  begin 
    8  t.extend(); 
    9  t(t.COUNT) := y; 
10  end append_to_table; 
11 begin 
12 select 1 into x from dual; 
13 append_to_table(mytable, x); 
14 select 3 into x from dual; 
15 append_to_table(mytable, x); 
16 select 5 into x from dual; 
17 append_to_table(mytable, x); 
18 open cursor_1 for select * from table(cast(mytable as mytype)); 
19 fetch cursor_1 into x; 
20 dbms_output.put_line(x); 
21 fetch cursor_1 into x; 
22 dbms_output.put_line(x); 
23 fetch cursor_1 into x; 
24 dbms_output.put_line(x); 
25 close cursor_1; 
26* end; 
SQL>/
1 
3 
5 

PL/SQL procedure successfully completed. 
4

自10g以來,操作PL/SQL集合變得容易很多,它給了我們一些我們可以使用的SET操作符。

如你所知,聘請TABLE()函數意味着我們必須使用一個SQL類型...

SQL> create or replace type nums_nt as table of number 
    2/

Type created. 

SQL> 

以下塊填充一些數字的集合,它使用一個FOR循環。然後它執行另一個查詢來填充第二個集合。第二個集合使用MULTISET UNION語法添加到第一個集合中。與SQL UNION運算符不同,此實現不會重複出現(我們可以使用MULTISET UNION DISTINCT)。代碼通過再次循環第一個集合完成,證明它包含兩組數字。

SQL> set serveroutput on 
SQL> 
SQL> declare 
    2  master_nos nums_nt; 
    3  fresh_nos nums_nt; 
    4 begin 
    5 
    6  dbms_output.put_line ('get some numbers, print some names'); 
    7 
    8  select id 
    9  bulk collect into master_nos 
10  from t23 
11  where name not in (select upper(name) from t_doctors) 
12  and name not in (select upper(name) from t_kids); 
13 
14  for r in (select t23.name 
15     from t23 
16      join (select * from table(master_nos)) sq 
17        on t23.id = sq.column_value 
18    ) 
19  loop 
20   dbms_output.put_line (r.name); 
21  end loop; 
22 
23  dbms_output.put_line ('get more numbers, print all names'); 
24 
25  select id 
26  bulk collect into fresh_nos 
27  from t23 
28  where name in (select upper(name) from t_doctors); 
29 
30  master_nos := master_nos 
31      MULTISET UNION 
32     fresh_nos; 
33 
34  for r in (select t23.name 
35     from t23 
36      join (select * from table(master_nos)) sq 
37        on t23.id = sq.column_value 
38    ) 
39  loop 
40   dbms_output.put_line (r.name); 
41  end loop; 
42 
43 end; 
44/
get some numbers, print some names 
CAT 
PINNER BLINN 
LORAX 
MR KNOX 
FOX IN SOCKS 
get more numbers, print all names 
CAT 
PINNER BLINN 
LORAX 
MR KNOX 
FOX IN SOCKS 
DR SINATRA 
DR FONZ 

PL/SQL procedure successfully completed. 

SQL>