我已经设置了一个 Oracle 包,其过程类似于下面的代码。我必须首先设置几个全局变量:
CREATE
OR REPLACE type cr_list_type AS object
(
flag VARCHAR2(1));
CREATE
OR REPLACE type t_cr_list
IS
TABLE OF cr_list_type;
我还在包头中定义了一个类型:
type flagTableType is table of varchar2(1) index by binary_integer;
然后我创建了一个过程,如下所示:
PROCEDURE get_stuff
(
o_results OUT SYS_REFCURSOR,
o_files out sys_refcursor,
in_list IN flagTableType
)
IS
v_flag_list t_cr_list;
BEGIN
v_flag_list := t_cr_list();
v_flag_list.extend(in_list.count);
for i in in_list.first .. in_list.last
loop
v_flag_list(i) := cr_states_type(in_list(i));
end loop;
OPEN o_results FOR
select MyID, MyData
FROM MyTable
where MyFlag IN (SELECT flag from TABLE(v_flag_list));
open o_files for
select * from MyTableFiles a
where a.MyID in (select MyID
from MyTable
where MyFlag in (SELECT flag from TABLE(v_flag_list))
);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL; -- Normal result
end get_stuff;
最后,当我运行它时,我遇到了递归 SQL 1 级错误发生的错误,然后是无语句解析错误。
我没有使用递归查询。我知道它在数组中,因为如果我从第二个游标中删除“in (SELECT flag from TABLE(v_flag_list))”并使用“= 'X'”,那么两个游标都会返回值。如果我完全删除第二个游标查询,则数组在第一个游标上工作正常。这让我很困惑!
最佳答案
我解决了我自己的问题。由于某种原因我不得不再次将数组转换为数组。
open o_files for
select * from MyTableFiles a
where a.MyID in (select MyID
from MyTable
where MyFlag in
(SELECT flag from TABLE(cast(v_flag_list as t_cr_states)));
我不知道为什么这对于第一个光标来说不是必需的,但对于第二个光标来说是必需的。
关于arrays - 使用数组参数时出现递归 SQL Lvl 1 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9574219/