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. #21
    Membre éprouvé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2002
    Messages : 72
    Points : 1 063
    Points
    1 063
    Par défaut
    Bonjour,

    Moi je dirais bien:

    1) dans une bibliothèque créer un fichier source QSQLSRC

    2)par SEU créer un membre MAPROC de type texte et y mettre votre appel a la procédure stockée comme dans le strsql

    3) utiliser la commande RUNSQLSTM pour executer le sql



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RUNSQLSTM SRCFILE(LIB/QSQLSRC) SRCMBR(MAPROC)
    Ancien rédacteur Java/J2EE ,C++Builder

  2. #22
    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 problème c'est que j'ai l'impression que lorsque l'on créer une procédure par le mode que tu vient de me décrire, on ne peut pas créer une procédure de plus de 20 lignes car si on peut je voudrais savoir car je n'ai pas trouvé et ça serait cool car 20 lignes ça fait un peu juste!

  3. #23
    Membre éprouvé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2002
    Messages : 72
    Points : 1 063
    Points
    1 063
    Par défaut
    on peut créer des procédures du nombre de ligne que l'on souhaite.
    Il faut juste insérer des ligne blanche dans le source avec SEU en metant un I ou Inn (pour insérer nn lignes) dans la marge de gauche de la ligne ou l'on insère un truc...(en ecrasant le n° de ligne).
    Ancien rédacteur Java/J2EE ,C++Builder

  4. #24
    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
    Ah ok merci petite astuce assez utile!!

  5. #25
    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
    Et oui c'est encore moi

    J'au essayer comme tu me l'a dit Olivier avec une procédure toute simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     create procedure test(var1 char(15)) language sql                 
    begin                                                                
    declare var2 varchar(150);
    declare id integer default 0;              
    set var2=concat(var1, '1');
    set id='select max(id) from yoan';
    set id=id+1;
    insert into yoan values(id, var2, var);
    INSERT into yoan values(id+150, var, var2);                                                  
    end
    Ensuite je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL mabib/test PARM('999999999999999')
    sur la ligne de commande de l'écran d'accueil du mode 5250. Quand j'éxécute cette commande, j'arrive sur l'écran de source d'un module qui me permet de faire du débogage et j'ai une erreur sur la deuxième ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQLP_IND = (short int *)argv[2]; 
    TEST.SQLP_I1 = *(SQLP_IND+0);
    Donc j'ai l'impression que l'erreur se passe sur le type de ma variable var1 d'entrée. J'ai essayer en mettant var1 de type integer et en enlevant les '' autour de ma variable lors du CALL et c'est le même résultat erreur sur la même ligne

    Qui pourrais m'expliquer?

  6. #26
    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
    UP UP UP je paye un verre à celui qui me donneras la réponse à mon problème !!! lol

  7. #27
    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
    j'ai l'impression soit que personne ne veut m'aider, ou alors que personne n'a réussi à créer de procedure stockée avec un paramètre d'entrée et de sortie!

    ça fait environ une semaine et demi que je suis sur le même problème et que je n'avance pas, alors je crois que je vais finir par abandonner ce type de développement pour finalement "sous-traiter" la création d'un programme qui ferait la même chose mais en RPG.

    Je tiens quand même à remercier toutes les personnes qui ont essayer de m'aider.

    Merci à tous

  8. #28
    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
    Bon voilà après plusieurs moments de découragement, et de joie, j'ai enfin réussi à créer : une procedure qui appelle une autre procedure avec deux paramètres d'entré, et une procedure récursive.

    Pour ceux que ça intéresse je décris comment il faut faire :

    Pour appeler une procedure stockée(sql) à partir d'une autre, il suffit de faire : Si la SP contient un paramètre d'entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     call mabib.maproc(mavariable);
    Pour faire une procedure récursive il suffit de rappeler la même procedure comme décrit ci-dessus.

    Je sais ça avit l'air tout simple mais j'ai voulu me faire aider avant de chercher par moi même et dans le forum on m'a dit qu'il fallait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CALL QSYS/QCMDEXC('CALL maproc(mavar)')
    ce qui fonctionne mais seulement pour une variable qui ne possède ni paramètre d'entré ni paramètre de sortie.

    Pour ce qui des paramètres de sortie je n'ai toujours pas réussi les utilisé mais ceci vient peut être du fait que je travaille sous as400.

    Donc voilà si quelqu'un veut de l'aide sur les SP je pense que je suis maintenant en mesure d'en fournir!!!!

  9. #29
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2004
    Messages : 85
    Points : 89
    Points
    89
    Par défaut
    Sans aucune pretention, je me permet de mettre du code permettant un appel recursif avec l'utilisation d'une procedure et une fonction. Ce n'est peut etre une bonne pratique, mais peut etre que cela pourra aider de futur personne, qui comme moi, on assez de mal avec les procedures stockée sous DB2. L'exemple permet le calcul d'un factoriel:

    Creation de la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE FUNCTION MVXCTESTS.FRC(N INTEGER)
    RETURNS INTEGER
    LANGUAGE SQL
    BEGIN
      IF (N = 0 OR N = 1) THEN RETURN 1;
      END IF;
      RETURN N * MVXCTESTS.FRC(N - 1);
    END;
    Creation de la procedure qui utilise la precedente fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE PROCEDURE MVXCTESTS.FRC_PROC(N INTEGER)
    RESULT SETS 1
    LANGUAGE SQL
    BEGIN
      DECLARE SOMME INTEGER;
      DECLARE cursor1 CURSOR WITH RETURN FOR SELECT * FROM SESSION.RETURN_TBL1;
      DECLARE GLOBAL TEMPORARY TABLE SESSION.RETURN_TBL1(CP INTEGER NOT NULL)WITH REPLACE;
      SET SOMME = MVXCTESTS.FRC(N);
      INSERT INTO SESSION.RETURN_TBL1 VALUES(SOMME);
      OPEN cursor1;
    END;
    Appel de la procedure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CALL MVXCTESTS.FRC_PROC(3)

  10. #30
    Membre régulier Avatar de delas
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 100
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par yoyopi
    Bon voilà après plusieurs moments de découragement, et de joie, j'ai enfin réussi à créer : une procedure qui appelle une autre procedure avec deux paramètres d'entré, et une procedure récursive.

    Pour ceux que ça intéresse je décris comment il faut faire :

    Pour appeler une procedure stockée(sql) à partir d'une autre, il suffit de faire : Si la SP contient un paramètre d'entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     call mabib.maproc(mavariable);
    Pour faire une procedure récursive il suffit de rappeler la même procedure comme décrit ci-dessus.

    Je sais ça avit l'air tout simple mais j'ai voulu me faire aider avant de chercher par moi même et dans le forum on m'a dit qu'il fallait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CALL QSYS/QCMDEXC('CALL maproc(mavar)')
    ce qui fonctionne mais seulement pour une variable qui ne possède ni paramètre d'entré ni paramètre de sortie.

    Pour ce qui des paramètres de sortie je n'ai toujours pas réussi les utilisé mais ceci vient peut être du fait que je travaille sous as400.

    Donc voilà si quelqu'un veut de l'aide sur les SP je pense que je suis maintenant en mesure d'en fournir!!!!

    et pour appeler une procedure stockée qui renvoie un resultat on fait comment?

  11. #31
    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,

    Le problème c'est qu'avec la version que j'utilise de DB2 (version as400) je n'ai jamais trouvé comment faire et vu ce que j'ai lu je crois que sur as400 c'est impossible.

    Maintenant sur d'autre plate-forme cela doit être possible mais je ne sais pas comment faire

  12. #32
    Membre éprouvé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2002
    Messages : 72
    Points : 1 063
    Points
    1 063
    Par défaut
    Bonjour,

    Renvoyer des valeurs dans les paramètres des procédures stockées est tout à fait possible sur iSeries.

    voici un exemple de procedure qui renvoie des valeur en paramètres:
    (Cette procédure encapsule un programe clp de l'as400, mais le résultat serait identique avec une procédure full SQL qui renverrait des valeurs dans ses paramètres.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    /* Retreive the current user of the job */                
     
    CREATE PROCEDURE BIBTST.RTVCURUSER(INOUT user CHAR (10 )) 
    LANGUAGE CL                                               
    NOT DETERMINISTIC                                         
    NO SQL                                                    
    CALLED ON NULL INPUT                                      
     
    EXTERNAL NAME BIBTST.RTVCUSER PARAMETER STYLE GENERAL
    Cette procédure stockée native iSeries peut ensuite être utilisée depuis un client java par exemple.

    ou encore depuis un programe RPGSQL par exemple en remplaçant les paramètres par des variables d'hote.

    ex: programme SQLRPGLE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dusr              S             10            
     
    C/Exec SQL                                    
    C+   call rtvcuruser(:usr)                    
    C/End-Exec                                    
    C                   eval      *inlr = *on


    voici un autre exemple de procédure stockée utilisée pour qualifier un fichier . On lui passe une liste de bibliothèque, le fichier et il retourne le fichier qualifié

    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
    /*------------------------------------------------------------------------*/  
    /* This procedure will qualify a file according a library list            */  
    /*  Library list shall be in the form lib1 lib2 lib3                      */  
    /* author : O.CONSTANS (c) 2004
    /*------------------------------------------------------------------------*/  
    --Drop   procedure "IIMPGM".IIMSQQUALF;                                       
    Create procedure "IIMPGM".IIMSQQUALF                                          
     ( IN    pLibl    char(275),                             /* Library list */   
       IN    pfile    CHAR(10),                              /* File to qualify */
       INOUT pqualf   CHAR(23))                              /* file qulified */  
     
    Language SQL                                                                  
     
    BEGIN                                                                         
        declare sqlcode integer default 0;                                        
        declare vpos    integer default 0;                                        
        declare cur1 Cursor For                                                   
     
         SELECT '"' concat TABLE_schema concat '".'concat table_name as qfile     
               ,position(substr(table_schema , 1 , 10)in plibl)as pos     
         From   qsys2.systables                        
         Where  position(substr(table_schema , 1 , 10) 
                         in pLibl)<>0                  
                and table_name = pfile                 
         Order by pos;                                 
     
        Open cur1 ;                                    
        Fetch cur1 Into pqualf,vpos ;                  
        Close cur1 ;                                   
     
    END
    Ancien rédacteur Java/J2EE ,C++Builder

  13. #33
    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 olivier,

    Je viens de ré-essayer une procédure stockée en full sql avec un paramètre de sortie en me basant sur ton modèle et ça fonctionne.

    Le problème c'est que pour récuperer la variable de sortie il faut passer par une autre procédure et à l'intérieur de celle ci faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    call procedure(val) ou val 
    est une variable déclarée du même type que celui de la variable de retour que l'on veut récuperer
    Car j'ai essayer de créer ma procédure avec la variable de sortie et de l'appeler directement sous strsql en faisant mais ça ne fonctionne pas car une variable hote n'est pas accepté ici.

    Merci quand même de m'avoir montré que l'on peut utiliser les variables de sortie sous DB2/400

  14. #34
    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
    Et bien, je vois que mon post à fait du chemin

    Pour ma part, je n'arrive toujours pas depuis ASP a appellé une procédure stockée.

    De plus, j'aimerais y arriver depuis l'analyser de requete mais rien à faire non plus. J'ai bien fais un serveur lié, je requete dessus sans soucis mais pour ce qui est d'une procédure stockée, néant

    Ah oui, ceci ne fonctionna pas :

    as400.execute "CALL PACK14REXE.IDCB050 (cast('value' as char(10)))"
    Erreur retournée :
    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.

    /proc/index.asp, ligne 4

  15. #35
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2004
    Messages : 85
    Points : 89
    Points
    89
    Par défaut
    Voici un exemple de Procedure stockée, de ASP, et de passage d'argument. Etant moi aussi interesse par cela, je fais qlqs recherches:

    http://dypso.free.fr/tech/generer_pd..._procedure.php

  16. #36
    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,

    Intéressant mais cela n'a aucun rapport avec le post

    Le but étant d'excécuter un Procédure Stockée DB200 depuis une page asp


    Portekoi

  17. #37
    Membre éprouvé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2002
    Messages : 72
    Points : 1 063
    Points
    1 063
    Par défaut
    as400.execute "CALL PACK14REXE.IDCB050 (cast('value' as char(10)))"
    ne fonctionne pas car cast ('value...etcc n'est pas un paramètre correct de la commande call de l'as400.

    Il faudrait faire le cast avant dans une variable string en construire donc la chaine puis seulement après faire votre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    as400.execute MavariableStringAvecleProgrammeAappeler
    .
    Ancien rédacteur Java/J2EE ,C++Builder

  18. #38
    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
    Moi aussi je ne trouve pas de solution à ce problème.

    Non seulement je n'arrive pas à faire tourner sous strsql mais aussi sous LSXLC (lotusscript chez Lotus Notes) et sous ASP.

    J’ai la procédure stockée suivante :

    create procedure kb_caisse

    (in kb_agc INT,

    in kb_cpt DEC(6, 0),

    out kb_mont dec(15, 3)

    )

    language sql reads sql data

    …..



    Lorsque j’appelle cette procédure sous strsql j’ai des message d’erreurs :



    call kb_caisse (99, 999999)

    Programme KB_CAISSE de non trouvé avec les paramètres indiqués.

    call kb_caisse (99, 999999, 0)
    IN, OUT ou INOUT incorrect pour le paramètre 3 de la procédure KB_CA

    call kb_caisse (99, 999999, NULL)

    IN, OUT ou INOUT incorrect pour le paramètre 3 de la procédure KB_CA



    call kb_caisse (99, 999999, ?)

    Utilisation incorrecte d'une marque de paramètre.



    call kb_caisse (99, 999999, :kb_mont)

    Une variable hôte n'est pas admise dans cet environnement.



    call kb_caisse (99, 999999, kb_mont)

    Elément syntaxique KB_MONT n'est pas correct. Eléments possibles : :

  19. #39
    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
    Pour appeler ta proc stocké il faut que tu passe par une autre qui te permette de récuperer ton paramètre de sortie et l'appel se fait comme cela:

    set var=call kb_caisse(9, 99999);

  20. #40
    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
    Pour appeler ta proc stocké il faut que tu passe par une autre qui te permette de récuperer ton paramètre de sortie et l'appel se fait comme cela:

    set var=call kb_caisse(9, 99999);
    Je dois vraiment être trop nul mais vraiment, je n'y arrive pas:

    Membre source modifié le 21/07/06 11:16:27
    5722SS1 V5R3M0 040528 Lancer des instructions SQL KB_CALL
    Enreg *...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
    1 create procedure kb_call
    2 language sql
    3 begin
    4 declare var dec(15, 3);
    5 set var = call kb_caisse(01, 300108);
    6 end
    * * * * * F I N D U S O U R C E * * * * *
    SQL0312 30 5 Position 1 Variable CALL non définie ou non utilisable.
    SQL0104 30 5 Position 16 Elément syntaxique KB_CAISSE n'est pas
    correct. Eléments possibles : ;.
    Récapitulatif des messages
    Total Info Avertissement Erreur Grave Terminal
    2 0 0 0 2 0
    Erreurs de gravité 30 trouvées dans le source

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

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