3

テスト データベースを作成しようとしています (H2 データベースを使用)。私は本番環境で Oracle を使用していますが、h2 に 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当量に。私は次のようなことを試みてきました:

スキーマ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]

これは、ここで起こっていることについての手がかりを与えません。

どんな助けでも感謝します。

4

2 に答える 2

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 でデータベースを開くことができなくなります。

于 2010-07-09T14:12:17.540 に答える