尝试在SQL开发人员上运行以下命令
declare
type hType is table of number not null
index by BINARY_INTEGER;
items_v hType;
references_v hType;
keyId number;
begin
keyId := 1234567;
select i.item bulk collect into items_v
from items i
where i.item_id = ...;
select j.reference bulk collect into references_v
from references j
where j.reference = ..
and j.item in items_v;
end;
我得到ORA-06550:第23行,第31栏:PLS-00382:表达式类型错误
即使j.item
和i.item
也是NUMBER
类型;
直到11g,你不能在TYPE
范围内声明PLSQL
并在PLSQL块中的SQL
语句中使用它。如果你想在TYPE
块下使用它,你需要在SQL
的范围内声明PLSQL
。此外,当您想在IN
子句中使用一个集合时,可以使用MEMBER OF
。见下文:
在SQL范围中创建的类型。
SQL> CREATE OR REPLACE TYPE HTYPE IS TABLE OF NUMBER NOT NULL ;
/
Type created.
匿名阻止
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.
您可以使用IN
子句作为:
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.
在查询的REFERENCES部分,您不能像这样使用ITEMS_V集合;考虑使用这样的东西:
for i in items_v.first .. items_v.last loop
select j.reference bulk collect into references_v
from references j
where j.reference = ..
and j.item_id = items_v(i);
end loop;
可能有一种更聪明的方法(希望,其他人会告诉你如何),但这也应该有效。