SQL表达式类型错误

问题描述 投票:-1回答:2

尝试在SQL开发人员上运行以下命令

declare
    type hType is table of number not null
        index by BINARY_INTEGER;
    items_v hType;
    references_v hType;
    keyId number;

begin   
    keyId := 1234567;

    select i.item bulk collect into items_v
    from items i
    where i.item_id = ...;

    select j.reference bulk collect into references_v
    from references j
    where j.reference = ..
        and j.item in items_v;
end;

我得到ORA-06550:第23行,第31栏:PLS-00382:表达式类型错误

即使j.itemi.item也是NUMBER类型;

sql plsql oracle-sqldeveloper plsqldeveloper
2个回答
1
投票

直到11g,你不能在TYPE范围内声明PLSQL并在PLSQL块中的SQL语句中使用它。如果你想在TYPE块下使用它,你需要在SQL的范围内声明PLSQL。此外,当您想在IN子句中使用一个集合时,可以使用MEMBER OF。见下文:

在SQL范围中创建的类型。

SQL> CREATE OR REPLACE TYPE HTYPE IS TABLE OF NUMBER NOT NULL ;
        /

Type created.

匿名阻止

SQL> DECLARE   
  2       ITEMS_V                       HTYPE;
  3       REFERENCES_V                  HTYPE;
  4       KEYID                         NUMBER;
  5  BEGIN
  6       KEYID := 1234567;
  7  
  8       SELECT I.ITEM
  9       BULK COLLECT INTO ITEMS_V
 10         FROM ITEMS I
 11        WHERE I.ITEM_ID = 1;
 12  
 13       SELECT J.REFERENCE
 14       BULK COLLECT INTO REFERENCES_V
 15         FROM REFERENCES J
 16        WHERE J.REFERENCE = 1
 17        AND J.ITEM MEMBER OF ITEMS_V;--<--Used Member of to check elements of colection
 18  END;
 19  /

PL/SQL procedure successfully completed.

您可以使用IN子句作为:

SQL> DECLARE   
  2       ITEMS_V                       HTYPE;
  3       REFERENCES_V                  HTYPE;
  4       KEYID                         NUMBER;
  5  BEGIN
  6       KEYID := 1234567;
  7  
  8       SELECT I.ITEM
  9       BULK COLLECT INTO ITEMS_V
 10         FROM ITEMS I
 11        WHERE I.ITEM_ID = 1;
 12  
 13       SELECT J.REFERENCE
 14       BULK COLLECT INTO REFERENCES_V
 15         FROM REFERENCES J
 16        WHERE J.REFERENCE = 1
 17        AND J.ITEM IN (SELECT COLUMN_VALUE FROM TABLE(ITEMS_V)); --<-- Used IN Clause.
 18  END;
 19  /

PL/SQL procedure successfully completed.

0
投票

在查询的REFERENCES部分,您不能像这样使用ITEMS_V集合;考虑使用这样的东西:

for i in items_v.first .. items_v.last loop
  select j.reference bulk collect into references_v
    from references j
    where j.reference = ..
        and j.item_id = items_v(i);
end loop;

可能有一种更聪明的方法(希望,其他人会告诉你如何),但这也应该有效。

© www.soinside.com 2019 - 2024. All rights reserved.