Page 1 sur 1

[RESOLU] Boucle for SQL dans un SQLRPGLE

Posté : mar. 24 janv. 2023, 19:35:45
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.

Re: Boucle for SQL dans un SQLRPGLE

Posté : mer. 25 janv. 2023, 07:55:10
par BrigitteG

Re: Boucle for SQL dans un SQLRPGLE

Posté : mer. 25 janv. 2023, 10:06:59
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);

Re: Boucle for SQL dans un SQLRPGLE

Posté : mer. 25 janv. 2023, 12:12:05
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.

Re: Boucle for SQL dans un SQLRPGLE

Posté : mer. 25 janv. 2023, 14:22:39
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'
        );

Re: Boucle for SQL dans un SQLRPGLE

Posté : mer. 25 janv. 2023, 15:19:34
par aapra
Magnifique, merci ! :]