【问题标题】:H2 database and functions in separate schemasH2 数据库和函数在不同的模式中
【发布时间】:2011-03-13 20:16:18
【问题描述】:

我正在尝试创建一个测试数据库(使用 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 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]

这并不能说明这里发生了什么。

任何帮助表示赞赏。

【问题讨论】:

    标签: java database testing h2


    【解决方案1】:

    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 无法打开数据库。

    【讨论】:

    • 实际上我一直在测试这个解决方案,但是版本不合适。感谢您的关注,将立即尝试。
    • @thomas-mueller 如果我有 schema.functioname,上述解决方案效果很好。但我有 schema.packagename.functionname 的要求。如何处理?
    【解决方案2】:

    回答@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查看我的回答

    【讨论】:

      猜你喜欢
      • 2012-08-17
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多