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

  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 778
    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 778
    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 778
    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 778
    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 !

  7. #7
    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
    La requête entier est :
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    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é
          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
    ,
     
                    /* 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;
    Le message d'erreur est : "La table ou la vue est inexistante" et ce sur tout les requêtes du VALUES ETATPROJ.

    Les tables existent, les vues aussi. La requête exécutée seule marche aussi.
    Le but étant de remplir (pour le premier cas) "P60"si DA_rec.ETATDA = 'S120 ET qu'il existe au moins un résultat pour la requête émise par la suite.

+ 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