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

时间:2012-08-16 12:04:35

标签: 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;");

它失败并出现与我编写的用于测试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]

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

感谢。

1 个答案:

答案 0 :(得分:8)

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

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