Используя встроенный Derby, я могу вставить во временную таблицу, но не вставлять запрос после вставки - PullRequest
2 голосов
/ 14 ноября 2010

У меня есть соединение со встроенной базой данных derby.

Я хочу создать временную таблицу и узнал, что должен использовать DECLARE GLOBAL TEMPORARY TABLE и префикс SESSION к имени таблицы в операторе INSERT.

Я пытался использовать и не использовать префикс SESSION в операторах DECLARE и SELECT, но это не имело никакого значения.

Оператор DECLARE для создания временной таблицы является успешным, как и два оператора INSERT(каждый возвращает счетчик 1).

Оператор SELECT не возвращает никаких результатов.Я попытался "SELECT * FROM ..." также безуспешно.

Любой совет приветствуется.

(ПРИМЕЧАНИЕ: здесь conn является классом-оберткой, поэтому conn.executeQuery,conn.executeUpdate фактически получает 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 ]

2 голосов
/ 14 ноября 2010

Временная таблица должна быть создана с "ON COMMIT PRESERVE ROWS", если для autocommit установлено значение true, как и в моем случае.

Если для автоматической фиксации установлено значение false, исходный код будет работать.

В моем случае было установлено значение true, теперь установлено значение false.

0 голосов
/ 14 ноября 2010

Используйте «ON COMMIT PRESERV ROWS» при создании таблицы:

ОБЪЯВЛЕНИЕ ГЛОБАЛЬНОЙ ВРЕМЕННОЙ ТАБЛИЦЫ. ТЕМП. СТАТ.

...