web-dev-qa-db-ja.com

H2(Oracle MODE)「構文エラー:SELECT NEXTVAL FROM [*] DUAL」に関するアイデアはありますか?

OracleモードでH2(v1.3.154)を使用すると、次のエラーが発生します。

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.h2.Driver" />
        <property name="url" value="jdbc:h2:mem:testdb;MODE=Oracle" />
        <property name="username" value="sa" />
        <property name="password" value="" />
</bean>

およびHibernatev3.5.6用のOracleダイアレクト:

hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

エラー :

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT 
SQ_PERSON_ID.NEXTVAL FROM[*] DUAL "; expected "identifier"; SQL statement:
select SQ_PERSON_ID.nextval from dual [42001-154]
at org.h2.message.DbException.getJdbcSQLException(DbException.Java:327)
at org.h2.message.DbException.get(DbException.Java:167)
at org.h2.message.DbException.getSyntaxError(DbException.Java:192)
at org.h2.command.Parser.readColumnIdentifier(Parser.Java:2752)
at org.h2.command.Parser.readTermObjectDot(Parser.Java:2311)
at org.h2.command.Parser.readTerm(Parser.Java:2428)
at org.h2.command.Parser.readFactor(Parser.Java:2025)
at org.h2.command.Parser.readSum(Parser.Java:2012)
at org.h2.command.Parser.readConcat(Parser.Java:1985)
at org.h2.command.Parser.readCondition(Parser.Java:1850)
at org.h2.command.Parser.readAnd(Parser.Java:1831)
at org.h2.command.Parser.readExpression(Parser.Java:1823)
at org.h2.command.Parser.parseSelectSimpleSelectPart(Parser.Java:1736)
at org.h2.command.Parser.parseSelectSimple(Parser.Java:1768)
at org.h2.command.Parser.parseSelectSub(Parser.Java:1663)
at org.h2.command.Parser.parseSelectUnion(Parser.Java:1508)
at org.h2.command.Parser.parseSelect(Parser.Java:1496)
at org.h2.command.Parser.parsePrepared(Parser.Java:401)
at org.h2.command.Parser.parse(Parser.Java:275)
at org.h2.command.Parser.parse(Parser.Java:247)
at org.h2.command.Parser.prepare(Parser.Java:201)
at org.h2.command.Parser.prepareCommand(Parser.Java:214)
at org.h2.engine.Session.prepareLocal(Session.Java:426)
at org.h2.engine.Session.prepareCommand(Session.Java:374)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.Java:1100)
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.Java:71)
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.Java:243)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.Java:534)
at org.hibernate.jdbc.AbstractBatcher.prepareSelectStatement(AbstractBatcher.Java:145)
at org.hibernate.id.enhanced.SequenceStructure$1.getNextValue(SequenceStructure.Java:106)
... 81 more

何が起こるかについてのアイデア、私の設定のミス? この投稿 を見つけてパッチを試してみましたが、エラーは解決しません。ご協力いただきありがとうございます !

16
Jerome VDL

シーケンスが作成されていることを確認してください。それが作成された場合、それは私のために働きます:

create sequence SQ_PERSON_ID;
select SQ_PERSON_ID.nextval from dual;

作成されていない場合は、取得したものと同じエラーメッセージがスローされます。

13
Thomas Mueller

シーケンスが作成されたのと同じスキーマを使用しているかどうかを確認してください。そうでない場合は、シーケンス名の前にスキーマプレフィックスを挿入します(MYUSER.MY_SEQなど)。

2
voho

私はOracleモードでh2に取り組んでいましたが、上記のすべてのソリューションが機能しませんでした。いくつかの調査の結果、このクエリはシーケンス内の次の値をフェッチするために正常に機能することがわかりました。

select nextval('SchemaName', 'SequenceName');

2
Ashwani Sharma

@longliveenduroが述べたように

それは間違いなく「シーケンスが存在しない」と言うH2の方法です。

まったく同じ問題が発生し、シーケンスがh2のメモリ内DBに作成されていないことがわかりました。私は追加することで問題を解決しました:

CREATE SEQUENCE SQ_PERSON_ID
MINVALUE 1
MAXVALUE 9223372036854775807
START WITH 1
INCREMENT BY 1
CACHE 8
NOCYCLE;

で:test/resources/schema.sql

それは私のために働いた。

1
Rega

考えられるHibernateの問題は別として、SAユーザーは、別のスキーマにあるように見えるシーケンスに対して選択権限を持っていますか? (ドキュメントの を参照してください)。

0
Alex Poole