SQLCODE -305

RPG (3 et 4, free), CL, SQL, etc...
Répondre
SELLERON
Messages : 8
Enregistré le : mer. 21 nov. 2018, 10:14:30

Message par SELLERON »

Bonjour,

J'ai créé le RPG PDFBLOB suivant :

D BLOBData S SQLTYPE(BLOB_LOCATOR)
D BLOBFile S SQLTYPE(BLOB_FILE)
* Paramètres en entrée
D pFileName S 255 Varying
* Paramètres en sortie
D pBLOBData S Like(BLOBdata)
* Les indicateurs de colonnes SQL de 1 a N (Autant que de colonnes) en entrée
D pFileNameInd S 5I 0
* Les indicateurs de colonnes SQL de 1 a N (Autant que de colonnes) en sortie
D pBLOBDataInd S 5I 0
* Parametres Echange SQL (Fixe)
D pSQLState S 5
D pFunctionName S 139
D pSpecificName S 128
D pMsgText S 70 Varying
*
C *entry plist
* Les paramètres en entrée
C parm pFileName
* Les paramètres en sortie
C parm pBLOBData
* Les indicateurs de colonnes SQL de 1 a N (Autant que de colonnes) en entrée
C parm pFileNameInd
* Les indicateurs de colonnes SQL de 1 a N (Autant que de colonnes) en sortie
C parm pBLOBDataInd
* Parametre Echange SQL (Fixe)
C parm pSQLState
C parm pFunctionName
C parm pSpecificName
C parm pMsgText

exec sql Set Option
Commit = *None;

BLOBfile_fo = SQFRD;
BLOBfile_name = pFileName;
BLOBfile_nl = %Len(pFileName);

exec sql
Set :BlobData=:BlobFile;

Select;
* Fichier non trouvé- Renvoie Null
When SQLSTT='428A1';
pBLOBDataInd=-1;
* Autre erreur
When SQLSTT<>'00000';
pSQLState=SQLSTT;
pMsgText=%Subst(SQLErM:1:SQLErL);
Other;
* OK - Renvoi de la donnée
pBLOBDataInd=*Zero;
pBLOBData=BLOBdata;
EndSl;

Return;

Et la fonction table ci-dessous :
CREATE FUNCTION PDFBLOB (
EXPFILE VARCHAR(255)
)
RETURNS BLOB AS LOCATOR
LANGUAGE RPGLE
PARAMETER STYLE SQL
EXTERNAL
READS SQL DATA
DETERMINISTIC
RETURNS NULL ON NULL INPUT

Lorsque j'exécute la fonction table depuis un requeteur SQL, elle fonctionne correctement.
VALUES PDFBLOB('/home/CSV/Fichier.pdf')
ou
SELECT PDFBLOB('/home/CSV/Fichier.pdf') FROM UnFichier

Mon problème est le suivant : lorsque je souhaite exécuter cette fonction table dans un RPG, j'ai les erreurs suivantes :
SQLCODE = -305 et SQLSTATE = 22002

Ctl-opt datfmt(*ymd) datedit(*ymd) actgrp(*caller);
D rfdocu s SQLTYPE(BLOB_LOCATOR)
D rfdocui s 5I 0
D rfreto s 1
D rfmess s 80
Dcl-s wwnpdf char(20);
Dcl-s wwcpdf char(100);
Dcl-s wwpdf char(120);
exec sql Set Option
Naming = *Sys,
//Commit = *None,
UsrPrf = *User,
DynUsrPrf = *User,
Datfmt = *iso,
CloSqlCsr = *EndMod;
wwpdf ='/home/CSV/Fichier.pdf';
Exec Sql
set :rfdocu = PDFBLOB(:wwpdf);
If %Subst(SqlState:1:2) >= '02';
rfreto = '7';
rfmess = 'Erreur lors de la génération du BLOB.';
EndIf;
*inlr = *on;
return;

Merci d'avance pour vos idées

monthi
Messages : 77
Enregistré le : mar. 11 sept. 2018, 15:37:02
Localisation : Paris

(sujet inconnu)

Message par monthi »

Bonjour

le SQLCODE 305 est : La variable indicateur doit être indiquée.


set :rfdocu:rfdocui = PDFBLOB(:wwpdf);

Cdlt

