【问题标题】:SQL expression is of wrong typeSQL 表达式类型错误
【发布时间】:2017-12-26 09:40:17
【问题描述】:

尝试在 SQL developer 上运行以下命令

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


    【解决方案1】:

    在 11g 之前,您不能在 PLSQL 范围内声明 TYPE 并在 PLSQL 块内的 SQL 语句中使用它。如果要在 PLSQL 块下使用它,则需要在 SQL 范围内声明 TYPE 。此外,当您想在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.
    

    【讨论】:

    • 谢谢@XING,这真的很有帮助!
    【解决方案2】:

    在查询的 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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多