如何在 Oracle SQL 的 IN 运算符中使用数组变量?

Abd*_*dul 6 oracle plsql

我宣布一个类型TYPE arr_type is TABLE of VARCHAR2(11 BYTE);,然后我初始化:MY_array arr_type := arr_type();

我在其中插入了一些 varchars,然后尝试将它与 IN 运算符一起使用。

set serveroutput on;
DECLARE
  TYPE arr_type is TABLE of VARCHAR2(11 BYTE);
  my_array arr_type := arr_type();
  my_array_two arr_type := arr_type();
BEGIN 

  SELECT MY_ID BULK COLLECT INTO my_array FROM XYZ_REQUEST;
  SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST WHERE PARENT_ID IN my_array;

   FOR i IN 1..cm_array.COUNT LOOP
     DBMS_OUTPUT.PUT_LINE(my_array(i));
   END LOOP; 
END; 
/
Run Code Online (Sandbox Code Playgroud)

我收到错误:local collection types not allowed in SQL statements在包含:的行上SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST WHERE PARENT_ID IN my_array;,但这没有意义,因为如果我注释掉该行,则my_array打印正常,这意味着TYPE arr_type is TABLE of VARCHAR2(11 BYTE);.

我怀疑这个问题是因为我试图将无界数组与 IN 运算符 ie 一起使用PARENT_ID IN my_array

我尝试将变量包装在括号内,但没有帮助。如何在数组中使用 IN 运算符?

我知道在这种情况下我可以使用子查询或连接,但我想知道是否可以使用带有 IN 运算符的数组。

Bal*_*app 10

WHERE PARENT_ID IN my_array;
Run Code Online (Sandbox Code Playgroud)

这是行不通的。首先,如错误消息所述,您不允许在 SQL 语句中使用本地集合类型,您需要在数据库中定义它们。其次,该语法不存在。

所以首先你定义类型:

CREATE TYPE arr_type is TABLE of VARCHAR2(11 BYTE);
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用具有以下TABLE()功能的集合:

set serveroutput on;
DECLARE
  my_array arr_type := arr_type();
  my_array_two arr_type := arr_type();
BEGIN 

  SELECT MY_ID BULK COLLECT INTO my_array FROM XYZ_REQUEST;
  SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST
  WHERE PARENT_ID IN (select * from table(my_array)); -- <==========================

   FOR i IN 1..cm_array.COUNT LOOP
     DBMS_OUTPUT.PUT_LINE(my_array(i));
   END LOOP; 
END; 
/
Run Code Online (Sandbox Code Playgroud)