Почему я получаю 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.
Ответы
Ответ 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.