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

DB2 Discussion :

Un select case when dans une procédure stockée


Sujet :

DB2

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 27
    Points : 25
    Points
    25
    Par défaut Un select case when dans une procédure stockée
    Hello à tous,
    j'essaye de créer une procédure stockée très simple avec un CASE WHEN END dans un select et ça me met les erreurs suivantes :
    erreur 1 : SQL Error [42601]: [SQL0104] Elément syntaxique <FIN-INSTRUCTION> n'est pas correct. Eléments possibles : ;.
    >
    Je fais Ignorer/continuer et j'ai
    erreur 2 : SQL Error [42601]: [SQL0104] Elément syntaxique P1 n'est pas correct. Eléments possibles : DECLARE.
    La base db2 est sur l'OS "IBM i" version 7 et j'utilise DBeaver pour requêter.

    Requêtes exemples
    OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE  OR REPLACE PROCEDURE MY_DB.MY_PROC () 
    LANGUAGE SQL 
    P1 : BEGIN
     
    INSERT INTO MY_DB_MY_TABLE1 (MY_COL1, MY_COL2)
    SELECT 
    	MY_COL1, 
    	'TITI'
    FROM MY_DB.MY_TABLE2
     
    END P1;
    Pas OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE  OR REPLACE PROCEDURE MY_DB.MY_PROC () 
    LANGUAGE SQL 
    P1 : BEGIN
     
    INSERT INTO MY_DB_MY_TABLE1 (MY_COL1, MY_COL2)
    SELECT 
    	MY_COL1, 
    	CASE WHEN MY_COL2 IS NULL THEN 'TOTO' ELSE MY_COL2*32 END
    FROM MY_DB.MY_TABLE2;
     
    END P1;
    J'ai essayé pas mal de choses sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	--#SET TERMINATOR @
    ou
    	set current sqlid = 'db2rn' #
    	set current schema = 'db2rn' #
    mais je pense que le END de mon CASE est pris pour le END de ma procédure...

    Thanks a lot

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Super après des heures de recherches, j'ai réussi à me perdre jusqu'ici : https://dbeaver.io/forum/viewtopic.php?f=3&t=1170
    To execute complex SQL (like stored procedure) you need to select entire CREATE .. END statement and execute it (ctrl+enter).
    DBeaver do not support all features of DB2 SQL dialect and can't parse this SQL properly.
    >> ne pas prendre en compte le dernier ; après le END de la Stored procedure ...

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Quelques remarques

    • La deuxième requête présente deux point-virgule
    • Vous ne pouvez pas assigner à la fois une chaine de caractère ("TOTO" dans votre exemple) et une valeur décimale (MY_COL2*32 ) à une même colonne
    • Vous pouvez simplifier l'affectation en remplaçant le CASE par un COALESCE.


    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO MY_DB_MY_TABLE1 
          (MY_COL1, MY_COL2)
    SELECT 	MY_COL1
          ,	COALESCE (MY_COL2*32, 0)
    FROM MY_DB.MY_TABLE2

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

Discussions similaires

  1. un select dans une procedure stockée
    Par alassane0101 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 16/07/2008, 18h49
  2. Réponses: 2
    Dernier message: 07/08/2007, 19h48
  3. Réponses: 3
    Dernier message: 21/09/2004, 07h35
  4. Réponses: 6
    Dernier message: 05/08/2004, 13h15
  5. Probleme dans une procedure stockée
    Par malbaladejo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/07/2004, 14h08

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