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 回答