【问题标题】:Error: PLS-00642: local collection types not allowed in SQL statements错误:PLS-00642:SQL 语句中不允许本地集合类型
【发布时间】:2019-07-16 05:43:48
【问题描述】:

我想从一个表中检索数据,该表在一个变量中有多个值,并且该变量上有 where 子句。

我的数据库版本是11.1

CREATE OR REPLACE PACKAGE BODY pr_retrieve_data as
PROCEDURE FETCH_MYTABLE_DETAILS() is

TYPE ACCNT_NUMBER_TYPE IS TABLE OF MYTABLE.MYCOLUMN%TYPE;
L_ACCNT_NUMBER ACCNT_NUMBER_TYPE;

L_ACCNT_NUMBER.EXTEND(3);
L_ACCNT_NUMBER(1) := 1;
L_ACCNT_NUMBER(2) := 2;
L_ACCNT_NUMBER(3) := 3;

FOR indx in (select column1,
                    column2
             from   SOMEOTHERTABLE SOT
             WHERE  SOT.ACCNT_NUMBER IN (SELECT * FROM TABLE(L_ACCNT_NUMBER))) --The code fails here with PLS-00642 error.
LOOP

...

END LOOP;

end FETCH_MYTABLE_DETAILS;
end pr_retrieve_data;

如何从SOMEOTHERTABLE 中获取具有多个值的变量以及该变量上的 where 子句的数据?

【问题讨论】:

    标签: sql oracle performance plsql cursor


    【解决方案1】:

    将类型创建为模式对象。但是,您不能从表 (AS TABLE OF MYTABLE.MYCOLUMN%TYPE) 继承数据类型:

    CREATE OR REPLACE TYPE ACCNT_NUMBER_TYPE AS TABLE OF NUMBER;
    

    注意,在较新的 Oracle 版本中,您也可以在 SQL 中使用本地集合类型。功能是在 12.1 版本中引入的。

    在您的特定情况下,您也可以使用

    ...
    WHERE SOT.ACCNT_NUMBER MEMBER OF L_ACCNT_NUMBER
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 2020-03-07
      • 2021-09-10
      相关资源
      最近更新 更多