Подтвердить что ты не робот

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

У меня есть следующий 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;

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

ORA-06592: CASE не найден при выполнении оператора CASE

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

4b9b3361

Ответ 1

Если вы используете оператор 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 вызывает это исключение.

Вы можете добавить условие catch-all

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

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

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

Ответ 2

Старый поток, который я знаю, но не мог бы ты просто написать его вот так?

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.