Ошибка при рекурсивном SQL Lvl 1 при использовании параметра массива - PullRequest
2 голосов
/ 06 марта 2012

Я установил пакет 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'», то оба курсора вернут значения. Если я удаляю второй запрос курсора вообще, массив отлично работает на первом курсоре. Это меня расстроило!

1 Ответ

2 голосов
/ 06 марта 2012

Я решил свою проблему.Мне пришлось по какой-то причине снова преобразовать массив в массив.

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

Я не знаю, почему это не нужно для первого курсора, но для второго.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...