Du kan ikke bruge en lokalt erklæret samling i en SQL-sætning:
declare
type i_name is table of nvarchar2(512);
i_itemname i_name := i_name();
c number;
begin
select distinct owner bulk collect into i_itemname from all_objects;
dbms_output.put_line(i_itemname.count);
select count(*) into c
from all_tables
where owner in (select * from table(i_itemname));
dbms_output.put_line(c);
end;
/
where owner in (select * from table(i_itemname));
*
ERROR at line 10:
ORA-06550: line 10, column 41:
PLS-00642: local collection types not allowed in SQL statements
ORA-06550: line 10, column 35:
PL/SQL: ORA-22905: cannot access rows from a non-nested table item
ORA-06550: line 8, column 5:
PL/SQL: SQL Statement ignored
Men det kan du, hvis det er erklæret på skemaniveau, i det væsentlige så SQL kender til typen, ikke kun PL/SQL:
create type i_name is table of nvarchar2(512);
/
Type created.
declare
i_itemname i_name := i_name();
c number;
begin
select distinct owner bulk collect into i_itemname from all_objects;
dbms_output.put_line(i_itemname.count);
select count(*) into c from all_tables
where owner in (select * from table(i_itemname));
dbms_output.put_line(c);
end;
/
No errors.
18
128
PL/SQL procedure successfully completed.
Du kan også deltage i table
konstruer i stedet for at bruge en underforespørgsel:
...
select count(*) into c
from table(i_itemname) t
join all_tables at on at.owner = t.column_value;
...
Jeg er dog ikke helt klar over, hvad du er dong. (Hvis du ikke bruger samlingen til noget andet, ville du være bedre stillet blot at slutte dig til de rå data, men jeg går ud fra, at samlingen er der af en grund).
Som @haki nævnte i kommentarerne, kan du også gøre:
...
select count(*) into c
from all_tables
where owner member of (i_itemname);
...
... så længe i_name
og kolonnen, du sammenligner med er den samme type
. I mit eksempel finder den nul rækker, fordi jeg forsøger at sammenligne nvarchar2
med varchar2
, men ville finde et match, hvis i_name
blev omdefineret som varchar2(512)
. I dit tilfælde formentlig tab.col
er nvarchar2
alligevel.