我正在尝试创建一个测试数据库(使用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]
这并没有给出任何关于这里的线索。
任何帮助表示感谢。
答案 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中查看我的答案