2011-08-29 39 views
13

tengo el siguiente caso en PL/SQL¿Por qué recibo ORA-06592: CASE no encontrado al ejecutar la instrucción CASE en 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; 

El código compila bien, pero cuando ejecuto al procedimiento almacenado me sale el siguiente error:

ORA-06592: CASE not found while executing CASE statement

Así que cuando me quita la caja; el proceso almacenado no compilará. Los únicos ejemplos que puedo tener en mis manos, usa CASE en una declaración de selección, no quiero usarlo en la declaración de selección, quiero establecer mi variable sin tener un montón de instrucciones IF THEN ELSE.

Respuesta

30

Si se utiliza una instrucción CASE - los listados bajo el CASE - debe coincidir con todas las condiciones que pueden surgir - ya sea de forma explícita como lo han hecho mediante el uso de

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

o mediante el uso de la cláusula ELSE.

Su código está dando en una situación en donde v_line_item.custom_segment no coincide con ninguno de los escenarios dados en CASE, por lo tanto Oracle plantea esta excepción.

Se podría añadir un cajón de sastre condición

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

para que coincida con todas las condiciones.

Más información:

+0

LOL, no puedo marcar la respuesta correcta en 12 minutos, cosas divertidas. De todas formas, sí, agregué la condición de caída y todo está funcionando bien. – Marthinus

+0

@Marthinus Tómese su tiempo :) encantados de ayudar :) – Sathya

0

Antiguo Lo sé, pero no le acaba de escribir esto así?

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; 

Es más conciso y legible y no dará un error ORA-06592.