4

H2インメモリデータベースを使用して、Javaアプリケーションの機能テストを作成しようとしています。Oracle を運用データベースとして使用しているため、一部のコードは PL/SQL で記述されています。そこで、Oracle 互換モードをオンにすると、URL は次のようになりますjdbc:h2:mem:test;MODE=Oracle

私が問題を抱えている実際のアプリケーションコードは次のようになります (呼び出しの前にシーケンスとテーブルの両方が作成されていることに注意してください)。

CallableStatement = con.prepareCall(
    " begin insert into profiles(" + PROFILE_FIELDS + ") " +
    " values (sq_profiles.nextval, ?, ?, ?, ?, ?) " + 
    " returning profile_id into ?; end;");

動作をテストするために書いたこのサンプルコードと同じエラーで失敗します。begin ... end;

Connection con = connectionProvider.getConnection()
con.prepareStatement("CREATE TABLE test (id INT NOT NULL)").execute()
con.prepareStatement("INSERT INTO test SELECT 1 FROM dual").execute()
con.prepareStatement("BEGIN INSERT INTO test SELECT 2 FROM dual; END;").execute()

私が得るエラー:

Syntax error in SQL statement "BEGIN INSERT[*] INTO TEST SELECT 2 FROM DUAL; END; "; SQL statement:
BEGIN INSERT INTO test SELECT 2 FROM dual; END; [42000-167]

私の質問は、begin ... end;ブロックは H2 でサポートされていますか? はいの場合、上記のコードのどこが間違っている可能性がありますか?

ありがとう。

4

1 に答える 1

9

いいえ、H2 Oracle 互換モードは、そのような PL/SQL のサポートを意味するものではありません。H2 ドキュメントで説明されているように、Oracle 互換モードでは次のことが可能になります。

  • エイリアス化された列の場合、ResultSetMetaData.getColumnName() はエイリアス名を返し、getTableName() は null を返します。
  • 一意のインデックスを使用する場合、すべての列に NULL を持つ複数の行が許可されますが、それ以外の場合は同じ値を持つ複数の行を持つことは許可されません。
  • NULL を別の値と連結すると、別の値になります。
于 2012-08-16T12:20:35.457 に答える