Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/03/2007, 15h08   #1
Membre du Club
 
Inscription : mars 2006
Messages : 92
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 92
Points : 50
Points : 50
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 :
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 ...
Gat- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2007, 15h11   #2
Membre du Club
 
Inscription : mars 2006
Messages : 92
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 92
Points : 50
Points : 50
Voici la proc stock :
Code :
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
Gat- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2007, 16h12   #3
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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 :
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
...
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2007, 17h04   #4
Membre du Club
 
Inscription : mars 2006
Messages : 92
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 92
Points : 50
Points : 50
J'ai testé et ça fonctionne.

Mais comment est-ce que l'on récupère la valeur de sortie OUT ?
Gat- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2007, 17h31   #5
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Sur quelle plate-forme travailles-tu ?
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2007, 17h35   #6
Membre du Club
 
Inscription : mars 2006
Messages : 92
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 92
Points : 50
Points : 50
Je travaille sur C#.NET
Gat- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2007, 17h39   #7
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Je ne connais pas ce langage mais comment ecrirais-tu par exemple
Code :
SELECT zone INTO MaZone FROM TABLE
en C#.net ?
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2007, 09h32   #8
Membre du Club
 
Inscription : mars 2006
Messages : 92
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 92
Points : 50
Points : 50
Je n'ai jamais utilisé le mot clé "INTO".
En fait, je crée une chaîne comportant ma requête :
Code :
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 :
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 :
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 :
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.
Gat- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2007, 17h48   #9
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Si je reprends ton code d'appel de la procédure
Code :
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' ?
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2007, 09h34   #10
Membre du Club
 
Inscription : mars 2006
Messages : 92
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 92
Points : 50
Points : 50
Très bonne question !
Je ne sais pas encore comment faire, mais je devrais trouver ce matin.
Gat- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2007, 11h23   #11
Invité de passage
 
Inscription : mars 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 3
Points : 1
Points : 1
pour retourner ta chaine fais plutot un

SET CurdId = CurrentId;

et dans ton code C#

MaVar = cmd.execute(sql)
Sickfrid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2007, 13h20   #12
Membre du Club
 
Inscription : mars 2006
Messages : 92
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 92
Points : 50
Points : 50
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 :
Call ma_procedure('parametre1', 'parametre2')
mais juste :puis pour ajouter des paramètres, il suffit d'utiliser l'attribut "Parameters" :
Code :
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 :
1
2
string valeurParametre2;
valeurParametre2 = mon_db2command.Parameters[1].Value.ToString();
Gat- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2007, 13h24   #13
Membre du Club
 
Inscription : mars 2006
Messages : 92
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 92
Points : 50
Points : 50
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.
Gat- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2007, 14h53   #14
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h00.


 
 
 
 
Partenaires

Hébergement Web