Page 1 sur 1

JDBC et GLOBAL TEMPORY TABLE

Posté : mer. 29 avr. 2015, 14:15:57
par braconnier
Bonjour à tous,

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
Le paramètre wmetad contient la description de données de la table temporaire
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 :
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.
Je suis en V6R1, mon paramètrage JDBC sous java est le suivant :

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"  
A priori, sur la deuxième execution la déclaration de la table temporaire semble ne pas prendre en compte la nouvelle définition de la table.

Auriez vous une idée pour résoudre mon problème ?

Merci.
Cordialement.

WITH REPLACE

Posté : mer. 29 avr. 2015, 16:31:50
par admin
je pense qu'il faut utiliser la clause WITH REPLACE
WITH REPLACE
Specifies that, in the case that a declared temporary table already exists with the specified name, the existing table is replaced with the temporary table defined by this statement (and all rows of the existing table are deleted).

When WITH REPLACE is not specified, then the name specified must not identify a declared temporary table that already exists in the current session.
http://www-01.ibm.com/support/knowledge ... tm?lang=fr

Posté : mer. 29 avr. 2015, 17:05:37
par braconnier
Malheuresement, la clause WITH REPLACE est dèjà en place... dans le code
SET stmt = 'DECLARE GLOBAL TEMPORARY TABLE RESULT_BAL(' CONCAT TRIM(wmetad) CONCAT ')ON COMMIT PRESERVE ROWS NOT LOGGED WITH REPLACE';

WITH REPLACE

Posté : mer. 29 avr. 2015, 17:17:12
par cmasse