我正在尝试创建一个测试数据库(使用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 SCHEMA PERMISSION_TOOLS;
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不支持包.您可以做的是使用不同的名称创建函数,例如: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打开数据库.