Почему я получаю ORA-06592: CASE не найден при выполнении оператора CASE в PL / SQL? - PullRequest
15 голосов
/ 29 августа 2011

У меня есть следующий CASE в PL / SQL

        CASE
            WHEN v_line_item.custom_segment = 'CND1' THEN
                v_current_col := v_col_lcy_tps;
            WHEN v_line_item.custom_segment = 'CND2' THEN
                v_current_col := v_col_lcy_ib;
            WHEN v_line_item.custom_segment = 'CND3' THEN
                v_current_col := v_col_lcy_gm;
            WHEN v_line_item.custom_segment = 'CND4' THEN
                v_current_col := v_col_lcy_pb;
            WHEN v_line_item.custom_segment = 'CND5' THEN
                v_current_col := v_col_lcy_bb;
        END CASE;

Код компилируется нормально, но когда я выполняю хранимый процесс, я получаю следующую ошибку:

ORA06592: CASE не найден при выполнении оператора CASE

Итак, когда я удаляю CASE;сохраненный процесс не скомпилируется.Единственные примеры, которые я могу получить, используют CASE в операторе выбора, я не хочу использовать его в операторе выбора, я хочу установить свою переменную без набора операторов IF THEN ELSE.

Ответы [ 2 ]

32 голосов
/ 29 августа 2011

Если вы используете оператор CASE - списки под CASE - должны соответствовать всем условиям, с которыми вы можете столкнуться - либо явно, как вы сделали, используя

WHEN v_line_item.custom_segment = 'CND1' THEN
            v_current_col := v_col_lcy_tps;
WHEN v_line_item.custom_segment = 'CND2' THEN

или с помощью предложения ELSE.

Ваш код попал в ситуацию, когда v_line_item.custom_segment не соответствует ни одному из заданных CASE сценариев, поэтому Oracle вызывает это исключение.

Вы можете добавить условие «поймать все»

ELSE
   -- do some work here, raise an exception or log it.

чтобы он соответствовал всем условиям.

Дальнейшее чтение:

0 голосов
/ 20 июля 2016

Старый поток, я знаю, но разве вы просто не напишите это так?

v_current_col :=
    case v_line_item.custom_segment
        when 'CND1' then v_col_lcy_tps
        when 'CND2' then v_col_lcy_ib
        when 'CND3' then v_col_lcy_gm
        when 'CND4' then v_col_lcy_pb
        when 'CND5' then v_col_lcy_bb
    end;

Это более кратко и читабельно, и это не даст ошибку ORA-06592.

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