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

AS/400 Discussion :

Probème avec Declare cursor


Sujet :

AS/400

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Probème avec Declare cursor
    Bonjour

    Je suis un nouveau, alors si je fais quelque chose de pas correct, n'hésiter pas à me le dire.

    Voici mon problème que je chercher depuis plusieur heures.

    C'est une procédure stocké qui est caller par un pgm java et je veux retourner un message d'erreur si le UserName n'existe pas dans mon fichier(GT01RESP)

    Déclaration de la stored proc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE PROCEDURE BGTDEV/GETINFORES (        
     OUT RETOUR NUMERIC(4, 0),                  
     IN USRNAM CHAR(10),                        
     OUT TXTMSGERR CHAR(132) )                  
     LANGUAGE RPGLE                             
     SPECIFIC BGTDEV/GETINFORES                 
     NOT DETERMINISTIC                          
     MODIFIES SQL DATA                          
     EXTERNAL NAME 'BGTDEV/GTSRVFTS(GETINFORES)'
     DYNAMIC RESULT SETS 1                      
     PARAMETER STYLE GENERAL WITH NULLS ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    C/Exec SQL                                            
    C+        DECLARE C06 Cursor with return to client for
    C+        Select * from GT01RESP                      
    C+        Where  GT01UsrP = :I_UserName               
    C/END-EXEC               
    
    C/Exec SQL                                                
    C+        OPEN C06                                        
    C/END-EXEC                                                
                                                              
    C/Exec SQL                                                
    C+        SET RESULT SETS FOR RETURN TO CLIENT CURSOR C06 
    C/END-EXEC
    Le SQLSTT = 0, même si aucun record dans le fichier a la valeur de I_UserName


    Quelqu'un peut m'aider svp

  2. #2
    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
    Pourquoi faire une PS externe RPG alors qu'une PS SQL suffit largement pour ce type de traitement. Et puis, il n'y a plus besoin de faire un "SET RESULT SETS" depuis la V5R1. Faire juste un "DECLARE Cursor" suivi d'un "OPEN Cursor" et laisser le curseur ouvert.

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    DROP PROCEDURE MaBib.GETINFORES;
    
    CREATE PROCEDURE MaBib.GETINFORES
      ( In USRNAM varchar(10) )
     Language SQL
     Dynamic Result Sets 1
    
     MainBody: Begin
    
       Declare SQLSTATE char(5) Default '00000';
       Declare SQLCODE int Default 0;
       Declare Count int Default 0;
       Declare not_found_text char(70);
    
       Declare Not_Found Condition for SQLSTATE '02000';
    
       Declare C06 Cursor With Return For
           Select * From GT01RESP                      
             Where  GT01UsrP = USRNAM;
    
       Declare Exit Handler for NOT_FOUND
         Begin
            -- SQLCODE : -438 indique une condition d'erreur,
            --           +438 indique un avertissement.
            Return -1;
      
            -- ****************************************************************
            -- The RETURN value can be examined by the caller with the GET
            -- DIAGNOSTIC statement.
            -- See  RETURN_STATUS for a coding example below.
            -- You can also retrieve the return value directly from the SQLCA
            -- area by reading the value of sqlerrd[0].
    
            -- Example :
            -- -------
            -- CALL GETINFORES (USRNAM);
            -- GET DIAGNOSTICS retval = RETURN_STATUS;
            -- If retval <> 0 THEN
            --   GoTo BadNews;
            -- End if;
            ****************************************************************
         End;
    
       Select Count(*) into Count From GT01RESP                      
         Where  GT01UsrP = USRNAM;
    
       If Count = 0 Then
          Set not_found_text = 'User ' concat trim(USRNAM) concat
                                                       ' not found';
          /* The handler will be fired by this stm */
          Signal SQLSTATE Value '02000' Set MESSAGE_TEXT = not_found_text;
       End if;
    
       Open C06;
    
       Return 0;
    
     End MainBody;
    Le message d'erreur apparaîtra s'il y a lieu sur la log du travail. En retour de l'appel à cette PS, l'appelant (Java) doit contrôler le code statut avec un GET DIAGNOSTICS du RETURN_STATUS (registre spécial SQL) comme indiqué dans la PS ci-dessus. Si ce code est < 0, le user n'a pas été trouvé. Si ce code = 0, le user a été trouvé et le "result set" concernant ce user est à la disposition du programme appelant

  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 To SebasQc
    Alors SebasQc, est-ce que ça te convient ou faut-il envisager une solution RPG ?

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Procédure stockée
    Salut Mercure

    Il me faut une solution RPG, car nous voulons gérer le message d'erreurs seulement dans les pgm RPG. C'est un système de saisie de temps qui fonctionne en 5250 et en web. Si j'ai des validation à ajouter, je vais les faire seulement à un endroit, dans mes pgm RPG et je ne veux pas être oubligé de modifier les pgm Java. Mais ne te casse pas la tête avec ça, j'ai créé une procédure qui valide le user name, si pas erreur je fais le traitement du result set sinon envoi un msgerr. Peut être pas la meilleure solution, mais je suis en apprentissage avec les PS.

    J'ai une autre question, est-ce qu'un pgm RPG peut caller une PS externe qui retourne un result set et être en mesure de lire le result set dans mon pgm RPG appelant?

    Connais-tu un site en francais qui parle de PS , avec des examples?

    Merci beaucoup pour tes précisions.

  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
    Citation Envoyé par SébasQc
    Connais-tu un site en francais qui parle de PS , avec des examples?
    Oui. Voir sur mon site perso à cette page.

    ...est-ce qu'un pgm RPG peut caller une PS externe qui retourne un result set et être en mesure de lire le result set dans mon pgm RPG appelant?
    Oui, mais pour lire un result set en RPG, il va falloir passer par SQL CLI car les programmes RPG "SQL embedded" (SQL intégré) ne savent pas lire un result set. Voir un exemple ici. Il s'agit de la continuation de la page précédente.

    Je te recommande de lire toute ma prose en relation avec SQL CLI depuis le début en partant d'ici. Il y a 3 pages en tout.

    Tu auras forcément des questions à poser, alors n'hésite pas à les poser ici.

    ...j'ai créé une procédure qui valide le user name...
    Au passage et pour info au cas où..., je te signale que tu as avantage à utiliser l'API Unix-Type access() qui va checker l'existence du user profile sur le système. C'est une API facile à utiliser qui contrôle l'existence d'objets dans l'IFS, y compris les objets dans QSYS. On l'appelle en RPG IV de la même façon que les autres APIs avec prototype et valeur en retour qui peut prendre les valeurs suivantes :
    • 0 - OK objet trouvé (l'objet existe)
    • -1 - non trouvé (l'objet n'existe pas)

    Tu lui passes 2 paramètres :
    • le premier doit être terminé par un x'00'
    • le second est un entier pour checker l'existence (0 ou -1)


    Exemple :
    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
         H dftactgrp(*no)
         H option( *srcstmt: *nodebugio )
          *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
          * Check existence of user profile
          *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
         d chkusrprf       pr            10i 0
         d usrprfpath                   255a   const
    
         d usrprfpath      s            255a   inz('/QSYS.LIB/+
         d                                     MonUsrPrf.USRPRF')
    
         C                   eval      *inlr = *on
         C                   if        chkusrprf (usrprfpath) < 0
         C     'not exist'   dsply
         C                   else
         C     'exist'       dsply
         C                   endif
         C                   return
    
         p chkusrprf       b
         d chkusrprf       pi            10i 0
         d  usrprfname                  255a   const
    
         d access          pr            10i 0 extproc('access')
         d  p_pathptr                      *   value
         d  mode                         10i 0 value
    
         d p_pathptr       s               *
         d F_OK            c                   0
         d usrprfpath      s            255a
    
         c                   eval      usrprfpath  = usrprfname
         c                   eval      p_pathptr = %addr(usrprfpath)
         c                   eval      %str(p_pathptr:
         c                                  %len(%trim(usrprfpath)) + 1) =
         c                                      %trim(usrprfpath)
    
         c                   return    access(p_pathptr: F_OK)
         p chkusrprf       e
    Il faut évidemment passer le user profile en paramètre à ce programme exemple et modifier MonUsrPrf par le vrai user profile.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut J'ai encore beaucoup à apprendre
    Merci beaucoup Mercure


    Je vais faire mes devoirs et je te recontact en MP, pour les questions sur ta PS PAYROLL.

    Je crois que je vais en apprendre énorméement.

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

Discussions similaires

  1. condition avec un cursor et un parametre
    Par lazzeroni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/09/2006, 17h02
  2. Probème avec FireFox
    Par Krubi dans le forum Général Conception Web
    Réponses: 8
    Dernier message: 20/06/2006, 17h27
  3. [Procédure Stockée] Comment la constuire avec un cursor?
    Par Portekoi dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 21/03/2006, 17h22
  4. [ASE] Les locks avec un cursor for update
    Par PiyuXYZ dans le forum Sybase
    Réponses: 1
    Dernier message: 11/02/2006, 14h17
  5. [817] procédure avec REF CURSOR en paramètre
    Par Bourbigot dans le forum Oracle
    Réponses: 8
    Dernier message: 19/01/2006, 11h42

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