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