PL / SQL - 如何在IN子句中使用数组

时间:2013-09-24 18:26:01

标签: oracle plsql

我正在尝试将一个输入值数组用于IN子句中的过程,作为游标的where子句的一部分。我知道之前已经问过,但我还没有看到如何正确编译语法。

在包规范中,类型为

TYPE t_brth_dt IS TABLE OF sourceTable.stdt_brth_dt%TYPE INDEX BY PLS_INTEGER;

sourceTable.std_brth_dt是表格中的日期列。

我的光标的简化版本在包体中是 -

 cursor DataCursor_Sort( p_brth_dt in t_brth_dt) is
    SELECT *
      FROM sourceTable 
     WHERE a.brth_dt IN (select column_value 
                           from table(p_brth_dt))

当我尝试编译时,我遇到以下错误。

  
      
  • [1] :(错误):PLS-00382:表达式类型错误
  •   
  • [2] :(错误):PL / SQL:ORA-22905:无法访问非嵌套表项中的行
  •   

我知道这看起来与其他问题类似,但我不明白语法错误是什么。

3 个答案:

答案 0 :(得分:4)

为了在查询的from子句中使用定义为嵌套表或关联数组的集合,您应该正如@Alex Poole正确指出的那样,创建模式级别(SQL)类型或使用一个,当您打算使用日期列表时,您可以使用ODCIConst包 - odcidatelist。例如,您的游标定义可能如下所示:

cursor DataCursor_Sort(p_brth_dt in sys.odcidatelist) is
  select *
    from sourceTable 
   where a.brth_dt IN (select column_value 
                         from table(p_brth_dt))

OR

cursor DataCursor_Sort(p_brth_dt in sys.odcidatelist) is
  select s.*
    from sourceTable      s
    join table(p_brth_dt) t
      on (s.brth_dt = t.column_value)

注意:在执行日期比较时,您应该考虑日期的时间部分。如果你只想比较日期部分,那么使用trunc()函数去除时间部分可能会有用。

答案 1 :(得分:2)

可以在{{1}中使用PL / SQL定义的嵌套表类型(而不是SQL定义的嵌套表类型) 间接 PL / SQL包中IN语句的子句。您必须使用SELECT函数作为中介。写作感觉有点聪明,但我不相信它的基本用处。

PIPELINED

答案 2 :(得分:1)

必须在SQL级别创建类型,而不是在包中创建。 SQL查询不知道如何使用PL / SQL中定义的任何类型。所以你必须这样做:

CREATE OR REPLACE TYPE t_brth_dt IS TABLE OF date;
/

...并从包规范中删除该类型。 (或至少给它们不同的名称,它们在使用时不会互换)。因为它处于SQL级别,所以不幸的是,你也无法在声明中使用sourceTable.stdt_brth_dt%TYPE