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 :

Comment retourner un variable de type texte d'une procédure stockée ?


Sujet :

DB2

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 83
    Points
    83
    Par défaut Comment retourner un variable de type texte d'une procédure stockée ?
    Bonjour tlm,

    J'ai un souci sur la valeur de retour d'une procédure stockée.
    Je voudrais renvoyer une variable de type "VARCHAR(10)".
    Mais lorsque je fais "RETURN val;" je reçois une erreur qui m'indique que je ne peux renvoyer que des "INTEGER" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ... 24: [IBM][CLI Driver][DB2/NT] SQL0058N
    The data type of the RETURN statement value in an SQL procedure must be INTEGER.
    LINE NUMBER=24.  SQLSTATE=428F2 ...

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 83
    Points
    83
    Par défaut
    Voici la proc stock :
    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
     
    CREATE PROCEDURE CIA_GetCallIdCIA(IN Year VARCHAR(2), IN DayOfYear VARCHAR(3))
        DYNAMIC RESULT SETS 1
        LANGUAGE SQL
    BEGIN
        DECLARE currentId   VARCHAR(10);
        DECLARE newId       VARCHAR(10);
     
        SELECT  C.ParameterValue INTO currentId
        FROM    VDUC.CIAConfiguration C
        WHERE   C.ParameterName = 'CallIdCIA';
     
        IF (SUBSTR(currentId, 1, 5) = (Year || DayOfYear)) THEN
            SET newId = SUBSTR(CHAR(INTEGER('1' || currentId) + 1), 2, 10);
        ELSE
            SET currentId = Year || DayOfYear || '00000';
            SET newId = Year || DayOfYear || '00001';
        END IF;
     
        UPDATE  VDUC.CIAConfiguration
        SET     ParameterValue = newId
        WHERE   ParameterName = 'CallIdCIA';
     
        RETURN currentId;
    END

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Je peux me tromper mais il me semble qu'il manque le paramètre CurId en sortie et que DYNAMIC RESULT SETS 1 est en trop. Voici ce que j'écrierais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE PROCEDURE CIA_GetCallIdCIA( 
                 IN  Year VARCHAR(2), 
                 IN  DayOfYear VARCHAR(3), 
                 OUT CurId VARCHAR(10) )
         LANGUAGE SQL
    BEGIN
    ...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 83
    Points
    83
    Par défaut
    J'ai testé et ça fonctionne.

    Mais comment est-ce que l'on récupère la valeur de sortie OUT ?

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Sur quelle plate-forme travailles-tu ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 83
    Points
    83
    Par défaut
    Je travaille sur C#.NET

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Je ne connais pas ce langage mais comment ecrirais-tu par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select zone into MaZone from Table
    en C#.net ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 83
    Points
    83
    Par défaut
    Je n'ai jamais utilisé le mot clé "INTO".
    En fait, je crée une chaîne comportant ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT monChamps FROM maTable WHERE monChamps = 'Tralala'
    Après, j'ouvre une connection à DB2 avec un objet DB2Connection.
    Puis je crée un objet DB2Command avec la connection et la requête.
    Et enfin j'exécute la requête, avec la méthode ExecuteReader de l'objet DB2Command.
    Celle-ci me renvoie un objet DB2DataReader qui représente le résultat de la requête.
    Habituellement un tableau que je parcours de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (reader.Read())
    {
        this.attribut1 = reader.GetString(0); // récupère la valeur de la colonne 1
        this.attribut2 = reader.GetInt32(1); // idem pour la colonne 2
        ...
    }
    Dans le cas d'une procédure stockée, la requête est légèrement différente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call ma_procedure('parametre1', 'parametre2')
    Mais pour la récupération des données le traitement est identique... enfin lorsque la procédure stockée renvoie une table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE PROCEDURE ma_procedure(IN parametre1 VARCHAR(30))
        LANGUAGE SQL
    BEGIN
        DECLARE mon_cursor CURSOR WITH RETURN FOR
            SELECT monChamps FROM maTable WHERE monChamps = parametre1;
        OPEN mon_cursor;
    END
    Par contre lorsqu'il y a un paramêtre OUT dans la procédure mon traitement ne me récupère rien.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Si je reprends ton code d'appel de la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call ma_procedure('parametre1', 'parametre2')
    Qu'écrierais-tu en C#.Net pour passer des noms de variables dans le Call à la place des 2 valeurs en dur 'parametre1' et 'parametre2' ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 83
    Points
    83
    Par défaut
    Très bonne question !
    Je ne sais pas encore comment faire, mais je devrais trouver ce matin.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    pour retourner ta chaine fais plutot un

    SET CurdId = CurrentId;

    et dans ton code C#

    MaVar = cmd.execute(sql)

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 83
    Points
    83
    Par défaut
    Je viens de trouver comment récupérer les paramètres de ma procédure stockée.
    En fait l'objet DB2Command que je crée avec la connection et la requête, possède un attribut "CommandType", qui permet d'indiquer si c'est une simple requête ou un appel à une procédure stockée, et un attribut "Parameters" qui permet d'ajouter des paramètres et de spécifier s'ils sont 'IN', 'OUT' ou 'INOUT' (Par défaut les paramètres sont 'IN').

    Ainsi lors de la création de l'objet DB2Command, la requête n'est plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call ma_procedure('parametre1', 'parametre2')
    mais juste :puis pour ajouter des paramètres, il suffit d'utiliser l'attribut "Parameters" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mon_db2command.Parameters.Add("Nom du paramètre 1", DB2Type.Varchar);
    mon_db2command.Parameters[0].Value = 'valeur paramètre 1';
    mon_db2command.Parameters.Add("Nom du paramètre 2", DB2Type.Varchar);
    mon_db2command.Parameters[1].Direction = ParameterDirection.Output;
    Enfin pour récupérer le paramètre 'OUT', il faut utiliser l'objet DB2Command et non le DB2DataReader après avoir appelé la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string valeurParametre2;
    valeurParametre2 = mon_db2command.Parameters[1].Value.ToString();

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 83
    Points
    83
    Par défaut
    Merci beaucoup Mercure pour ton aide.

    Merci aussi à Sickfrid, t'as solution fonctionne aussi mais au lieu d'utiliser la méthode ExecuteReader de l'objet DB2Command, il faut utiliser la méthode ExecuteScalar.

  14. #14
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut A l'attention de Gat-
    D'après les questions et réponses que tu nous montres, tu donnes l'impression d'être sérieux. Continue comme ça, tu es sur la bonne voie.

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

Discussions similaires

  1. Recupérer le texte d'une procédure stockée
    Par Abac_Angelique dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/02/2010, 21h44
  2. Réponses: 6
    Dernier message: 04/03/2009, 14h05
  3. Split sur une variable de type TEXT (vs nvarchar)
    Par AliJava dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 20/06/2008, 09h05
  4. Déclarer des variables de type texte
    Par Meidje dans le forum Débuter
    Réponses: 12
    Dernier message: 05/06/2008, 17h26
  5. Réponses: 1
    Dernier message: 16/03/2007, 11h46

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