我正在尝试将一个输入值数组用于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:无法访问非嵌套表项中的行
我知道这看起来与其他问题类似,但我不明白语法错误是什么。
答案 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
。