在使用Oracle模式时,H2是否支持PLSQL?

And*_*nov 4 java oracle plsql h2

我正在尝试使用H2内存数据库为我们的Java应用程序编写一些功能测试.由于我们使用Oracle作为生产数据库,因此一些代码是用PL/SQL编写的.所以我打开了Oracle兼容模式,现在我的网址看起来像这样:jdbc:h2:mem:test;MODE=Oracle.

我遇到麻烦的实际应用程序代码看起来像这样(注意,序列和表都是在调用之前创建的):

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

它失败了,我写的这个示例代码测试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()
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

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]
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:begin ... end;H2支持哪些块?如果是,上面的代码可能有什么问题?

谢谢.

Mik*_*unu 8

不,H2 Oracle兼容模式并不意味着支持这样的PL/SQL.正如H2文档中所述,Oracle兼容模式带来了以下内容:

  • 对于别名列,ResultSetMetaData.getColumnName()返回别名,getTableName()返回null.
  • 使用唯一索引时,允许在所有列中包含NULL的多行,但是不允许多行具有相同的值.
  • 将NULL与另一个值连接会产生另一个值.

  • 那很难过.您是否知道任何其他可以在内存模式下用于测试的轻量级DB,并且会为PL/SQL块提供支持? (3认同)