Java H2数据库和单独模式中的函数
我正在尝试创建一个测试数据库(使用H2数据库)。我在生产中使用Oracle,在h2中使用Oracle兼容模式似乎很不错 但是,我在翻译oracle构造时遇到了一个问题: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;
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。怎么处理?