Я установил пакет 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;
В конце концов, когда я запускаю его, я получаю ошибку, возникшую при рекурсивной ошибке уровня 1 SQL, за которой следует ошибка синтаксического анализа без оператора.
Я не использую рекурсивные запросы. Я знаю, что это в массиве, так как если я уберу «in (флаг SELECT из TABLE (v_flag_list))» из второго курсора и перейду с «= 'X'», то оба курсора вернут значения. Если я удаляю второй запрос курсора вообще, массив отлично работает на первом курсоре. Это меня расстроило!