SELLERON
Messages : 8
Enregistré le : mer. 21 nov. 2018, 10:14:30

(sujet inconnu)

Message par SELLERON »

Merci pour votre réponse, le problème semble résolu.
Maintenant, j'ai une procédure stockée
CREATE PROCEDURE MaProc(
IN parm1 CHAR (3 ),
IN parm2 CHAR (2 ),
IN parm3 CHAR (2 ),
IN parm4 CHAR(9),
OUT parm5 BLOB ,
OUT parm6 CHAR (1 ),
OUT parm7 CHAR (80 ))
LANGUAGE RPGLE SPECIFIC MaProc
NOT DETERMINISTIC READS SQL
DATA CALLED ON NULL INPUT
EXTERNAL NAME MaProc
PARAMETER STYLE GENERAL

Si j'enlève le paramètre 5 (le BLOB), cela fonctionne correctement.
Par contre avec le BLOB impossible de faire fonctionner la procédure.

Avez-vous des préco pour appeler une procédure stockée qui aurait un paramètre retour de type BLOB?

Merci d'avance.

SELLERON
Messages : 8
Enregistré le : mer. 21 nov. 2018, 10:14:30

(sujet inconnu)

Message par SELLERON »

Petite précision, cette procédure stockée appelle un SQLRPGLE qui génére un pdf sur l'IFS et ensuite le met dans un BLOB avec le traitement à l'origine du sujet.
Le but de tout ça c'est d'appeler depuis une interface java (connection jdbc à l'as400) cette procédure stockée qui retournera le PDF dans le BLOB.

SELLERON
Messages : 8
Enregistré le : mer. 21 nov. 2018, 10:14:30

(sujet inconnu)

Message par SELLERON »

Voici le message lorsque j'exécute depuis le le requeteur d'Iséeries Navigator (dans mon cas je passe par ACS) :
[ Fri Nov 23 11:18:32 GMT 2018 ]  Exécution globale...  CALL GESD940010.PTRKCDE_06 ('POU', 'NI', 'AR', '007898348', null, null, null)  Etat SQL : 42926 Code fournisseur : -7034 Message : [SQL7034] Les pointeurs LOB et XML ne sont pas admis avec COMMIT(*NONE). Cause . . . . . : Les pointeurs LOB et XML ne peuvent pas être utilisés avec un contrôle de validation de niveau *NONE ou *NC. Que faire . . . : Utilisez un contrôle de validation de niveau *CHG, *UR, *CS, *ALL, *RS ou *RR.  L'instruction mise en évidence a échoué, entraînant l'interruption du traitement  Instructions ayant échoué : 1

Suite à ce message j'ai changer le paramétrage de ma connection JDC de "Pas de validation (*NC et *NONE)" en "lecture stable (*RS et *ALL)" et j'ai le message suivant :
[ Fri Nov 23 11:22:45 GMT 2018 ]  Exécution globale...  CALL GESD940010.PTRKCDE_06 ('POU', 'NI', 'AR', '007898348', null, null, null)  Etat SQL : 58004 Code fournisseur : -901 Message : [SQL0901] Erreur système SQL. Cause . . . . . : Une erreur système SQL est intervenue.  L'instruction SQL en cours ne peut s'exécuter avec succès.  Cette erreur n'empêchera pas cependant l'exécution des instructions suivantes. Il se peut que des messages précédents aient signalé un incident lié à cette instruction SQL et que SQL n'ait pas correctement diagnostiqué l'erreur. Les messages précédents indiquent peut-être qu'un incident s'est produit sur cette instruction SQL, mais que le diagnostic n'a pas été correctement effectué par SQL. L'ID message précédent est MCH0601. Une erreur interne de type 7018 s'est produite. S'il s'agit d'une précompilation, le traitement s'interrompra sur cette instruction. Que faire . . . : Consultez les messages précédents pour déterminer si un incident s'est produit sur cette instruction SQL. Pour consulter les messages, utilisez la commande DSPJOBLOG en mode interactif, ou la commande WRKJOB pour visualiser la sortie d'une précompilation.  Un programme d'application recevant ce code retour peut tenter de lancer de nouvelles instructions SQL. Corrigez les erreurs éventuelles et renouvelez votre demande.  L'instruction mise en évidence a échoué, entraînant l'interruption du traitement  Instructions ayant échoué : 1

Répondre