3

我正在尝试创建一个测试数据库(使用 H2 数据库)。我在生产中使用 Oracle,在 h2 中具有 oracle 兼容模式似乎很好。

但是,我在翻译 oracle 构造时遇到了问题:

create or replace PACKAGE permission_tools IS
    FUNCTION get_role_access_level(
          p_role_id IN NUMBER,
          p_permiss IN VARCHAR2)
    RETURN NUMBER;
END permission_tools;

我打电话给:

select permission_tools.get_access_level(?, ?) from dual;

转化为 H2 当量。我一直在尝试类似的东西:

创建模式权限_工具;

CREATE ALIAS PERMISSION_TOOLS.GET_ACCESS_LEVEL as $$
String nextPrime(String value) {
    return new BigInteger(value).nextProbablePrime().toString();
}
$$;

但这给了我编译错误:

org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "

CREATE ALIAS PERMISSION_TOOLS.[*]GET_ACCESS_LEVEL AS   
String nextPrime(String value) {
    return new BigInteger(value).nextProbablePrime().toString();
}
   "; expected "FOR"; SQL statement:


CREATE ALIAS PERMISSION_TOOLS.GET_ACCESS_LEVEL as $$
String nextPrime(String value) {
    return new BigInteger(value).nextProbablePrime().toString();
}
$$ [42001-131]

这并没有给出任何关于这里发生的线索。

任何帮助表示赞赏。

4

2 回答 2

6

H2 不支持包。您可以做的是使用不同的名称创建函数,例如:PERMISSION_TOOLS_GET_ACCESS_LEVEL。缺点是您还需要更改查询。或者,您创建一个架构 PERMISSION_TOOLS 和那里的方法:

create schema PERMISSION_TOOLS;
CREATE ALIAS PERMISSION_TOOLS.GET_ACCESS_LEVEL as $$
String nextPrime(String value) {
    return new BigInteger(value).nextProbablePrime().toString();
}
$$;
select permission_tools.get_access_level(1) from dual;

请注意,这在 H2 版本 1.2.131(根据您得到的错误消息代码是您正在使用的版本)中还不能工作。原因是“模式中的功能”是最近才实现的(在 1.2.135 版中)。实际上我建议升级到 1.2.138 版本,因为在早期版本中修复了与此功能相关的错误。创建该方法的缺点是一个特殊的模式是:如果你确实在 PUBLIC 以外的模式中创建了这样的函数,那么旧版本的 H2 无法打开数据库。

于 2010-07-09T14:12:17.540 回答
0

回答@thomas-mueller,如果您不关心程序的作用。H2 使用这种模式来调用存储过程

database.schema.procedure_name

因此,如果您正在测试给测试数据库一个名称test,那么您在代码中调用存储过程的方式就像call test.PERMISSION_TOOLS.GET_ACCESS_LEVEL

See my answer in How to define oracle package procedure in h2 for testing

于 2019-07-17T14:24:23.397 回答