Question Pourquoi est-ce que je reçois ORA-06592: CASE introuvable lors de l'exécution de l'instruction CASE en PL / SQL?


J'ai le CAS suivant 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;

Le code compile bien, mais quand j'exécute pour stocker proc, j'obtiens l'erreur suivante:

ORA-06592: CAS non trouvé lors de l'exécution de l'instruction CASE

Donc, quand je retire le CASE; le processus stocké ne sera pas compilé. Les seuls exemples que je puisse trouver, utilisent CASE dans une instruction select, je ne veux pas l'utiliser dans une instruction select, je veux définir ma variable sans avoir un tas d'instructions IF THEN ELSE.


14
2017-08-29 06:01


origine


Réponses:


Si vous utilisez un CASE déclaration - les listes sous le CASE - doit correspondre à toutes les conditions que vous pourriez rencontrer - explicitement comme vous l'avez fait en utilisant

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

ou en utilisant le ELSE clause.

Votre code frappe une situation où v_line_item.custom_segment ne correspond à aucun des donnés CASE scénarios, Oracle soulève donc cette exception.

Vous pouvez ajouter une condition fourre-tout

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

pour qu'il corresponde à toutes les conditions.

Lectures complémentaires:


31
2017-08-29 06:03



Vieux fil que je connais, mais tu ne l'écrirais pas comme ça?

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;

C'est plus concis et lisible et il ne produira pas d'erreur ORA-06592.


0
2017-07-20 11:02