एसक्यूएल स्थानीय पीएल/एसक्यूएल दायरे में घोषित प्रकारों का उपयोग नहीं कर सकता है। आपको इसे SQL (*) . में परिभाषित करने की आवश्यकता है :
SQL> create TYPE array_of_numbers IS TABLE OF NUMBER ;
2 /
Type created.
SQL>
फिर पहले संग्रह को एक उप-क्वेरी में बदलने के लिए TABLE() ऑपरेटर का उपयोग करें जिसे आप IN ऑपरेटर के साथ संदर्भित कर सकते हैं:
SQL> set serveroutput on
SQL> declare
2 v_list_parentID array_of_numbers;
3 v_list_pNummer array_of_numbers;
4 begin
5 select dbuid bulk collect into v_list_parentID
6 from v_catalog
7 where parentid = 1;
8 dbms_output.put_line('v_list_parentID count = ' || v_list_parentID.count());
9
10 select primitivumnummer bulk collect into v_list_pNummer
11 from cw_felddaten
12 where katalog in (select * from table( v_list_parentID));
13
14 dbms_output.put_line('v_list_pNummer count = ' || v_list_pNummer.count());
15 end;
16 /
v_list_parentID count = 4
v_list_pNummer count = 24
PL/SQL procedure successfully completed.
SQL>
सिंटैक्स का सदस्य भी काम करता है। यदि CW_FELDDATEN में बहुत सारी पंक्तियाँ हैं, तो यह कम टाइपिंग है, लेकिन TABLE() ऑपरेटर जितना अच्छा प्रदर्शन नहीं कर सकता है।
SQL> declare
2 v_list_parentID array_of_numbers;
3 v_list_pNummer array_of_numbers;
4 begin
5 select dbuid bulk collect into v_list_parentID
6 from v_catalog
7 where parent_id = 1;
8 dbms_output.put_line('v_list_parentID count = ' || v_list_parentID.count());
9
10 select primitivumnummer bulk collect into v_list_pnummer
11 from cw_felddaten
12 where katalog member of v_list_parentID;
13
14 dbms_output.put_line('v_list_pNummer count = ' || v_list_pNummer.count());
15 end;
16 /
v_list_parentID count = 4
v_list_pNummer count = 24
PL/SQL procedure successfully completed.
SQL>
(*) 12c में हम SQL में पैकेज स्पेक में घोषित प्रकारों का उपयोग कर सकते हैं।