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

Oracle Discussion :

[PL SQL] Problème avec 'case' dans une fonction


Sujet :

Oracle

  1. #1
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut [PL SQL] Problème avec 'case' dans une fonction
    Je réalise une fonction en pl/sql sous Oracle et j'utilise un "case...when".
    Voici la partie de mon code:
    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
     
     
    FUNCTION GET_LIBELLE_ATTRIBUT
    (
     ID_ATTRIBUT IN NUMBER
    ) RETURN VARCHAR2
    IS
      LIBELLE_ATTRIBUT VARCHAR2;
    BEGIN
    	 CASE ID_ATTRIBUT
    	 	  when 1 LIBELLE_ATTRIBUT = 'libelle_1';
    		  when 2 LIBELLE_ATTRIBUT = 'libelle_2';
    	 end case;
    RETURN(LIBELLE_ATTRIBUT);
    END;
    J'obtiens l'erreur suivante a cause du 'case':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    PLS-00103: Symbole "CASE" rencontré à la place d'un des symboles suivants :
     
       begin declare exit for goto if loop mod null pragma raise...
    D'avance merci.

  2. #2
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Salut,
    à mon avis il manque les THEN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Case ...
        When ...
            THEN ...
        When ...
            THEN ...
    End Case ;
    au fait, attention, l'attribution de valeurs à une variable se fait avec := et pas juste =
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  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
    On peut faire un CASE hors d'un SELECT ?
    Après vérif : OUI.

    Pourquoi ne pas faire un IF ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    J'ai modifié ma fonction mais j'ai toujours l'erreur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    FUNCTION GET_LIBELLE_ATTRIBUT
    (
     ID_ATTRIBUT IN NUMBER
    ) RETURN VARCHAR2
    IS
      LIBELLE_ATTRIBUT VARCHAR2(100);
    BEGIN
    	 CASE ID_ATTRIBUT
    	 	  when 1 then LIBELLE_ATTRIBUT := 'libelle_1';
    		  when 2 then LIBELLE_ATTRIBUT := 'libelle_2';
    	 end case;
    RETURN(LIBELLE_ATTRIBUT);
    END;
    Par ailleurs, j'aimerais utiliser un case plutot qu'un if puisque j'aurais pas mal de valeurs disctinctes et que je trouve cela plus propre.

  5. #5
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Il faut une clause ELSE obligatoire. Et il faut aussi avoir Oracle 9i.
    Est-ce le cas ?

  6. #6
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    et si tu essayes comme ceci :

    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
    FUNCTION GET_LIBELLE_ATTRIBUT 
    ( 
     ID_ATTRIBUT IN NUMBER 
    ) RETURN VARCHAR2 
    IS 
      LIBELLE_ATTRIBUT VARCHAR2(100); 
    BEGIN 
        CASE 
            when ID_ATTRIBUT  = 1 
                then LIBELLE_ATTRIBUT := 'libelle_1'; 
            when ID_ATTRIBUT  = 2 
                then LIBELLE_ATTRIBUT := 'libelle_2'; 
        end case; 
    RETURN LIBELLE_ATTRIBUT; 
    END;
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  7. #7
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    @pifor
    NON, pas besoin de ELSE !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    create or replace function test ( val in number) return varchar2
    AS
        RetVal  Varchar2(10) ;
    Begin
        Case
            When val = 1
                Then RetVal := 'un' ;
            When val = 2
                Then RetVal := 'deux' ;
        End Case ;
     
        Return RetVal ;
    End ;
    Fonctionne très bien (9.2.0.6)...

    SQL> select test(2) from dual ;

    TEST(2)
    --------------------------------
    deux

    Ecoulé : 00 :00 :00.00
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  8. #8
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Ma version d'oracle est la 8.1.7.4. Le 'case' ne marche pas avec cette version?

  9. #9
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Hélas non, pas en PL/SQL

    tu peux l'utiliser dans du SQL standard, mais l'intégration au PL/SQL n'est possible que depuis la 9i.

    Il va falloir alors passer par le If.

    désolé !
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  10. #10
    Nouveau membre du Club Avatar de divail
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 36
    Points
    36
    Par défaut
    Ok merci pour ces réponses. Je vais utiliser le if.

  11. #11
    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
    Citation Envoyé par Yorglaa
    @pifor
    NON, pas besoin de ELSE !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    create or replace function test ( val in number) return varchar2
    AS
        RetVal  Varchar2(10) ;
    Begin
        Case
            When val = 1
                Then RetVal := 'un' ;
            When val = 2
                Then RetVal := 'deux' ;
        End Case ;
     
        Return RetVal ;
    End ;
    Fonctionne très bien (9.2.0.6)...

    SQL> select test(2) from dual ;

    TEST(2)
    --------------------------------
    deux

    Ecoulé : 00 :00 :00.00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQL> select test(3) from dual ;
    ORA-06592: CASE not found while executing CASE statement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CASE
            WHEN val = 1
                THEN RetVal := 'un' ;
            WHEN val = 2
                THEN RetVal := 'deux' ;
    		ELSE RetVal := 'pas trouvé' ;
        END CASE ;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  12. #12
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    OK...
    mais là tu parle de gestion des exception, et pas de la fonctionnalité CASE elle-même. Qui, elle, fonctionne très bien sans le ELSE !
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  13. #13
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Pas de 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
    16
    17
    create or replace function test ( val in number) return varchar2 
    AS 
        RetVal  Varchar2(10) ; 
    Begin 
        Case 
            When val = 1 
                Then RetVal := 'un' ; 
            When val = 2 
                Then RetVal := 'deux' ; 
        End Case ; 
     
        Exception
        When others
            Then RetVal := 'Rien' ;
     
        Return RetVal ; 
    End ;
    SQL> select test(3) from dual;

    TEST(3)
    --------------------------------------
    Rien
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  14. #14
    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
    Il y a quand même une différence entre un else et une exception qui catche tout, même les autres erreurs ORA.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  15. #15
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    bien sûr !!

    mais je te rappelle qu'ici c'est un EXEMPLE...
    donc le when Others est en effet un peu large... tu pourrais aussi faire ta propre exception qui catche uniquement la ORA-06592 (avec un pragma init_exception), ou encore "faire planter" l'appli avec une erreur spécifiquement dédié à ça avec un raise_application_error, ou encore envoyer un mail avec utl_smtp, ou encore... mais les options ne manquent pas !

    Mais par contre tu peux aussi VOULOIR que ta fonction plante si tu ne donne pas une des valeurs voulues en paramètre.

    j'en reviens à ce que je disais précédement, rien n'empêche TECHNIQUEMENT le Case de fonctionner sans clause else !!!

    alors ne mélangeons pas tout. Les problèmes de conception, d'algo ou gestion des exceptions n'ont strictement rien à voir avec une éventuelle limitation technique d'une ou l'autre syntaxe !
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de case dans une requète SQL
    Par MerwanK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/06/2015, 15h18
  2. [XL-2003] Problème avec utilisation d'une fonction dans les formules
    Par damsmut dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/05/2009, 10h43
  3. Problème avec structure dans une fonction
    Par Saliman dans le forum C
    Réponses: 2
    Dernier message: 22/11/2007, 11h45
  4. Problème avec like dans une requête SQL
    Par Boublou dans le forum SQL
    Réponses: 2
    Dernier message: 16/08/2007, 15h46
  5. [8i][PL/SQL] erreur avec lpad dans une fonction
    Par sali dans le forum Oracle
    Réponses: 3
    Dernier message: 16/03/2006, 06h22

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