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

时间:2010-07-09 12:00:55

标签: 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;
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]

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

任何帮助表示感谢。

2 个答案:

答案 0 :(得分: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打开数据库。

答案 1 :(得分:0)

要回答@ thomas-mueller,如果您不关心该过程做什么。 H2使用此模式来调用存储过程

database.schema.procedure_name

因此,如果您要进行测试,请给测试数据库起一个test的名称,而在代码中调用存储过程的方式将类似于call test.PERMISSION_TOOLS.GET_ACCESS_LEVEL

How to define oracle package procedure in h2 for testing中查看我的答案