您不能在 SQL 子句中使用本地声明的集合:
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
但如果它是在模式级别声明的,则可以,本质上是让 SQL 知道类型,而不仅仅是 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.
您也可以加入table 构造而不是使用子查询:
...
select count(*) into c
from table(i_itemname) t
join all_tables at on at.owner = t.column_value;
...
我不太清楚你是什么东东。 (如果您没有将集合用于其他任何用途,最好只加入原始数据,但我认为集合的存在是有原因的)。
正如@haki 在 cmets 中提到的,你也可以这样做:
...
select count(*) into c
from all_tables
where owner member of (i_itemname);
...
...只要i_name 和您要与are the same type 比较的列。在我的示例中,它找到了零行,因为我试图将nvarchar2 与varchar2 进行比较,但如果将i_name 重新定义为varchar2(512),则会找到匹配项。在你的情况下,大概tab.col 是nvarchar2 反正。