Java H2数据库和单独模式中的函数

Java H2数据库和单独模式中的函数,java,database,testing,h2,Java,Database,Testing,H2,我正在尝试创建一个测试数据库(使用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;

我正在尝试创建一个测试数据库(使用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]
这并没有给我们任何关于这里发生的事情的线索


感谢您的帮助。

H2不支持软件包。您可以使用不同的名称创建函数,例如:权限\工具\获取\访问\级别。缺点是您还需要更改查询。或者,您可以在其中创建一个模式权限工具和方法:

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版,因为在早期版本中有一个与此功能相关的bug已修复。创建该方法的缺点是使用一种特殊的模式:如果您在公共模式以外的模式中创建此类函数,则无法使用较旧版本的H2打开数据库。

要回答@thomas mueller,如果您不关心该过程的作用。H2使用此模式调用存储过程

database.schema.procedure\u name

因此,如果您正在测试,请给测试数据库起一个名称,比如说
test
,在代码中调用存储过程的方式就像
calltest.PERMISSION\u TOOLS.GET\u ACCESS\u LEVEL


请参见

中的我的答案实际上我一直在测试这个解决方案,但是版本不合适。谢谢你的注意,我会马上试试。@thomas mueller如果我有schema.functional,上面的解决方案非常有效。但我需要schema.packagename.functionname。怎么处理?