[RESOLU] Boucle for SQL dans un SQLRPGLE

RPG (3 et 4, free), CL, SQL, etc...
Répondre
aapra
Messages : 6
Enregistré le : mer. 17 août 2022, 17:08:48

[RESOLU] Boucle for SQL dans un SQLRPGLE

Message par aapra »

Salut,

Je souhaite copier les lignes d'un fichier txt de l'IFS (qui matchent avec certaines lignes d'un fichier PF) vers un autre fichier txt. Je vois que par SQL c'est rapide à faire :

Code : Tout sélectionner

begin
  for select LINE as maLigne
      from table(QSYS2.IFS_READ('/zzz/blabla.txt'))
      where substr(LINE, 1, 6) in (select champ1 from maBib/monFic)
  do call QSYS2.IFS_WRITE(PATH_NAME => '/zzz/extract.txt', 
                          LINE => maLigne);
  end for;
end;
C'est cool, ça fonctionne quand je lance ça par l'exécution de scripts SQL.... mais est-ce possible de d'implémenter ça directement dans un SQLRPGLE ?
Si je pouvais éviter un curseur/fetch, ça serait sympatôche.
Modifié en dernier par aapra le mer. 25 janv. 2023, 15:20:36, modifié 1 fois.

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

Re: Boucle for SQL dans un SQLRPGLE

Message par BrigitteG »


SebastienB
Messages : 51
Enregistré le : ven. 22 janv. 2021, 10:21:13

Re: Boucle for SQL dans un SQLRPGLE

Message par SebastienB »

Bonjour,

la fonction qsys2.ifs_write accepte une requête SQL pour le paramètre "line".
Cela donne quelque chose comme cela :

Code : Tout sélectionner

EXEC SQL
    CALL qsys2.ifs_write(
      PATH_NAME => '/zzz/extract.txt', 
      line => ( select LINE as maLigne
      from table(QSYS2.IFS_READ('/zzz/blabla.txt'))
      where substr(LINE, 1, 6) in (select champ1 from maBib/monFic)),
                          LINE => maLigne);

aapra
Messages : 6
Enregistré le : mer. 17 août 2022, 17:08:48

Re: Boucle for SQL dans un SQLRPGLE

Message par aapra »

Ho l'accenser émotionnel... pendant quelques instants, j'y ai cru. ^^

Code : Tout sélectionner

call QSYS2.IFS_WRITE(
  PATH_NAME => '/zzz/extract.txt',
  LINE => ( 
    select LINE
    from table(QSYS2.IFS_READ('/zzz/blabla.txt'))
    where substr(LINE, 1, 6) in (select champ1 from maBib/monFic)
  )
); 

Code : Tout sélectionner

Message : [SQL0811] Résultat de SELECT dépasse une ligne. Cause . . . . . :   La table résultante d'une instruction SELECT INTO, d'une sous-requête ou d'une sous-requête d'une instruction SET comporte plusieurs lignes. [...].
Mais merci pour la réponse, je n'avais même pas penser à mettre un select en entrée du paramètre LINE.

SebastienB
Messages : 51
Enregistré le : ven. 22 janv. 2021, 10:21:13

Re: Boucle for SQL dans un SQLRPGLE

Message par SebastienB »

Oups, un oublie par rapport à ce que j'avais fait. Il faut effectivement une seule ligne de résultat.
Rien n'empêche d'utiliser la fonction LISTAGG avec un retour chariot.

Code : Tout sélectionner

listagg(LINE, x'25') 
A voir si cela fonctionne dans votre cas.

Voici l'exemple que j'avais :

Code : Tout sélectionner

    
    CALL qsys2.ifs_write(
      path_name => '/home/testfichier.txt',
      line => (
          select listagg(LSTNAM, x'25') from qiws.qcustcdt
      ),
      file_ccsid => 1208,
      overwrite => 'REPLACE'
        );

aapra
Messages : 6
Enregistré le : mer. 17 août 2022, 17:08:48

Re: Boucle for SQL dans un SQLRPGLE

Message par aapra »

Magnifique, merci ! :]

Répondre