|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Annie Développeur informatique Inscription : août 2011 Messages : 19 ![]() |
J'ai une procédure qui construit une requête SQL dynamique (se trouvant dans un Service Program). J'ai une "stored procedure" qui permet d'appeler cette procédure, quand la procédure est appelé avec Navigator, cela fonctionne.
Quand la procédure est appelé à partir d'un programme Java sur PC, dans le log sur le AS400, j'ai comme message que le fichier est non trouvé, pourtant le "library list" de l'utilisateur est correct. La même requête SQL non dynamique fonctionne autant avec "Navigator" et Java. Le développeur Java me dit qu'il utilise JDBC et les classes standards déjà fournis. Je tiens à préciser que ces 2 requêtes SQL sont dans une procédure dans un SQLRPGLE et qu'elles fonctionnent bien. Le library list est correct. Le problème arrive juste quand celle avec la requête dynamique est appelé par Java sur un PC. Exemple SQL non dynamique: fonctionne avec Navigator et Java Exec SQL Declare C1 cursor for SELECT EV#ENV, EVDESC, EVDLIV, EVSTTS, ENITEM FROM FOE100PA,FOE101PA WHERE EV#ENV = EN#ENV AND EVCONO = ENCONO AND EVCUS1 = : PI_CUST; EXEC SQL OPEN C1; Exemple SQL dynamique: fonctionne seulement avec Navigator Même requête mais construit dans une variable. selectStmtSQL='SELECT EV#ENV, EVDESC, EVDLIV, EVSTTS, ENITEM FROM FOE100PA,FOE101PA WHERE EV#ENV = EN#ENV AND EVCONO = ENCONO'; If Pi_Cust > 0; whereStmtSQL= ' and EVCUS1=' + %char(Pi_Cust); ENDIF; selectStmtSQL = %trim(selectStmtSQL) + ' ' + %trim(whereStmtSQL); Exec sql Declare C1 cursor for StmtSQL; Exec sql Prepare StmtSQL from :selectStmtSQL; Exec sql Open C1 Merci à l'avance Annie |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
J'écrierais, dans le prog de service :
Code :
whereStmtSQL= ' and EVCUS1= ' + X'7D' + %trim(%char(Pi_Cust)) + X'7D'; Puis, en début de la stored proc, fais un essai en précisant en première instruction : où MaBib est la biblio où se trouvent les tables. |
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Annie Développeur informatique Inscription : août 2011 Messages : 19 ![]() |
Merci Mercure. Mais les 2 requêtes SQL dans mon SQLRPGLE sont bien définies. Le library list est correct pour l'utilisateur.
C'est le fichier qui n'est pas trouvé quand Java exécute la procédure avec un SQL dynamique. Pour le SQL non dynamique le fichier est trouvé. Nous ne voulons par "hard coder" le nom des librairies dans les CLs ou les programmes. |
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() Patrick Inscription : mai 2008 Messages : 821 ![]() |
Hummm, bizare, bizare.
Aucune raison logique qu'il trouve la table en statique et pas en dynamique, ton erreur provient à mon avis dans le fait de faire ton DECLARE avant ton PREPARE. D'ailleurs dans ton cas, pas besoin de faire du dynamique, reste en statique, les performances seront meilleures. Ainsi code ceci : Code :
Et si tu te moques de faire des lectures sales, précise bien WITH NC, aussi bon pour les perfs. |
||
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Annie Développeur informatique Inscription : août 2011 Messages : 19 ![]() |
Merci pour votre aide. Le développeur Java mentionnait dans sa connection un nom de shéma inexistant.
J'ai l'impression qu'à l'exécution le système essayait de créer la requête SQL dans ce shéma inexistant. En enlevant ce shéma dans la commande de connection. Cela a fonctionné |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Avec les infos dont on disposait, c'était impossible de trouver la solution à cette anomalie sauf peut-être en procédant par élimination laborieuse de tous les cas possibles un par un !
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com