Appel de proc en SQL sur ACS et SQLCOD 466 / SQLSTATE 0100C

RPG (3 et 4, free), CL, SQL, etc...
Répondre
LeMouton
Messages : 11
Enregistré le : lun. 22 nov. 2021, 17:27:18
Localisation : Proche du PC

Appel de proc en SQL sur ACS et SQLCOD 466 / SQLSTATE 0100C

Message par LeMouton »

Bonjour à tous !

Un de mes collègues est en train de mettre en place des PGM qui ont pour but de devenir des API ou des procédures stockées. Il n'y a aucun soucis au niveau du programme en SQLRPG, les variables sont alimentés comme il faut mais lors de l'appel de celui si sur ACS avec l'instruction suivante => call test('00010') ; nous obtenons un SQLSTATE = '0100C' / SQLCOD +466 !

J'ai bien la structure du tableau sur ACS mais aucun élément a l'intérieur alors que j'ai bien une alimentation du tableau via le RPG


Pourtant lors du debug du source le SQLCOD ne prend jamais la valeur +466 donc je n'ai pas pu essayer ce que j'ai trouvé sur volubis :
if SQLCODE = +466;
exec sql ASSOCIATE LOCATORS (:RS1) WITH PROCEDURE DSPLIBL;
exec sql ALLOCATE C1 CURSOR FOR RESULT SET :RS1;
exec sql fetch c1 into :unebib;


MErci d'avance

Voici le source si nous avons oublié un mot clef ou quoi que ce soit :

exec sql
Set Option Commit = *NONE,
DatFmt = *ISO,
TimFmt = *ISO,
DecMpt = *COMMA,
Closqlcsr = *ENDMOD ;

Dcl-pi TEST04;
parm1 char(5);
end-pi;

Dcl-ds outputRowsTable dim(50) Qualified;
Cste zoned(5:0);
Stnom char(35);
END-DS;

Dcl-ds outputRows Qualified;
Cste zoned(5:0);
Stnom char(35);
END-DS;

Dcl-s Cpt int(5);

dcl-s dparm1 int(5);

Cpt = 0;

dparm1 = %dec(parm1: 5: 0);

Exec Sql
declare cursor_societe cursor
for select Cste, Stnom from Societl1
where Cste = :dparm1
order by Cste;

Exec sql
open cursor_societe;

Dow SQLSTATE = '00000';

if Cpt < 50;
Exec sql
fetch next from cursor_societe into :outputRows;
endif;
if SQLSTATE = '00000';
Cpt += 1;
outputRowsTable(Cpt) = outputRows;
endif;
Enddo;

Exec Sql
set result sets array :outputRowsTable for :Cpt rows;

Exec sql
close cursor_societe;

Return;
Modifié en dernier par LeMouton le mer. 08 juin 2022, 10:38:16, modifié 1 fois.
L'informatique c'est fun, puis il y a eu le user et l'imprimante 8)

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

Re: Appel de proc en SQL sur ACS et SQLCOD 466 / SQLSTATE 0100C

Message par SebastienB »

Bonjour,

Je viens d'essayer de mon côté (sur une procédure existante), j'obtiens bien le sqlcode +466 / sqlstate 0100C :
2022-06-08_11h22_51.png
2022-06-08_11h22_51.png (62.61 Kio) Vu 4386 fois
2022-06-08_11h25_00.png
2022-06-08_11h25_00.png (26.47 Kio) Vu 4386 fois
Sébastien.

LeMouton
Messages : 11
Enregistré le : lun. 22 nov. 2021, 17:27:18
Localisation : Proche du PC

Re: Appel de proc en SQL sur ACS et SQLCOD 466 / SQLSTATE 0100C

Message par LeMouton »

Bonjour Sebastien,

Merci pour ta réponse, je n'obtiens cependant aucun résultat dans mon tableau via ACS, je ne vois que la structure du tableau. Pourtant via le RPG, j'ai bien des lignes qui le remplissent.

Est ce que c'est ton cas également ?
L'informatique c'est fun, puis il y a eu le user et l'imprimante 8)

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

Re: Appel de proc en SQL sur ACS et SQLCOD 466 / SQLSTATE 0100C

Message par SebastienB »

Mes résultats s'affichent correctement.

je viens de faire un petit test avec le source suivant :

Code : Tout sélectionner

dcl-pi TSTPROC3;
  cusnum zoned(6);
end-pi;

Dcl-S rowCount Int(10) inz(99); // Nombre de postes à retourner
dcl-s i zoned(3) inz(0);

// Tableau de résultat
Dcl-Ds resultSet Dim(99) Qualified;
  cusnum zoned(6) inz(0);
  lstnam varchar(8) inz('');
  street varchar(13) inz('');
End-Ds;

Dcl-Ds resultSetDS Qualified;
  cusnum zoned(6) inz(0);
  lstnam varchar(8) inz('');
  street varchar(13) inz('');
End-Ds;

clear resultSet;
i=0;

EXEC SQL
  DECLARE cListe CURSOR FOR
    SELECT cusnum,
           lstnam,
           street
      FROM QIWS.QCUSTCDT
      WHERE (cusnum = :cusnum
      or :cusnum = 0)
      ORDER BY lstnam;

EXEC SQL
  OPEN cListe;

Dow SQLSTATE = '00000';

  if i < 50;
    EXEC SQL
      FETCH NEXT FROM cListe
        INTO :resultSetDS;
  endif;
  if SQLSTATE = '00000';
    i += 1;
    resultSet(i) = resultSetDS;
  endif;
Enddo;

// Envoi des infos
EXEC SQL
  SET RESULT SETS ARRAY :resultSet FOR :i ROWS;

EXEC SQL
  CLOSE cListe;

return;

Code : Tout sélectionner

create or replace procedure TSTPROC3 (
   IN cusnum NUMERIC(6)
 )
 LANGUAGE RPGLE
 EXTERNAL NAME TSTPROC3 GENERAL;
 
call TSTPROC3(839283);  
call TSTPROC3(0);  
J'obtiens bien mon/mes résultat(s).
2022-06-08_12h15_43.png
2022-06-08_12h15_43.png (3.66 Kio) Vu 4379 fois
2022-06-08_12h16_57.png
2022-06-08_12h16_57.png (15.97 Kio) Vu 4379 fois
2022-06-08_12h18_21.png
2022-06-08_12h18_21.png (23.73 Kio) Vu 4378 fois

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

Re: Appel de proc en SQL sur ACS et SQLCOD 466 / SQLSTATE 0100C

Message par SebastienB »

Utilisation dans un RPG:
2022-06-08_12h29_53.png
2022-06-08_12h29_53.png (159.25 Kio) Vu 4374 fois

LeMouton
Messages : 11
Enregistré le : lun. 22 nov. 2021, 17:27:18
Localisation : Proche du PC

Re: Appel de proc en SQL sur ACS et SQLCOD 466 / SQLSTATE 0100C

Message par LeMouton »

Merci beaucoup

En effet j'ai oublié cette partie :| =>

Create or replace procedure XXXXX ( )
LANGUAGE RPGLE
EXTERNAL NAME TSTPROC3 GENERAL;
L'informatique c'est fun, puis il y a eu le user et l'imprimante 8)

Répondre