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

Langage SQL Discussion :

CASE dans un VALUES d'un INSERT


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2019
    Messages : 72
    Par défaut CASE dans un VALUES d'un INSERT
    Bonjour,

    Voici mon problème, je dois mettre quelques conditions sur le VALUES du champ ETATPROJ. Pour cela j'utilise un CASE, a la fin de mon CASE si aucune des conditions n'est rempli alors la valeur a insérer est NULL. J'ai une erreur de syntaxe sur mon case mais je ne vois pas 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    CREATE OR REPLACE PROCEDURE TSA.P_GDAI_TO_TSA (pNUMINT IN TSA.NUMINT%TYPE) AS 
     
    BEGIN
     
        -- Faire un curseurDA qui prend tous les champs de GDA_DA
    	DECLARE CURSOR curseurDA IS
    	SELECT * FROM DBGDA.GDA_DA WHERE DBGDA.NUMINTDEM = pNUMINT;
     
        -- Ensuite faire un IF Curseur.NUMDA NOT IN (SELECT * NUMDA FROM TSA.TSA_PROJET) THEN (la procédure) ELSE Curseur+1 END IF)
        BEGIN 
     
            FOR DA_rec in curseurDA 
            LOOP 
                IF DA_rec.NUMDA NOT IN (SELECT TSA.TSA_PROJET.NUMDA FROM TSA.TSA_PROJET) THEN
                    INSERT INTO TSA.TSA_PROJET( 
                                                ETATPROJ,
                                                NUMINT,
                                                LIBPROJ,
                                                COUTPREV,
                                                TYPTAXE,
                                                NUMCOM,
                                                DATTRANSMISSION,
                                                NUMDA,
                                                CODREFUS,
                                                USERCRE,
                                                DATCRE,
                                                USERMOD,
                                                DATMOD
                    )
                    VALUES(
                    /* ETATPROJ        */      CASE WHEN DA_rec.ETATDA IN ('S100', 'S110') THEN 'P30'  -- Transmis
     
                                                     WHEN DA_rec.ETATDA = 'S120' -- DA Rattachée à au moins une opération 
                                                     AND EXISTS(SELECT * FROM DBGDA.V_DA_LISTE_ETATOPER t1 JOIN DBGDA.GDA_DA t2 ON t1.NUMDA = t2.NUMDA JOIN DBGDA.V_OPER_LISTE_ETATCONV t3 ON t1.NUMOPER = t3.NUMOPER WHERE t2.NUMINTDEM = pNUMINT AND (t3.ETATCONV >= 130 AND t3.ETATCONV < 200)) THEN 'P60' -- Conventionné
     
                                                     ELSE CASE WHEN DA_rec.ETATDA = 'S120' 
                                                     AND EXISTS(SELECT * FROM DBGDA.V_DA_LISTE_ETATOPER t1 JOIN DBGDA.GDA_DA t2 ON t1.NUMDA = t2.NUMDA WHERE t2.NUMINTDEM = pNUMINT AND (t1.ETATOPER >= 110 AND t1.ETATOPER < 190)) THEN 'P50' -- Décidé
     
                                                         ELSE CASE WHEN DA_rec.ETATDA = 'S120' 
                                                         AND EXISTS(SELECT * FROM DBGDA.V_DA_LISTE_ETATOPER t1 JOIN DBGDA.GDA_DA t2 ON t1.NUMDA = t2.NUMDA WHERE t2.NUMINTDEM = pNUMINT AND (t1.ETATOPER >= 106 AND t1.ETATOPER < 190)) THEN 'P40' -- Complet
     
                                                             ELSE CASE WHEN DA_rec.ETATDA = 'S120' 
                                                             AND EXISTS(SELECT * FROM DBGDA.V_DA_LISTE_ETATOPER t1 JOIN DBGDA.GDA_DA t2 ON t1.NUMDA = t2.NUMDA WHERE t2.NUMINTDEM = pNUMINT AND (t1.ETATOPER = 100)) THEN 'P30' -- Initialisée
     
                                                                ELSE NULL
                                                                END,
     
                    /* NUMINT          */       DA_rec.NUMINTDEM AS NUMINT,
                    /* LIBPROJ         */       DA_rec.OBJDA AS LIBPROJ,
                    /* COUTPREV        */       DA_rec.MTGLOB AS COUTPREV,
                    /* TYPTAXE         */       DA_rec.TYPTAXE AS TYPTAXE,
                    /* NUMCOM          */       DA_rec.NUMCOMTRAV AS NUMCOM,
                    /* DATTRANSMISSION */       DA_rec.DATDEM AS DATTRANSMISSION,
                    /* NUMDA           */       DA_rec.NUMDA AS NUMDA,
                    /* CODREFUS        */       DA_rec.CODREFUS AS CODREFUS,
                    /* USERCRE         */       'Batch AI' AS USERCRE,
                    /* DATCRE          */       SYSDATE AS DATECRE,
                    /* USERMOD         */       NULL AS USERMOD,
                    /* DATMOD          */       NULL AS DATMOD
                    )
     
                    -- Pour chaque DA non prise en compte dans le test précédent 
                    UPDATE DBGDA.GDA_DA
                    SET DBGDA.GDA_DA.ORIGINE = 'GDAI'
                    DBGDA.GDA_DA.PROJTSA = 'N'
                    WHERE DBGDA.GDA_DA.NUMINTDEM = pNUMINT
                    AND DBGDA.GDA_DA.NUMDA = DA_rec.NUMDA
                    AND DA_rec.ETATDA NOT IN ('S100', 'S110', 'S120');
     
     
                    -- Si le numéro de programme est >= 10, à l’état S100 – Initial ou S110 – Recevable ou S120 – Rattachée à au moins une opération dans un état < 170 - Soldée: Mise à jour des champs de la DA : Origine = ‘GDAI’ et Projet Téléservice= ‘N’
                    UPDATE DBGDA.GDA_DA
                    SET DBGDA.GDA_DA.ORIGINE = (CASE WHEN DA_rec.NUMPROG >= 10 
                                                AND DA_rec.ETATDA IN ('S110', 'S120') 
                                                AND (SELECT DBGDA.V_DA_LISTE_ETATOPER.ETATOPER FROM DBGDA.GDA_DA JOIN DBGDA.V_DA_LISTE_ETATOPER ON DBGDA.GDA_DA.NUMDA=DBGDA.V_DA_LISTE_ETATOPER.NUMDA WHERE DBGDA.GDA_DA.NUMINTDEM=pNUMINT) > 170 THEN 'GDAI' ELSE DA_rec.ORIGINE END),
                        DBGDA.GDA_DA.PROJTSA = (CASE WHEN DA_rec.NUMPROG >= 10 
                                                AND DA_rec.ETATDA IN ('S110', 'S120') 
                                                AND (SELECT DBGDA.V_DA_LISTE_ETATOPER.ETATOPER FROM DBGDA.GDA_DA JOIN DBGDA.V_DA_LISTE_ETATOPER ON DBGDA.GDA_DA.NUMDA=DBGDA.V_DA_LISTE_ETATOPER.NUMDA WHERE DBGDA.GDA_DA.NUMINTDEM=pNUMINT) > 170 THEN 'O' ELSE DA_rec.PROJTSA END)
                    WHERE DA_rec.NUMINTDEM = pNUMINT
                END IF;
            END LOOP;
        END;
    END;
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 639
    Billets dans le blog
    10
    Par défaut
    bonjour,

    supprimez les "ELSE CASE" pour ne faire qu'un seul CASE et profitez-en pour supprimer également les parenthèses inutiles

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     CASE WHEN DA_rec.ETATDA IN ('S100', 'S110') 
               THEN 'P30'  -- Transmis
          WHEN DA_rec.ETATDA = 'S120' -- DA Rattachée à au moins une opération 
           AND EXISTS(SELECT * 
                      FROM DBGDA.V_DA_LISTE_ETATOPER t1 
                      JOIN DBGDA.GDA_DA t2 
                        ON t1.NUMDA = t2.NUMDA 
                      JOIN DBGDA.V_OPER_LISTE_ETATCONV t3 
                        ON t1.NUMOPER = t3.NUMOPER 
                      WHERE t2.NUMINTDEM = pNUMINT 
                        AND t3.ETATCONV >= 130 AND t3.ETATCONV < 200 
                     ) THEN 'P60' -- Conventionné
          -- else case
          WHEN DA_rec.ETATDA = 'S120' 
            AND EXISTS(SELECT * 
                       FROM DBGDA.V_DA_LISTE_ETATOPER t1 
                       JOIN DBGDA.GDA_DA t2  
                         ON t1.NUMDA = t2.NUMDA 
                       WHERE t2.NUMINTDEM = pNUMINT 
                         AND t1.ETATOPER >= 110 AND t1.ETATOPER < 190
                      ) THEN 'P50' -- Décidé
          WHEN DA_rec.ETATDA = 'S120' 
           AND EXISTS(SELECT * 
                      FROM DBGDA.V_DA_LISTE_ETATOPER t1 
                      JOIN DBGDA.GDA_DA t2 
                        ON t1.NUMDA = t2.NUMDA 
                      WHERE t2.NUMINTDEM = pNUMINT 
                        AND t1.ETATOPER >= 106 AND t1.ETATOPER < 190
                     ) THEN 'P40' -- Complet
     
          WHEN DA_rec.ETATDA = 'S120' 
           AND EXISTS(SELECT * 
                      FROM DBGDA.V_DA_LISTE_ETATOPER t1 
                      JOIN DBGDA.GDA_DA t2 
                        ON t1.NUMDA = t2.NUMDA 
                      WHERE t2.NUMINTDEM = pNUMINT 
                        AND t1.ETATOPER = 100
                     ) THEN 'P30' -- Initialisée
          ELSE NULL
     END

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2019
    Messages : 72
    Par défaut
    Cela fonctionne, maintenant j'ai une erreur sur les select qui sont dans le case, quand j’exécute cela me dit que "La table ou la vue est inexistante"

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 639
    Billets dans le blog
    10
    Par défaut
    vérifiez les noms des tables et vues et que vous êtes bien connectés sur la bonne DB

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2019
    Messages : 72
    Par défaut
    Les tables et les vues sont bien crées. Lorsque j'éxécute la requete seul ça marche. est-ce peut etre une erreur de syntaxe avec le case ?
    Ce que je voulais faire c'est que je veux que quand le champ A_rec.ETATDA = 'S120' ET que la requête ramene au moins une ligne alors insérer P60 dans mon insert into
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WHEN DA_rec.ETATDA = 'S120' -- DA Rattachée à au moins une opération 
           AND EXISTS(SELECT * 
                      FROM DBGDA.V_DA_LISTE_ETATOPER t1 
                      JOIN DBGDA.GDA_DA t2 
                        ON t1.NUMDA = t2.NUMDA 
                      JOIN DBGDA.V_OPER_LISTE_ETATCONV t3 
                        ON t1.NUMOPER = t3.NUMOPER 
                      WHERE t2.NUMINTDEM = pNUMINT 
                        AND t3.ETATCONV >= 130 AND t3.ETATCONV < 200 
                     ) THEN 'P60'
    Si une autre syntaxe est possible je suis preneur.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    bonjour,

    Postez la requête en entier, et idéalement le message d'erreur exact en entier également !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/12/2019, 06h24
  2. Plusieurs valeurs dans un value
    Par nebule dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/11/2004, 10h58
  3. Réponses: 10
    Dernier message: 22/11/2004, 22h37
  4. Réponses: 4
    Dernier message: 18/11/2003, 16h08
  5. Réponses: 6
    Dernier message: 26/01/2003, 13h45

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