java – 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;
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打开数据库.

上一篇:java – 找不到适合jdbc的驱动程序:h2:tcp


下一篇:java – 查找集合字段包含任何给定项的所有条目