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.
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 !  :]