2011-08-29 6 views
13

Ho il seguente caso in PL/SQLPerché ottengo ORA-06592: CASE non trovato durante l'esecuzione dell'istruzione CASE in 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; 

Il codice compila bene, ma quando eseguo al proc memorizzato ricevo il seguente errore:

ORA-06592: CASE not found while executing CASE statement

Così, quando ho rimuovere il caso; il proc memorizzato non verrà compilato. Gli unici esempi su cui posso mettere le mani, usa il CASE in un'istruzione select, non voglio usarlo nell'istruzione select, voglio impostare la mia variabile senza avere un gruppo di istruzioni IF THEN ELSE.

risposta

30

Se si utilizza un CASE nota - le liste sotto il CASE - deve corrispondere a tutte le condizioni che si possono incontrare - in modo esplicito come avete fatto utilizzando

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

o utilizzando la clausola ELSE.

Il codice sta colpendo una situazione in cui v_line_item.custom_segment non corrisponde a nessuno degli scenari CASE indicati, quindi Oracle solleva questa eccezione.

Si potrebbe aggiungere un catch-all condizione

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

in modo che corrisponda tutte le condizioni.

Ulteriori approfondimenti:

+0

LOL, non è possibile contrassegnare la risposta corretta entro 12 minuti, roba divertente. Comunque sì, aggiungo le condizioni di caduta e tutto funziona alla grande. – Marthinus

+0

@Marthinus Prenditi il ​​tuo tempo :) felice di aiutare :) – Sathya

0

Vecchio filo lo so, ma non ti basta scrivere come questo?

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; 

È più conciso e leggibile e non fornirà un errore ORA-06592.