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 :

[AS400] Appel d'une procédure stockée


Sujet :

DB2

  1. #41
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 213
    Points : 154
    Points
    154
    Par défaut
    salut excuse moi c'est de ma faute je me suis trompé!
    Alors la syntaxe pour ta procédure kb_call c'est comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create procedure kb_call(in .......,.......;, out ...)
    language sql
    result set 1
    begin
    ...............
    et ensuite dans ta deuxième procédure qui appel kb_call tu fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call kb_call(variable1, variable2, variable_de_retour);
    Et voilà normalement ça marche, dis moi si t'as un problème

  2. #42
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par yoyopi

    Et voilà normalement ça marche, dis moi si t'as un problème
    Merci beaucoup, maintenant ça marche mais

    call kb_caisse(02, 319172)
    Instruction CALL exécutée.

    comment recuperer le montant retourné?

  3. #43
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 213
    Points : 154
    Points
    154
    Par défaut
    Voici le code que quelqu'un m'a envoyé pour afficher le résultat.
    Regarde bien la table temporaire, perso je n'ai pas réussi à le faire marcher.

    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
    CREATE PROCEDURE MVXCHDEV.SUITEFIBONACI
    RESULT SETS 1
    LANGUAGE SQL
    BEGIN
     
     
      DECLARE I INTEGER default 2;
      DECLARE A INTEGER default 0;
      DECLARE B INTEGER default 1;
      DECLARE C INTEGER;
     
      /*Declaration du cursor sur la table temp: SESSION.RETURN_TBL*/
     
      DECLARE cursor1 CURSOR WITH RETURN FOR
            SELECT * FROM SESSION.RETURN_TBL;
     
      /*Declaration de la table tmp: SESSION.RETURN_TBL*/
      DECLARE GLOBAL TEMPORARY TABLE SESSION.RETURN_TBL (
      NOMBRE INTEGER NOT NULL
      )WITH REPLACE;
     
      WHILE I < 30 DO
        SET C = A + B;
        SET A = B;
        SET B = C;
        SET I = I + 1;
        INSERT INTO SESSION.RETURN_TBL VALUES(B);
      END WHILE;
    OPEN cursor1;
    END
    call MVXCHDEV.SUITEFIBONACI

  4. #44
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    je reste perplexe face à la solution, recuperer le resultat dans une table, même temporaire ne me semble pas la meilleure des solutions.

    Les resultsets servent normalement à ça

  5. #45
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 213
    Points : 154
    Points
    154
    Par défaut
    Le code que je t'ai envoyé sert à afficher le résultat à l'écran, mais ensuite tout dépend de ce que tu veu en faire de ton résultat, apparement le fait de l'afficher à l'éran fonctionne(je dis apparement car j'ai pas réussi).

    Je ne vois pourquoi tu est perplexe? Perso je vois pas d'autre solutions, a part inserer le résultat dans une table et faire un select mais c'est pas terrible non plus!!

  6. #46
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Voila ça y est j'ai du nouveau.

    Avis à la population: Que tous ceux qui cherchent à tester une procédure stockée sur AS/400 s'ABSTIENNENT DEFINITIVEMENT de la tester via STRSQL.

    Il faut IMPERATIVEMENT passer par ISERIES NAVIGATOR.

    Vous lancez votre Call et vous avez votre résultat. Exemple:

    call qgpl.kb_call(02, 319172, null)

    Paramètre de sortie #3 = 9999.000

    L'instruction a été exécutée (1344 ms)

    PS: si la procédure ainsi appelée fonctionne, bonjour les dégats lorsqu'on l'appelle de LOTUS ou de ASP. Ca sort les mêmes messages.

    Ce n'est donc pas encore gagné.

    Quelqu'un a t'il des suggestions?

  7. #47
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Oh RAGE, Oh Desespoir, Oh procédure stockée ennemie
    N'ai-je donc tant vécu que pour cette infamie?
    Et ne suis-je blanchi dans les travaux batch guerriers
    Que pour voir en un jour flétrir tant de lauriers?
    Mon clavier qu'avec respect toute l'entreprise admire,
    Mon clavier, qui tant de fois a sauvé cet empire,
    Tant de fois affermi le trône de son roi,
    Trahit donc ma querelle et ne fait rien pour moi?

  8. #48
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 9
    Points : 11
    Points
    11
    Par défaut Rien à signaler?
    Aucune réponse depuis le 31 juillet, c'est desespérant, je n'arrive pas à croire que IBM se fou..e de la gue..le du monde en nous refilant des procédures stockées qui marchent sur une seule jambe et qui n'acceptent pas de parametres OUT.

    Quelqu'un a t'il parmi ses relations un spécialiste DB2 AS/400 chez IBM?


  9. #49
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 9
    Points : 11
    Points
    11
    Par défaut Ame généreuse
    Si une ame généreuse voudrait reproduire l'essai en laboratoire, voici les éléments pour reproduire le problème:

    CREATE TABLE KARIM/KB_TEST (KB_ID DEC (1 , 0) NOT NULL WITH
    DEFAULT, KB_NOM CHAR (10 ) NOT NULL WITH DEFAULT)

    INSERT INTO KARIM/KB_TEST VALUES(1, 'KARIM')
    INSERT INTO KARIM/KB_TEST VALUES(2, 'SELIM')
    INSERT INTO KARIM/KB_TEST VALUES(3, 'NOUR')
    INSERT INTO KARIM/KB_TEST VALUES(4, 'LEILA')


    SELECT kb_nom FROM karim/kb_test WHERE kb_id=3
    ==>
    KB_NOM
    NOUR
    ******** Fin de données ********

    create procedure kb_testprc
    (in w_id INT,
    OUT w_nom char(10)
    )
    language sql
    RESULT SETS 1
    begin
    SELECT kb_nom into w_nom FROM karim/kb_test WHERE kb_id=w_id;
    end
    ==>La procédure KB_TESTPRC a été créée dans QGPL.

    sous STRSQL:
    call qgpl/kb_testprc(2, null)
    ==>IN, OUT ou INOUT incorrect pour le paramètre 2 de la procédure KB_TE

    sous Iseries Navigator - execution d'un script SQL:
    call qgpl.kb_testprc(3, null)
    ==>call qgpl.kb_testprc(3, null)
    Paramètre de sortie #2 = NOUR
    L'instruction a été exécutée (578 ms)

  10. #50
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    pour répondre à ta question j'ai créé ce profil, voici la reponse à ta question:

    -Pour appeler une fonction, il faut que tu ajoutes cette ligne dans ta fonction :
    SET PATH = 'xxxxx' ;
    Sachant que xxxxx est le nom de la bib où tu as créé ta fonction et ne pas oublier le point virgule.

    Voici la nouvelle version de ton code :

    create procedure kb_testprc
    (in w_id INT,
    OUT w_nom char(10)
    )
    language sql
    RESULT SETS 1
    begin
    SELECT kb_nom into w_nom FROM karim/kb_test WHERE kb_id=w_id;
    SET PATH = 'QGPL' ;
    end

    Salut

  11. #51
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,

    j'ai fait une erreur ...

    Voici ce que tu dois faire :

    create function nom_de_bib/kb_testprc(
    w_id int
    )
    returns varchar(10)
    LANGUAGE SQL
    NOT DETERMINISTIC
    READS SQL DATA
    RETURNS NULL ON NULL INPUT

    begin atomic
    declare w_nom char(10);
    SELECT kb_nom into w_nom FROM frejosbib/kb_test WHERE kb_id=w_id;
    return w_nom;
    set path = 'nom_de_bib';
    end

    Attention ne pas oublié de mettre en ligne (edtlibl) la bib où tu as créer la fonction (et non plus la procedure).
    J'ai testé par STRSQL et ça fonctionne voici la commande SQL :
    select KB_TESTPRC(2) from sysibm/sysdummy1

    Soon...

  12. #52
    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 Pro sto
    Vous ne pourrez pas récupérer de variables en retour sous STRSQL, ni avec RUNSQLSTM, compte tenu que ces deux programmes ne peuvent pas recevoir de variables en paramètre de vos CALL.
    En revanche, vous pouvez récupérer les paramètres en retour avec du SQL intégré dans un programme HLL (RPG, COBOL, etc.) qui supporte SQL bien entendu, ou bien avec iSeries Nav.

    J'ai vu un fil dans ce post qui vous indiquait à juste titre comment créer puis comment faire pour appeler une procédure stockée et récupérer un paramètre, par ex. :

    Remarque. Les variables indiquées dans l'exemple ci-dessous sont des zones définies dans votre programme.

    /exec sql
    call MaProc ( :InVar1, :InVar2, :OutVar1, :OutVar2, ...)
    /end-exec

    Les : (deux-points) sont obligatoires, ils indiquent à SQL qu'il s'agit de variables et non de constantes.

    Si vous ne voulez récupérer que des valeurs et non les lignes d'une table, déclarez vos paramètres en OUT ou INOUT dans vos procédures et utilisez de préférence dans vos procédures une instructions SELECT ... INTO OutVar1, OutVar2 ... plutôt qu'un curseur ou pire, un result set, qui n'est là en fait que pour renvoyer les lignes d'une table lorsqu'on travaille en mode client-serveur.

    Un dernier mot. Ne confondez pas les procédures stockées avec les fonctions utilisateur créées par vos soins (CREATE FUNCTION...) et utilisées dans vos instructions SQL, au même titre que les fonctions scalaires déjà fournies par SQL, genre MAX(), MIN(), DATE(), COUNT(), etc.

  13. #53
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 154
    Points : 110
    Points
    110
    Par défaut
    Bonjour,

    Je remonte ce vieux post car je n'ai toujours pas trouvé la solution.

    Je n'ai pas cherché pendant un an mais ce problème est de retour

    Donc, lorsque je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    as400.execute "CALL PACK14REXE.IDCB050 (cast('value' as char(10)))"
    J'ai l'erreur :

    IBMDA400 Command erreur '80004005'

    SQL0104: Elément syntaxique CAST n'est pas correct. Eléments possibles : <INTEGER> <CHARSTRING> DLVALUE DATE TIME TIMESTAMP. Cause . . . . . : Une erreur de syntaxe a été détectée au niveau de l'élément CAST. CAST n'est pas un élément correct. <INTEGER> <CHARSTRING> DLVALUE DATE TIME TIMESTAMP est une liste partielle des éléments corrects. Cette liste suppose que l'instruction est correcte jusqu'à cet élément. L'erreur peut être située plus haut dans l'instruction, mais la syntaxe de l'instruction apparaît correcte jusqu'à ce point. Que faire . . . : Effectuez les opérations suivantes, puis renouvelez votre demande : - Vérifiez l'instruction au niveau de l'élément CAST. Corrigez-la. Il peut s'agir d'une virgule ou de guillemets manquants, ou de clauses mal ordonnées. - Si l'erreur porte sur <FIN-INSTRUCTION>, corrigez l'instruction SQL qui ne se termine pas sur une clause correcte.

    /test/test3.asp, ligne 3
    Une idée?

    Merci


    Portekoi

  14. #54
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 154
    Points : 110
    Points
    110
    Par défaut
    Bon, j'ai trouvé comment l'exécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set rs = as400.execute("CALL PACK14REXE.IDCB050(00)")
    00 étant le code retour attendu

    Maintenant, je sais que cette procédure retourne une date. Mais si je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if not rs.eof then
    	response.write rs(0)
    end if
    J'ai l'erreur :

    ADODB.Recordset erreur '800a0e78'

    Cette opération n'est pas autorisée si l'objet est fermé.

    /test/test3.asp, ligne 5
    Ligne 5 étant : "if not rs.eof then"

    J'ai fais ceci aussi :

    sql = "CALL PACK14REXE.IDCB050(00)"
    rs.open sql, as400, 3, 3
    if not rs.eof then
    response.Write rs.recordcount
    end if
    rs.Close
    Même erreur et pour, le RS est bien "open"...

    Une idée?

  15. #55
    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
    Colle ici la procédure stockée pour qu'on y voie plus clair.

  16. #56
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 154
    Points : 110
    Points
    110
    Par défaut
    Bonjour,

    Après tout ce temps, j'avais zappé cette discussion.

    Voici la solution :

    Il faut créer une procédure stockée sur l'AS400 :

    CREATE PROCEDURE
    BIB/PROCNAME
    (IN PARAM1 CHAR ( 27),
    INOUT PARAM2 CHAR (358),
    OUT PARAM3 CHAR ( 92))
    LANGUAGE COBOLLE NOT DETERMINISTIC MODIFIES SQL
    DATA EXTERNAL NAME BIB/PROGNAME
    PARAMETER STYLE GENERAL
    Ici, j'utilise 3 paramètres. Le premier contient, par exemple, le user, la date.

    Le second contient ma linkage. C'est important au niveau de la longueur. Si le CL ou le Cobol a une linkage de 400, il faudra donc changer le 358 en 400.

    Le troisième paramètre contient la réponse du programme. Par exemple, le code retour et, le cas échéant, le libellé de l'erreur.

    Pour appeler la procédure, j'ai créé 3 fonctions en ASP :

    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
     
    Sub InitProc(CmdName, CmdConnexion, CmdText, CmdType, Param1, Param2, Param3)
    	Dim TmpProc1, TmpProc2, TmpProc3, TmpProc4
    	TmpProc1 = "Set " & CmdName & " = CreateObject(""ADODB.Command"")"
    	TmpProc2 = CmdName & ".ActiveConnection = " & CmdConnexion
    	TmpProc3 = CmdName & ".CommandText = """ & CmdText & """"
    	TmpProc4 = CmdName & ".CommandType = " & CmdType
     
    	'Execution'
    	execute(TmpProc1)
    	execute(TmpProc2)
    	execute(TmpProc3)
    	execute(TmpProc4)	
    End Sub
     
    Sub ParamProc(ParamName, CmdName, ParamName2, ParamNat, ParamType, ParamLen, ParamValue, Param1, Param2, Param3)
    	Dim TmpProc1, TmpProc2, TmpProc3
    	TmpProc1 = "Dim " & ParamName
    	TmpProc2 = "Set "& ParamName &" = " & CmdName & ".CreateParameter("""&ParamName2&""", "&ParamNat&", "&ParamType&", "&ParamLen&", """&ParamValue&""")"
    	TmpProc3 = CmdName & ".Parameters.Append " & ParamName
     
    	execute(TmpProc1)
    	execute(TmpProc2)
    	execute(TmpProc3)
     
    End Sub
     
    Function ExeProc(CmdName, lstParam)
    	Dim TmpProc1, TmpProc2, TmpProc3, TmpProc4 
     
    	TmpProc1 = CmdName & ".Execute"
     
    	'Déclenchement de la procédure'	
    	Execute(TmpProc1)
    	'On récupère les paramètres de sorties'
    	TmpProc2 = split(lstParam, "*----------*")
    	for i = 0 to ubound(TmpProc2)
    		if TmpProc2(i)&"" <> "" then
    			TmpProc3 = "TmpProc4 = TmpProc4 & "& CmdName&".Parameters("""&TmpProc2(i)&""").Value&""|----------|"""			
    			execute(TmpProc3)
    		end if
    	next
     
    	ExeProc = TmpProc4
     
    End Function
    et je les utilise ainsi : Admettons que j'ai un programme Cobol du nom de "MINLVAB001". J'utilise un CL pour en faire l'appel du nom de MINLVAC001.

    je créé donc ma procédure stockée, via le code ci-dessus, qui se nommera "MINLVAP001". Voici le code ASP nécessaire à l'exécution d'une commande (à mettre dans un include) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <%
    'Variables générales?'
    Const adCmdStoredProc    = 4
    Const adInteger          = 3
    Const adVarchar          = 200
    Const adCurrency         = 6
    Const adParamInput       = 1
    Const adParamOutput      = 2
    Const adParamInOutput      = 3
    Const adExecuteNoRecords = 128
    %>
    Et voici le code ASP qui va appeler la procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    InitProc "cmdAdo1", "As400DSN", "MINLVAP001", "4", "", "", ""
    ParamProc "ParamId1", "cmdAdo1", "Id1", adVarchar, adParamInput, 27, space(10) & "SRCMINLVAP001", "", "", ""
    ParamProc "ParamId2", "cmdAdo1", "Id2", adVarchar, adParamInOutput, 358, nocmpt, "", "", ""
    ParamProc "ParamId3", "cmdAdo1", "Id3", adVarchar, adParamOutput, 92, "", "", "", ""
    Temp =  ExeProc("cmdAdo1", "Id2*----------*Id3*----------*")
    AS400DSN est le nom de ma connexion ODBC. Pour le reste, c'est assez facile de faire le lien

    Je ne dis pas que c'est LA méthode mais cela fonctionne pour moi et franchement, cela ouvre beaucoup de possibilités

    Module d'écriture, de consultation, de mise à jour, de vérification etc....

    Bon courage à tous


    Portekoi

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. [c#] Appel d'une procédure stockée Record
    Par lapartdombre dans le forum Accès aux données
    Réponses: 4
    Dernier message: 02/08/2007, 17h20
  2. Appel d'une procédure stockée
    Par zut94 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/04/2006, 08h54
  3. Appel d'une procédure stockée sous VB 6
    Par Polux000 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 11/01/2006, 09h21
  4. Réponses: 2
    Dernier message: 10/12/2004, 15h43
  5. Appel d'une procédure stockée par un vbscript
    Par NicoNours dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/10/2004, 13h53

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