我正在尝试使用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;
块吗?如果是,上面的代码可能有什么问题?
感谢。
答案 0 :(得分:8)
不,H2 Oracle兼容模式并不意味着支持这样的PL / SQL。正如H2 documentation中所述,Oracle兼容模式带来了以下内容:
- 对于别名列,ResultSetMetaData.getColumnName()返回别名,getTableName()返回null。
- 使用唯一索引时,允许在所有列中包含NULL的多行,但不允许多行包含 否则就是相同的值。
- 将NULL与另一个值连接会产生另一个值。