为什么我得到ORA-06592:在PL / SQL中执行CASE语句时找不到CASE?

时间:2011-08-29 06:01:49

标签: oracle plsql

我在PL / SQL中有以下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
                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;

代码编译正常,但是当我执行存储过程时,我收到以下错误:

  

ORA-06592:执行CASE语句时未找到CASE

所以当我删除CASE时;存储过程将无法编译。我可以得到的唯一示例,在select语句中使用CASE,我不想在select语句中使用它,我想设置我的变量而没有一堆IF THEN ELSE语句。

2 个答案:

答案 0 :(得分:32)

如果您使用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.

以便它符合所有条件。

进一步阅读:

答案 1 :(得分:-1)

旧线程我知道,但你不会这样写吗?

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错误。