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

PL/SQL Oracle Discussion :

CASE en PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Par défaut CASE en PL/SQL
    Bonjour à tous,

    J'ai une erreur que je ne comprends pas... Une requete qui fonctionnait très bien (dans un select imbriqué dans un update), ne fonctionne plus dans un bloc PL/SQL :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select CASE
            WHEN (rec.TYPE LIKE 'PT%') THEN Min(A.absent_12h)
            WHEN (rec.TYPE LIKE 'JO%') THEN Min(A.absent_total)
            WHEN (rec.TYPE LIKE 'NU%') THEN Min(A.absent_soir)
        END as absent into absent
    from IC_ABSENCE_JOUR A where
        jour_courant=A.jour AND
        A.e8=MJ.e8
    ;
    Il me renvois comme erreur :

    PLS-00103: Symbole "CASE" rencontré à la place d'un des symboles suivants :
    ( * - + all mod null <an identifier>
    <a double-quoted delimited-identifier> <a bind variable>
    table avg count current distinct max min prior sql stddev sum
    unique variance execute the forall time timestamp interval
    date <a string literal with character set specification>
    <a number> <a single-quoted SQL string>
    Un souci avec le CASE...???

  2. #2
    Membre Expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Par défaut
    Tu est en 8i je pense ?

  3. #3
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Par défaut
    pardon, oui exactement

  4. #4
    Membre Expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Par défaut
    Alors ca ne marche pas en 8i
    Oracle à introduit CASE en 8i sous sqlplus et non pas sous PL/SQL
    Par contre sous Oracle 9 release 1 ca marche bien.

    CASE in SQL Statements
    Support for CASE in SQL statements preceded support for CASE in PL/SQL; Oracle8i Database introduced the searched CASE expression in SQL. Unfortunately, much to the frustration of PL/SQL programmers everywhere, SQL statements executed from within PL/SQL could not use CASE expressions. For example, from SQL*Plus you could execute:

    SELECT
    CASE
    WHEN DUMMY='X' THEN 'Dual is OK'
    ELSE 'Dual is messed up'
    END
    FROM DUAL;


    However, the following PL/SQL code would not work:

    DECLARE
    dual_message VARCHAR2(20);
    BEGIN
    SELECT CASE
    WHEN DUMMY='X' THEN 'Dual is OK'
    ELSE 'Dual is messed up'
    END INTO dual_message
    FROM DUAL;
    DBMS_OUTPUT.PUT_LINE (dual_message);
    END;



    This frustration goes away starting with Oracle9i Database Release 1. From this release onwards, you can have both searched and simple CASE expressions, and they can be used equally from SQL, from PL/SQL, and from SQL within PL/SQL.


  5. #5
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Par défaut
    Arg!!!!!!!!!


    une solution autre que de passer par un décode barbare?

  6. #6
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Dans la requête que tu nous as indiqué le decode n'aurait rien de barbare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select decode (susbtr (rec.TYPE, 1, 2),
                                   'PT', Min(A.absent_12h)
                                   'JO', Min(A.absent_total)
                                   'NU', Min(A.absent_soir)) 
       as absent into absent 
    from IC_ABSENCE_JOUR A where 
        jour_courant=A.jour AND 
        A.e8=MJ.e8 
    ;
    Sinon tu peux toujours faire des if puisque si j'ai compris ton code rec.type est fixe dans ta requete.

  7. #7
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Par défaut
    Une autre solution consiste à faire du SQL dynamique, avec le package DBMS_SQL ou bien la commande EXECUTE IMMEDIATE.

    A ce moment-là, on peut utiliser le CASE dans du PL/SQL.

  8. #8
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Par défaut
    Disons que la liste PT/NU/JO est loin d'être complete, mais bon...

    Le CASE WHEN était la solution la plus élégante, je vais passer au decode comme tu l'as présenté plaineR.

    Merci beaucoup pour votre réponse à tous les trois, c'est toujours agréable d'avoir une réponse si rapide et si limpide

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

Discussions similaires

  1. [MySQL] Insérer case à cocher dans SQL
    Par tiesto95 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 24/12/2008, 11h49
  2. VBA Optimisation de code, Select Case et requete SQL
    Par Secco dans le forum VBA Access
    Réponses: 7
    Dernier message: 06/05/2008, 21h05
  3. update avec Case et PL/SQL
    Par -Mapk- dans le forum PL/SQL
    Réponses: 6
    Dernier message: 12/10/2007, 16h32
  4. Case à cocher et sql
    Par speleo dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/07/2007, 17h07
  5. Case cochée en SQL
    Par Platon93 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 27/11/2006, 17h01

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