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 :

Utilisation SQL dans un programme RPG


Sujet :

AS/400

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2008
    Messages : 148
    Par défaut Utilisation SQL dans un programme RPG
    Salut !
    Je dois réaliser une option dans le programme que nous utilisons dans ma société pour récupérer des données diverses.
    Je voudrai savoir si j'avais la possibilité avec un programme en RPG de ne réaliser que des requêtes SQL ? Je m'explique :
    J'aurais à ma disposition plusieurs fichiers de Base de données où il faut que je récupère grâce à des requêtes diverses données. Avec ces données récupérées, il faudrait que je les réinsère dans une autre Base de données toujours à l'aide d'une requête SQL.

    Est-ce consciencieux d'utiliser le RPG ? Un autre moyen de le faire existe-t-il ?

    Cordialement,
    R4ndy

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Par défaut
    Salut,

    Tu peux le faire directement dans une procédure cataloguée SQL.
    Ci-dessous un exemple extrait du cours IBM :

    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
    CREATE PROCEDURE calc_sal_srv
    (IN srv_in INT,
    OUT delta_sal DEC(7, 2),
    OUT nb_emp INT)
    LANGUAGE SQL READS SQL DATA
    BEGIN
    DECLARE sal_emp DEC(7, 2);
    DECLARE fin_tab INT DEFAULT 0;
    DECLARE sal_moy DEC(7, 2);
    DECLARE diff_sal DEC(7, 2);
    DECLARE cnt INT DEFAULT 0;
    DECLARE tot_diff DEC(7, 2) DEFAULT 0;
    DECLARE C1 CURSOR FOR
    SELECT sal FROM tabempl WHERE srv = srv_in;
    DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET fin_tab = 1;
    SELECT DEC(AVG(sal), 7, 2) INTO sal_moy
    FROM tabempl WHERE srv = srv_in;
    OPEN C1;
    FETCH C1 INTO sal_emp;
    WHILE fin_tab = 0 DO
    SET diff_sal = sal_moy - sal_emp;
    IF diff_sal > 0 THEN
    SET tot_diff = tot_diff + diff_sal;
    SET cnt = cnt + 1;
    END IF;
    FETCH C1 INTO sal_emp;
    END WHILE;
    CLOSE C1;
    SET delta_sal = tot_diff / cnt;
    SET nb_emp = cnt;
    END
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE PROCEDURE creatable
    LANGUAGE SQL MODIFIES SQL DATA
    BEGIN ATOMIC
    CREATE TABLE tabtrav
    (noempl DEC(3) NOT NULL,
    nomempl CHAR(12) NOT NULL,
    service CHAR(10) NOT NULL);
    INSERT INTO tabtrav
    SELECT mat, nom, nomsrv
    FROM tabserv, tabempl
    WHERE tabserv.srv = tabempl.srv;
    END
    Puis tu pourras appeler ta procédure dans un

    Exec SQL CALL maprocedure

  3. #3
    Membre Expert

    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
    Par défaut
    Citation Envoyé par R4ndy
    Est-ce consciencieux d'utiliser le RPG ?
    Tu veux dire raisonnable ?

    Tu peux effectivement insérer des instructions SQL dans un programme RPG III ou RPG IV.
    Tu récupères les infos nécessaires soit dans des variables déclarées dans le programme, soit par l'intermédiaire d'un "curseur" (buffer) SQL.
    Pour alimenter une table, tu passes des variables ou des constantes aux instructions UPDATE ou INSERT.
    • Toutes les variables indiquées dans les instructions SQL doivent être précédées par deux points ( : ).
    • Toutes les instructions SQL doivent être précédées par EXEC SQL et se terminer par END-EXEC en syntaxe colonnée ou un point-virgule en syntaxe libre (/free).
    • Ne JAMAIS employer de fichiers logiques en AUCUN CAS dans une instruction SQL, n'employer que des fichiers PHYSIQUES ou des TABLES SQL.
    • Le TYPE de MEMBRE SOURCE doit être SQLRPG si RPG III ou SQLRPGLE si RPG IV.
    • Toujours tester le code statut de SQL (SQLSTT) après chaque instruction et le préférer à SQLCOD because portabilité de l'application :

    Si SQLSTT = Zero --> OK, tout va bien
    Si SQLSTT = '02000' --> Fin de la sélection ou non trouvé
    Si SQLSTT autre --> Il y a un os. Voir la log.

    Exemples

    En colonné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    C/EXEC SQL Select MaVar into :MaVar 
    C+            From MaTable
    C+            Where ...
    C/END-EXEC
    C              IF              SQLSTT <> *Zero  <-- ya un os
    ...
    C/EXEC SQL Update MaTable Set MaColonne1 = :MaVar1, MaColonne2 = :MaVar2, MaColonne3 = 'MaConstante', ...
    C/END-EXEC
    C              IF              SQLSTT <> *Zero  <-- ya un os
    En syntaxe libre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /free 
        Exec sql Select MaVar into :MaVar From ...;
        if SQLSTT <> *Zero;    <-- ya un os
    ...
        EXEC SQL Update MaTable Set MaColonne1 = :MaVar1, MaColonne2 = :MaVar2, MaColonne3 = 'MaConstante', ...;
        if SQLSTT <> Zero;    <-- ya un os
    Citation Envoyé par R4ndy
    Un autre moyen de le faire existe-t-il ?
    K2R400 t'a montré un exemple de procédure stockée qui est ni plus ni moins qu'un programme écrit en langage SPL (SQL Procédural Language), mais compte tenu que dans le programme RPG, comme dans tout programme, tu as une logique d'enchaînement des résultats à respecter, l'utilisation de SQL dans le RPG (SQL embedded) est la solution à retenir.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2008
    Messages : 148
    Par défaut
    Bonjour,
    merci à vous 2 pour vos réponses, je vais cependant utiliser, en priorité celle de Mercure.
    Une autre question me vient à l'esprit, dois-je déclarer les variables utilisées dans SQL ?

    Si oui ça nous donnerait donc :

    - Déclaration PF_1, PF_2, ... (où je récupère mes données)

    - Déclaration PF_Sortie (où j'insérerai les données récupérées)

    - Déclaration Variables utilisées dans SQL

    - Programme avec SQL Embedded


    R4ndy

  5. #5
    Membre Expert

    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
    Par défaut
    Citation Envoyé par R4ndy
    ...dois-je déclarer les variables utilisées dans SQL ?
    Bien entendu !

    Citation Envoyé par R4ndy
    Si oui ça nous donnerait donc :

    - Déclaration PF_1, PF_2, ... (où je récupère mes données)

    - Déclaration PF_Sortie (où j'insérerai les données récupérées)

    - Déclaration Variables utilisées dans SQL

    - Programme avec SQL Embedded
    Non.
    1/ Tu ne déclares aucun fichier en spécification F.
    2/ Tu définis les variables en spécification D sauf SQLSTT qui est automatiquement défini.
    3/ Toutes les intructions d'E/S se font alors avec SQL intégré (embedded) dans ton programme RPG.

    Exemple d'un programme qui sélectionne certains enregistrements du fichier d'entrée et recopie les enreg. sélectionnés sur le fichier en sortie en utilisant un curseur.
    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
    D Mavar1               s               5a
    D MaVar2               s               5p 0
    ...
     /free
    
    Exec sql Declare C1 Cursor For Select col1, col2, ... From MonFichierEntree Where col1 = 'ABCDE' And col2 > :MonParam; Exec sql Open C1; if SQLSTT <> *ZERO And SQLSTT <> '02000'; // Il y a un os Exsr ErrorRoutine; endif; DoU SQLSTT = '02000'; // EOF ou fin de sélection Exec sql Fetch C1 Into :MaVar1, MaVar2, ... if SQLSTT = '02000'; leave; endif; Exec sql Insert into MonFichierSortie ( col1, col2, ... ) Values( :MaVar1, :MaVar2, ... ); if SQLSTT <> *ZERO'; // Il y a un nouvel os Exsr ErrorRoutine; endif; enddo; *inlr = '1';

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2008
    Messages : 148
    Par défaut
    Salut,
    Merci pour tes précisions Mercure

    J'ai un problème de compilation qui m'est apparu...je n'ai pas eu le temps de le copier pour pouvoir poster ici,donc je me dis que je posterai lundi.
    Lundi matin arrive, je relance ma compilation et...rien... la compilation ne se réalise pas...il soumet le travail a Qbatch mais après rien ne se passe, pas de message d'erreur rien en splf... Je me dis que mon programme est peut être mal écrit, alors je prend un autre source, j'essaye de le compiler, et le même problème fait surface... une idée ? pour ce problème inattendu ?

    R4ndy

    Edit : J'ai résolu le problème en redémarrant l'AS400.
    Donc voici l'erreur de compilation dont je parlais plus haut :
    *RNF0257 30 8 Type de spécification de procédure principale incorrect ou hors séquence.
    Voici le source correspondant :
    DVARIABLE s 30

    /FREE
    Exec sql Select COLONNE1 into :VARIABLE
    From FICHIER1/BIBLIO1
    Where COLONNEX = 'xxxxxx' ;

    IF SQLSTT=*Zero AND SQLSTT='02000';
    Exec sql Update FICHIER1/BIBLIO2 Set COLONNE2 = :VARIABLE;
    ENDIF;

    inlr= '1';
    */END-FREE

    C return
    Une idée ? mon code contient-il des erreurs ?

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

Discussions similaires

  1. [PRO*COBOL] Appel SQL dans un programme COBOL
    Par JauB dans le forum Interfaces de programmation
    Réponses: 9
    Dernier message: 19/05/2010, 13h33
  2. Réponses: 1
    Dernier message: 10/02/2008, 20h13
  3. requete SQL dans un programme VBA ?
    Par shuin dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/06/2007, 21h25
  4. Réponses: 5
    Dernier message: 16/03/2006, 00h37
  5. [CR] Peut-on utiliser CR dans un programme en C
    Par mboucetta dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 11/10/2004, 10h56

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