Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/08/2011, 17h44   #1
Invité régulier
 
Femme Annie
Développeur informatique
Inscription : août 2011
Messages : 19
Détails du profil
Informations personnelles :
Nom : Femme Annie
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : août 2011
Messages : 19
Points : 9
Points : 9
Par défaut SQLRPGLE: SQL dynamique

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
annstger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 18h00   #2
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
J'écrierais, dans le prog de service :

Code :
whereStmtSQL= ' and EVCUS1= ' + X'7D' + %trim(%char(Pi_Cust)) + X'7D';
X'7D' pour mettre une quote de part et d'autre de la variable Pi_Cust.

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.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 19h09   #3
Invité régulier
 
Femme Annie
Développeur informatique
Inscription : août 2011
Messages : 19
Détails du profil
Informations personnelles :
Nom : Femme Annie
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : août 2011
Messages : 19
Points : 9
Points : 9
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.
annstger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 19h49   #4
Membre Expert
 
Patrick
Inscription : mai 2008
Messages : 821
Détails du profil
Informations personnelles :
Nom : Patrick
Âge : 42
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : mai 2008
Messages : 821
Points : 1 041
Points : 1 041
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 :
1
2
3
4
5
6
7
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 OR :PI_CUST = 0) 
FOR READ ONLY 
WITH NC;
Open C1;
ET n'oublie pas que si ton curseur est en lecture il faut le préciser (FOR READ ONLY) sinon il est considéré en mise à jour possible. C'est mieux aussi pour les perfs (pas de gestion des verrouillages).
Et si tu te moques de faire des lectures sales, précise bien WITH NC, aussi bon pour les perfs.
K2R400 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 22h20   #5
Invité régulier
 
Femme Annie
Développeur informatique
Inscription : août 2011
Messages : 19
Détails du profil
Informations personnelles :
Nom : Femme Annie
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : août 2011
Messages : 19
Points : 9
Points : 9
Par défaut Solution

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é
annstger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 16h27   #6
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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 !
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h29.


 
 
 
 
Partenaires

Hébergement Web