je tente d'appeler depuis une application JAVA via JDBC une procedure stockée SQL.
Cette procedure renvoi un result set qui se base sur une table temporaire générée dynamiquement dans la procedure.
voici un extrait de la procedure :
Code : Tout sélectionner
CREATE PROCEDURE MAPROCEDURE
(
IN pcenvir CHAR(2),
IN pcbalnm CHAR(10),
IN pcfonnm CHAR(10),
IN pcfonpa CHAR(500),
INOUT wretou CHAR(1),
INOut wanoma CHAR(7),
INOUT wmetad VARCHAR(2000)
)
DYNAMIC RESULT SETS 1
LANGUAGE SQL NOT DETERMINISTIC
SET OPTION DBGVIEW =*SOURCE, DATFMT =*ISO, DECMPT = *COMMA
BEGIN
DECLARE stmt CHAR(4000);
DECLARE stmUp CHAR(4000);
DECLARE C1 CURSOR WITH RETURN TO CALLER FOR
SELECT * FROM SESSION/RESULT_BAL ;
(...)
SET stmt = 'DECLARE GLOBAL TEMPORARY TABLE RESULT_BAL(' CONCAT TRIM(wmetad) CONCAT ')ON COMMIT PRESERVE ROWS NOT LOGGED WITH REPLACE';
SET stmUp = 'INSERT INTO SESSION/RESULT_BAL VALUES(';
-- le statement est complété dynamiquement avec les valeurs qui vont bien pour l'exemple je me contente de valeur en 'dur'
SET stmUP = TRIM(stmUp) CONCAT '(CURRENT_DATE,''TOTO'');
-- Création de la table temporaire
PREPARE s FROM stmt;
EXECUTE s ;
-- Insertion de la réponse
PREPARE u from stmUp;
EXECUTE u;
COMMIT;
OPEN C1;
END
ex : DTBALPR DATE, CBALPDT CHAR(10)
Execution sous java ou dans System i Navigator
1er execution OK => je recupére bien mon result set
Changement du paramètre Wmetad en :
DPBALPR DATE, CBALPDT CHAR(10)
2nd execution KO :
Je suis en V6R1, mon paramètrage JDBC sous java est le suivant :Message : [SQL0205] La colonne DPDBAL ne se trouve pas dans la table RESULT_BAL de QTEMP. Cause . . . . . : La colonne portant le nom DPDBAL ne se trouve pas dans la table ou la vue RESULT_BAL du schéma QTEMP. Que faire . . . : Procédez de l'une des façons suivantes, puis renouvelez votre demande : - Assurez-vous que les noms de colonnes, de tables et les qualificatifs sont indiqués correctement. - Si le nom de colonne n'est pas qualifié, la colonne DPDBAL, qui se trouvait auparavant dans la table RESULT_BAL, n'y existe plus. Si la colonne est disponible dans une table autre que RESULT_BAL et s'il y est fait référence dans cette instruction, il vous faudra éventuellement procéder à une précompilation. - Si une instruction SQL mentionne plusieurs noms de tables, le nom de colonne doit être qualifié. - S'il s'agit d'une instruction CREATE TABLE et si la colonne DPDBAL est indiquée dans une clé de partitionnement ou dans une contrainte pour la table en cours de création, définissez la colonne DPDBAL ou éliminez-la de la contrainte ou de la clé de partitionnement. -- Dans le cas d'une expression récursive de table commune, les noms de colonnes SETet USING ne peuvent pas être référencés dans une instruction FULLSELECT qui définit l'expression de table commune.
Code : Tout sélectionner
driverClassName="com.ibm.as400.access.AS400JDBCDriver" password="password" maxIdle="2" maxWait="5000" validationQuery="Select * from matable" username="username" url="jdbc:as400://a3dev.agena3000.fr;transaction isolation=read uncommitted;date format=iso;naming=system;libraries=*LIBL;translate binary=true;extended metadata=true;metadata source=0"
Auriez vous une idée pour résoudre mon problème ?
Merci.
Cordialement.