2010-11-14 57 views
2

J'ai une connexion à une base de données Derby intégrée.En utilisant Derby incorporé, je peux insérer dans une table temporaire mais ne pas interroger après l'insertion

Je souhaite créer une table temporaire et appris que je dois utiliser DECLARE GLOBAL TEMPORARY TABLE et le préfixe SESSION au nom de la table dans l'instruction INSERT.

J'ai essayé d'utiliser et de ne pas utiliser le préfixe SESSION dans les instructions DECLARE et SELECT, mais cela n'a fait aucune différence.

L'instruction DECLARE pour créer la table temporaire est réussie, tout comme les deux instructions INSERT (chacune renvoie un nombre de 1).

L'instruction SELECT ne renvoie aucun résultat. J'ai essayé "SELECT * FROM ..." sans succès aussi.

Un conseil est apprécié.

(NOTE: la conn est ici une classe wrapper, de sorte que le conn.executeQuery, conn.executeUpdate se fait une déclaration et l'utilisation executeQuery/la mise à jour de la déclaration)

 
    System.out.println("tt 1a"); 
    conn.executeUpdate("DECLARE GLOBAL TEMPORARY TABLE SESSION.tempstats (t1 int, t2 int, t3 int) NOT LOGGED "); 
    System.out.println("tt 1b"); 
    // 
    PreparedStatement pStmt = conn.prepareStatement("INSERT INTO SESSION.tempstats VALUES (?, ?, ?)"); 
    pStmt.setInt(1, 1); 
    pStmt.setInt(2, 1); 
    pStmt.setInt(3, 1); 
    int count = pStmt.executeUpdate(); 
    System.out.println("tt 2, count " + count); 
    pStmt.setInt(1, 2); 
    pStmt.setInt(2, 2); 
    pStmt.setInt(3, 2); 
    count = pStmt.executeUpdate(); 
    System.out.println("tt 3, count " + count); 
    ResultSet testRs = conn.executeQuery("SELECT t1, t2 from SESSION.tempstats"); 
    count = 0; 
    while (testRs.next()) { 
     log2 ("result of tempstats table is " + testRs.getInt("t1") + " " + testRs.getString("t2")); 
     count++; 
    } 
    System.out.println("tt 4, query result count = " + count); 
    testRs.close();  
    pStmt.close(); 

Le résultat du code ci-dessus est

tt 1a 
tt 1b 
tt 2, count 1 
tt 3, count 1 
tt 4, query result count = 0 

Répondre

2

La table temporaire doit être créé avec "oN COMMIT PRESERVE ROWS" si autocommit est définie sur true, comme ce fut mon cas.

Si vous définissez autocommit sur false, le code d'origine fonctionnera.

Dans mon cas, a été défini sur true, il est maintenant défini sur false.

0

Utilisez "ON COMMIT PRESERVE ROWS" lorsque vous créez une table:

DECLARE SESSION.TEMPSTATS TABLE Globaux Temporaires (t1 int, t2 int, t3 int) ON COMMIT PRESERVE ROWS PAS LOGGED