我已经设置了一个Oracle Package,其过程类似于下面的代码。我必须首先设置几个全局变量:
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;
然后我按如下方式创建了一个proc:
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(来自TABLE(v_flag_list)的SELECT标志)”并使用“='X'”,则两个游标都返回值。如果我完全删除第二个游标查询,数组在第一个游标上工作正常。这让我感到很沮丧!
答案 0 :(得分:2)
我解决了自己的问题。我不得不再次将数组转换为数组。
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)));
我不知道为什么第一个光标不需要这个,但是第二个光标是必需的。