web-dev-qa-db-ja.com

HSQLDB2.0.0-rc8で次のシーケンス値を選択する「正しい」方法

tEST_SEQと呼ばれるシーケンスがあるとすると、次の値を選択する正しい方法は何でしょうか。これは動作しません:

select next value for TEST_SEQ

おそらく「FROM」句が必要なためです。 hibernateでHSQLDialect.getSequenceNextValString()を見ると、次のようになります。

"select next value for " + sequenceName + " from dual_" + sequenceName

私の場合、次のような結果になります。

select next value for TEST_SEQ from dual_TEST_SEQ

これは2.0.0-rc8では機能しません(これは2.0より前のバージョンでのみ機能すると思います-検証されていません)DUALと呼ばれる1行の単純なテーブルを作成するソリューションに出くわしました。この場合は機能します(Oracleスタイル):

select next value for TEST_SEQ from DUAL

しかし、hsqldbにはこのテーブルが付属しておらず、「初回起動」時に休止状態にしてこのようなテーブルを生成する方法がわかりません。

シーケンスの次の値をすぐに取得する方法が必要だと思っていて、それが欠落しているだけです。何か案は ?

20
radai

tEST_SEQと呼ばれるシーケンスがあるとすると、次の値を選択する正しい方法は何でしょうか。

ドキュメント は次のように述べています。

次の例のように、シーケンスの次の値をSELECT、INSERT、およびUPDATEステートメントに含めることができます。

SELECT [...,] NEXT VALUE FOR <sequencename> [, ...] FROM <tablename>;

「正しい」方法(HSQLDBにないダムDUALテーブルのようなテーブルを含まないため、より単純であるため)は次のようになります。

call NEXT VALUE FOR [sequence_name];

これは 1.7.2 に現れ、これは実際にHibernateがHibernateCoreの「最近の」バージョンのHSQLDialectでシーケンスを処理する方法です(参照 HHH-2839)。

そして確かに、これは私がhibernate-core-3.3.0.SP1.jarHSQLDialectに見るものです。

public String getSequenceNextValString(String sequenceName) {
    return "call next value for " + sequenceName;
}

したがって、私のアドバイスは次のとおりです。Hibernateの新しいバージョンにアップグレードすると、Hibernate Core3.2.5以前を使用している可能性が非常に高くなります。

27
Pascal Thivent

どうやらあなたが実行した場合

_SET DATABASE SQL SYNTAX PGS_(PGSはPostgresの略)

次に、select nextval('sequence_name')http://hsqldb.org/doc/guide/dbproperties-chapt.html のような標準のPostgres構文を使用してクエリを実行できます。

また、これを一度実行すると、_call NEXT VALUE FOR SEQUENCE_NAME_のような一般的なHSQLDBシーケンスが機能しなくなることにも注意してください。

2
rogerdpack