IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

CASE introuvable lors de l'exécution de l'instruction CASE


Sujet :

SQL Oracle

  1. #1
    Membre chevronné
    Profil pro
    MOA
    Inscrit en
    Décembre 2002
    Messages
    1 070
    Détails du profil
    Informations personnelles :
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : MOA

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 070
    Points : 1 903
    Points
    1 903
    Par défaut CASE introuvable lors de l'exécution de l'instruction CASE
    Bonjour, je suis en train de tester les procédure et je viens de realiser celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    create or replace procedure RAS 
    is
      cursor cnb is select nb_emprunt from exemplaires;
    begin
      for vnb in cnb
      loop
        case 
          when vnb.nb_emprunt<=10                        then update exemplaires set etat='NE';
          when vnb.nb_emprunt>10 and vnb.nb_emprunt<=25  then update exemplaires set etat='BO';
          when vnb.nb_emprunt>26 and vnb.nb_emprunt<=40  then update exemplaires set etat='MO';
          when vnb.nb_emprunt>40                         then update exemplaires set etat='MA';
          else 0;
        end case;  
      end loop;
    end;
    Au moment de l'execution, j'obiens ceci :

    Connecting to the database oracle.
    ORA-06592: CASE introuvable lors de l'exécution de l'instruction CASE
    ORA-06512: à "HR.RAS", ligne 7
    ORA-06512: à ligne 2
    Process exited.
    Disconnecting from the database oracle.
    Et lorsque regarde l'erreur 06592
    ORA-06592: CASE not found while executing CASE statement
    Cause: A CASE statement must either list all possible cases or have an else clause.
    Action: Add all missing cases or an else clause.
    http://ora-06592.ora-code.com/

    Il faudrait soit indiquer tous les cas possibles dans le cas, soit mettre un else. Bref je ne vois pas ou ils veulent en venir.

    Savez pourquoi j'ai une erreur ?
    est ce que vous arrivez à executer la procédure ?

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Attention, tu updates toutes les lignes dans tes conditions !

    Mieux vaut inclure le CASE dans un update directement, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE exemplaires
    SET etat = (CASE 
          WHEN nb_emprunt<=10   THEN 'NE'
          WHEN nb_emprunt>10 AND nb_emprunt<=25  THEN 'BO'
          WHEN nb_emprunt>26 AND nb_emprunt<=40  THEN 'MO'
          WHEN nb_emprunt>40   THEN 'MA'
          ELSE NULL
        END)
    WHERE nb_emprunt IS NOT NULL

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE exemplaires
    SET etat = CASE 
          WHEN nb_emprunt<=10 THEN 'NE'
          WHEN nb_emprunt<=25 THEN 'BO'
          WHEN nb_emprunt<=40 THEN 'MO'
          WHEN nb_emprunt>40  THEN 'MA'
          ELSE 0 end;
    soit (équivalent à la requête de McM, écrit différement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE exemplaires
    SET etat = CASE 
          WHEN nb_emprunt<=10  THEN 'NE'
          WHEN nb_emprunt<=25  THEN 'BO'
          WHEN nb_emprunt<=40  THEN 'MO'
          ELSE 'MA'
        END
    WHERE nb_emprunt IS NOT NULL

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Yop, pas vu cette amélioration du case de ne traiter que l'inférieur.

  6. #6
    Membre chevronné
    Profil pro
    MOA
    Inscrit en
    Décembre 2002
    Messages
    1 070
    Détails du profil
    Informations personnelles :
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : MOA

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 070
    Points : 1 903
    Points
    1 903
    Par défaut
    Merci à vous tous, en effet cela faisait une mise à jour sur toute la table ce qui n'etait pas l'effet voulu bien sur mais je voulais avant tout faire des tests.

    Avant de voire vos réponses, j'ai cependant changé ma procédure pour faire proprement la mise à jour sur la ligne concerné.

    L'idée d'utiliser la clause nb_emprunt IS NOT NULL n'est pas une bonne option à mon sens. Tu vas empecher de tout mettre à jour certe mais pas la bonne ligne.


    le mieux est je pense d'utiliser :
    - where current of cnb; (le nom du curseur)
    - for update of etat; (pour indiquer la table que l'on est train de lister va etre mise à jour sur le champs "etat")


    Par contre l'idée de faire un case directement dans un update est assez séduisante en effet.


    Voici ma nouvelle procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    create or replace procedure RAS 
    is
      cursor cnb is select nb_emprunt from exemplaires for update of etat;
    begin
      for vnb in cnb
      loop
        case 
          when vnb.nb_emprunt<=10                        then update exemplaires set etat='NE' where current of cnb;
          when vnb.nb_emprunt>10 and vnb.nb_emprunt<=25  then update exemplaires set etat='BO' where current of cnb;
          when vnb.nb_emprunt>25 and vnb.nb_emprunt<=40  then update exemplaires set etat='MO' where current of cnb;
          else update exemplaires set etat='MA' where current of cnb;
     
        end case;  
      end loop;
    end;
    Elle fonctionne très bien mais par contre je ne comprends pas trop pourquoi il faut absolument utiliser ELSE dans un CASE.


    J'utilise comme doc : Oracle PL/SQL Programming (O'Reilly)

    et on peux voire que le else est optionnel

    This CASE statement has an explicit ELSE clause; however, the ELSE is optional. When you do not explicitly specify an ELSE clause of your own, PL/SQL implicitly uses the following:

    ELSE
    RAISE CASE_NOT_FOUND;
    et on peux y voire un de ces exemples sans else :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
        CASE
        WHEN salary >= 10000 THEN
           CASE
           WHEN salary <= 20000 THEN
              give_bonus(employee_id, 1500);
           WHEN salary > 40000 THEN
              give_bonus(employee_id, 500);
           WHEN salary > 20000 THEN
              give_bonus(employee_id, 1000);
           END CASE 
    ;
        WHEN salary < 10000 THEN
           give_bonus(employee_id,0);
        END CASE;

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Pour le Else en plsql, je ne sais pas.

    par contre ta procédure fait la même chose que cette requete simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE exemplaires
    SET etat = CASE 
          WHEN nb_emprunt<=10  THEN 'NE'
          WHEN nb_emprunt<=25  THEN 'BO'
          WHEN nb_emprunt<=40  THEN 'MO'
          ELSE 'MA'
        END
    Sauf que si ta table fait 10000 lignes, dans ta procédure tu vas faire 10000 updates.
    Ma condition where était pour gérer le cas de nb_emprunt NULL que tu gérais par un ELSE 0; (corrigé par un ELSE NULL; ) qui ne faisait pas d'update.

    Dans ta nouvelle procédure, dans le cas d'un nb_emprunt NULL, tu mets 'MA'

  8. #8
    Membre régulier
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Points : 77
    Points
    77
    Par défaut
    Salut,

    merci McM pour ta réponse, grâce au j'ai fini ma requête.

Discussions similaires

  1. MSVCR100.dll introuvable lors de l'exécution
    Par zevulko01 dans le forum Déploiement/Installation
    Réponses: 4
    Dernier message: 10/02/2014, 18h02
  2. Fichier texte introuvable lors de l'exécution du jar
    Par deli2025 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 26/05/2013, 18h19
  3. Réponses: 2
    Dernier message: 16/04/2008, 15h26
  4. Problème lors de l'exécution de mes programmes
    Par darkmalak01 dans le forum Langage
    Réponses: 7
    Dernier message: 27/09/2005, 18h35
  5. Message d'erreur Windows lors de l'exécution de l'appli D6-
    Par kolac dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/12/2004, 17h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo