Вложенный оператор if возвращает дескриптор оператора, ошибка не выполнена

У меня есть хранимая процедура с двумя входными, двумя выходными параметрами и 5 sys_refcursors. У меня был успешный IF/ELSE, когда я открывал эти курсоры, вызывая разные хранимые процедуры, но теперь мне нужен третий вариант, который является другим вызовом хранимой процедуры. Третий вариант практически идентичен второму с одним отличием.

Я был почти уверен, что правильно понял вложенный оператор if, но я продолжаю получать дескриптор оператора ora-24338, который не выполняется, когда он пытается получить курсоры из этого нового вызова.

Вызов хранимой процедуры проблемы является средним.

create or replace Procedure  procedure_name (
    OutVar out varachar2,
    Outvar2  out number,
    inParam1 date,
    REf-Cur1 in out sys_refcursor,
    REf-Cur2 in out sys_refcursor,
    REf-Cur3 in out sys_refcursor,
    REf-Cur4 in out sys_refcursor,
    REf-Cur5 in out sys_refcursor
) 
is
  tIsBindVar1 varchar2(100);
  tIsBindVar2 varchar2(100);
  tOutVar1    varchar2(100);
  TOutVar2    varchar2(100);
Begin
  Select Max(T.Var1) 
    into tIsBindVar1
    From table1 
   where T.aField = inParam1;

Select Function_Name (inParam1) 
  into tIsBindVar2 
  from Dual;

IF tIsBindVar1 is NOT NULL 
THEN
  Select P.Field_A P.Field_B 
    INTO tOutVar1, tOutVar2
    FROM table1 
  WHERE P.Field_A = inParam1;

  Stored_Proc_One (tInParam => tOutVar1, 
                   inParam1 => inParam1, 
                   5 cursors => 5 cursors);
ELSE 
  IF tIsBindVar2 = 'Y' 
  THEN
    Stored_Proc_Two (inParam1 => inParam1, 
                     5 cursors => 5 cursors);
  ELSE 
    Stored_Proc_Three ();
    Stored_Proc_Two ( inParam1 => inParam1, 5 cursors => 5 cursors);
  END IF;
END IF;

SELECT tOutVar1, tOutVar2 
  INTO OutVar1, OutVar2 
  FROM DUAL;

Некоторые быстрые дополнительные примечания.

Stored_procs один и два — это прямые захваты данных, ничего особенного, хранимый процесс 3 генерирует некоторые данные на основе некоторых входных параметров (не перечисленных), а хранимый процесс 2 вызывается для сбора.

Я могу изменить эти сохраненные вызовы процедур, и я всегда получаю ту же ошибку из среднего. Это включает в себя изменение условий в любом порядке.

Я попытался упростить код, так как я не ищу, чтобы кто-то сделал работу за меня, а пытался понять, в чем проблема.

Надеюсь, я не упустил ничего важного, но я думаю, что проблема в том, как я делаю вложенные if. Я, конечно, не думаю, что проблема в самих хранимых процессах, поскольку я говорю, что они работают, когда я меняю порядок.

Так что, если код длинный и очень трудный для чтения. Постараюсь найти, где они хранят информацию о редактировании, и очистить ее.

Заранее спасибо.


person dee    schedule 05.05.2012    source источник
comment
Чтобы добавить к тому, что Джастин сказал, Stored_Proc_Three (); неверно. Должно быть Stored_Proc_Three; (без скобок, так как нет параметров).   -  person Ben    schedule 06.05.2012
comment
Проблема решена. Спасибо, Бен, это правда .. Я просто на мгновение перешел в режим С#, когда писал это. Как оказалось, сначала проблема была в том, что Джастин исправил ее вчера, но была также проблема, из-за которой, если первое условие было ложным, второе условие никогда не оценивалось как истинное. Это была проблема с таблицей, на которую она ссылалась, создавая значение поля иногда как Null, а иногда как 0 (которое != null). Большое спасибо Джастину за то, что указал мне правильное направление и очистил мой код.   -  person dee    schedule 07.05.2012


Ответы (1)


Каковы значения tIsBindVar1 и tIsBindVar2?

Вы действительно хотите, чтобы оператор IF был структурирован так, как я его отформатировал? Или ты действительно хочешь

IF  tIsBindVar1 is NOT NULL 
THEN
  <<do something>>
ELSIF tIsBindVar2 = 'Y' 
THEN
  <<do something else>>
ELSE 
  <<do one more thing>>
END IF;

Если вы хотите убедиться, что хотя бы один путь используется во всех случаях, вам нужен файл IF ELSIF ELSE.

Между прочим, нет необходимости во всех этих SELECT FROM dual утверждениях. Вы можете просто назначать переменные в PL/SQL

tIsBindVar2 := Function_Name (inParam1);

а также

tOutVar1 := OutVar1;
tOutVar2 := OutVar2;

являются более традиционными.

person Justin Cave    schedule 05.05.2012
comment
Во-первых, большое спасибо, что нашли время не только ответить, но и отредактировать мой вопрос для меня. Я потратил несколько минут на то, чтобы сделать код чище на основе вашего совета. Затем я переключил его на elsif... Вчера я по ошибке пытался сделать это таким образом, но написал els‹E›if. К сожалению, это не избавило от проблемы. Значение для tIsbindVar1 — это число, а tIsBindVar2 — это VarChar2(2)... будут ли разные типы данных влиять на процесс? - person dee; 06.05.2012
comment
@dee - Каковы значения tIsBindVar1 и tIsBindVar2? Является ли tIsBindVar1 NULL, например? Или это значение, отличное от NULL? Пробовали ли вы отладить код, чтобы убедиться, что он идет по пути, который вы ожидаете? - person Justin Cave; 06.05.2012
comment
Извините, я неправильно понял --- я дал вам типы данных, а не значения. Начальное значение для tIsBindVar1 равно null, хотя я изменил его на 0 для тестирования, но безуспешно. Значение для tIsBindvar2 изначально было 'N', но с тех пор я переключил его на := Function_Name (inParam1); по вашему предложению. - person dee; 06.05.2012
comment
@dee - Какой из трех путей, по вашему мнению, будет использовать код? Какой путь он фактически использует (на основе отладки)? - person Justin Cave; 06.05.2012
comment
Процедура работает, когда я настроил ее для проверки либо первого (tIsBindVar1 IS NOT NULL), либо последнего условия. (tIsBindVar1 IS NULL & tIsBindVar2 != 'Y') Когда я пытаюсь настроить сценарий, который должен запускать промежуточное условие (tIsBindVar1 IS NULL и tIsBindVar2 = 'Y'), я получаю сообщение об ошибке. Сейчас я не рядом с моим проектом, чтобы проверить его, но я думаю, что вы говорите, что проблема должна быть связана с условиями, которые я установил. В частности, если первое условие равно null, то второе условие никогда не будет «Y». Это кажется вероятным. Завтра протестирую. У меня проблемы с отладкой, нужно посмотреть инструменты/информацию об этом - person dee; 06.05.2012