使用数组参数时递归SQL级别1出错

时间:2012-03-05 21:25:18

标签: arrays oracle recursion

我已经设置了一个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'”,则两个游标都返回值。如果我完全删除第二个游标查询,数组在第一个游标上工作正常。这让我感到很沮丧!

1 个答案:

答案 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)));

我不知道为什么第一个光标不需要这个,但是第二个光标是必需的。