Until 11g, you cannot declare a TYPE
in PLSQL
scope and use it in SQL
statement within a PLSQL block. You need to declare the TYPE
under the scope of SQL
, if you want to use it under PLSQL
block. Also when you wanted to use one collection in IN
clause, then MEMBER OF
can be used. See below:
Type Created in SQL Scope.
SQL> CREATE OR REPLACE TYPE HTYPE IS TABLE OF NUMBER NOT NULL ;
/
Type created.
Anonymous Block
SQL> DECLARE
2 ITEMS_V HTYPE;
3 REFERENCES_V HTYPE;
4 KEYID NUMBER;
5 BEGIN
6 KEYID := 1234567;
7
8 SELECT I.ITEM
9 BULK COLLECT INTO ITEMS_V
10 FROM ITEMS I
11 WHERE I.ITEM_ID = 1;
12
13 SELECT J.REFERENCE
14 BULK COLLECT INTO REFERENCES_V
15 FROM REFERENCES J
16 WHERE J.REFERENCE = 1
17 AND J.ITEM MEMBER OF ITEMS_V;--<--Used Member of to check elements of colection
18 END;
19 /
PL/SQL procedure successfully completed.
You can use use IN
clause as:
SQL> DECLARE
2 ITEMS_V HTYPE;
3 REFERENCES_V HTYPE;
4 KEYID NUMBER;
5 BEGIN
6 KEYID := 1234567;
7
8 SELECT I.ITEM
9 BULK COLLECT INTO ITEMS_V
10 FROM ITEMS I
11 WHERE I.ITEM_ID = 1;
12
13 SELECT J.REFERENCE
14 BULK COLLECT INTO REFERENCES_V
15 FROM REFERENCES J
16 WHERE J.REFERENCE = 1
17 AND J.ITEM IN (SELECT COLUMN_VALUE FROM TABLE(ITEMS_V)); --<-- Used IN Clause.
18 END;
19 /
PL/SQL procedure successfully completed.