如何在 SELECT INTO 语句中使用数字表

use*_*537 1 sql oracle plsql user-defined-types

我想将表 OS_CW.CW_FELDDATEN 属性的 PRIMITIVUMNUMMER (NOT NULL NUMBER(38)) 与本地数组 中的值进行比较v_list_pNummber。这是我到目前为止所拥有的:

DECLARE
    TYPE array_of_numbers IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
    v_list_parentID     array_of_numbers;
    v_list_pNummer      array_of_numbers;
BEGIN
    SELECT DBUID BULK COLLECT INTO v_list_parentID 
    FROM OS_SYS.V_CATALOG 
    WHERE PARENTID = 1;

    SELECT PRIMITIVUMNUMMER BULK COLLECT INTO v_list_pNummer 
    FROM OS_CW.CW_FELDDATEN 
    WHERE KATALOG IN (v_list_parentID);
END;
Run Code Online (Sandbox Code Playgroud)

运行上面的代码时,我收到此错误:

错误报告 -
ORA-06550: 第 28 行,第 104 列:
PLS-00382: 表达式类型错误
06550.00000 - “行 %s,列 %s:\n%s”
*原因:通常是 PL/SQL 编译错误。
*行动:

如何将列(数字)与表 NUMBER INDEX BY BINARY_INTEGER 进行比较?

谢谢!

APC*_*APC 5

SQL 不能使用本地 PL/SQL 范围中声明的类型。您需要在 SQL (*)中定义它:

SQL> create TYPE array_of_numbers IS TABLE OF NUMBER ;
  2  /

Type created.

SQL> 
Run Code Online (Sandbox Code Playgroud)

然后使用 TABLE() 运算符将第一个集合转换为可以使用 IN 运算符引用的子查询:

SQL> set serveroutput on
SQL> declare
  2      v_list_parentID array_of_numbers;
  3      v_list_pNummer array_of_numbers;
  4  begin
  5      select dbuid bulk collect into v_list_parentID
  6          from v_catalog
  7          where parentid = 1;
  8      dbms_output.put_line('v_list_parentID count = ' || v_list_parentID.count());
  9
 10      select primitivumnummer bulk collect into v_list_pNummer
 11          from cw_felddaten
 12          where katalog in (select * from table( v_list_parentID));
 13
 14      dbms_output.put_line('v_list_pNummer count = ' || v_list_pNummer.count());
 15  end;
 16  /
v_list_parentID count = 4
v_list_pNummer count = 24

PL/SQL procedure successfully completed.

SQL> 
Run Code Online (Sandbox Code Playgroud)

MEMBER OF 语法也有效。它的输入量较少,但如果 CW_FELDDATEN 有很多行,则执行效果可能不如 TABLE() 运算符。

SQL> declare
  2      v_list_parentID array_of_numbers;
  3      v_list_pNummer array_of_numbers;
  4  begin
  5      select dbuid bulk collect into v_list_parentID
  6          from v_catalog
  7          where parent_id = 1;
  8      dbms_output.put_line('v_list_parentID count = ' || v_list_parentID.count());
  9
 10      select primitivumnummer bulk collect into v_list_pnummer
 11          from cw_felddaten
 12          where katalog member of v_list_parentID;
 13
 14      dbms_output.put_line('v_list_pNummer count = ' || v_list_pNummer.count());
 15  end;
 16  /
v_list_parentID count = 4
v_list_pNummer count = 24

PL/SQL procedure successfully completed.

SQL> 
Run Code Online (Sandbox Code Playgroud)

(*)在 12c 中,我们可以使用 SQL 中的包规范中声明的类型。