JDBC et GLOBAL TEMPORY TABLE

configuration Apache, Zend et PHP , Web services
Répondre
braconnier
Messages : 7
Enregistré le : mar. 16 sept. 2008, 21:12:13
Localisation : Cholet
Contact :

JDBC et GLOBAL TEMPORY TABLE

Message 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.
Ludovic Braconnier

admin
Site Admin
Messages : 27
Enregistré le : mer. 14 févr. 2007, 17:24:50
Localisation : Carquefou (Nantes)
Contact :

WITH REPLACE

Message 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

braconnier
Messages : 7
Enregistré le : mar. 16 sept. 2008, 21:12:13
Localisation : Cholet
Contact :

Message 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';
Ludovic Braconnier

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

WITH REPLACE

Message par cmasse »

Christian Massé (Volubis.fr)

Répondre