使用嵌入式Derby,我可以插入临时表但不插入后查询

时间:2010-11-14 04:55:25

标签: java sql jdbc derby

我有一个嵌入式德比数据库的连接。

我想创建一个临时表,并了解到必须使用DECLARE GLOBAL TEMPORARY TABLE并将前缀SESSION添加到INSERT语句中的表名。

我已尝试在DECLARE和SELECT语句中使用而不使用SESSION前缀,但它没有任何区别。

创建临时表的DECLARE语句是成功的,因为两个INSERT语句(每个返回计数为1)。

SELECT语句无法返回任何结果。我试过“SELECT * FROM ...”也没有成功。

感谢任何建议。

(注意:conn这里是一个包装类,所以conn.executeQuery,conn.executeUpdate实际上得到一个Statement并使用Statement的executeQuery / Update)

    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();

上述代码的结果是

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

2 个答案:

答案 0 :(得分:2)

如果autocommit设置为true,则必须使用“ON COMMIT PRESERVE ROWS”创建临时表,就像我的情况一样。

如果将autocommit设置为false,则原始代码将起作用。

在我的情况下,is设置为true,现在设置为false。

答案 1 :(得分:0)

创建表时使用“ON COMMIT PRESERVE ROWS”:

  

DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMPSTATS(t1 int,t2 int,t3 int)ON COMMIT PRESERVE ROWS NOT LOGGED