gpt4 book ai didi

在 where 子句中的 Oracle 集合

转载 作者:行者123 更新时间:2023-12-04 05:53:03 26 4
gpt4 key购买 nike

我在 oracle 代码块中使用集合,因为没有表变量(如在 MS SQL Server 中)。

DECLARE
TYPE I_NAME IS TABLE OF NVARCHAR2(512);
I_ITEMNAME I_NAME := I_NAME();
BEGIN

我正在使用“BULK COLLECT INTO I_ITEMNAME”来填充收藏。
我想在 SELECT 查询的 WHERE 子句中使用此集合,但找不到执行此操作的方法。目前我正在使用 FOR 循环并一项一项地获取项目。
我如何在 WHERE 子句中直接使用集合,例如

SELECT * FROM TBL WHERE COL IN I_ITEMNAME?



谢谢,

最佳答案

您不能在 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 在评论中提到的,你也可以这样做:
...
select count(*) into c
from all_tables
where owner member of (i_itemname);
...

...只要 i_name以及您要与 are the same type 进行比较的列.在我的示例中,它找到零行,因为我正在尝试比较 nvarchar2varchar2 , 但如果重新定义 i_name 会找到匹配项如 varchar2(512) .在你的情况下大概 tab.colnvarchar2反正。

关于在 where 子句中的 Oracle 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16185277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com