База данных H2 и функции в отдельных схемах - PullRequest
3 голосов
/ 09 июля 2010

Я пытаюсь создать тестовую базу данных (с базой данных H2).Я использую Oracle в производственной среде, и мне кажется неплохим иметь режим совместимости с 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;

, которую я 'm звонит с:

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]

Это не дает никакой подсказки, какздесь происходит.

Любая помощь приветствуется.

1 Ответ

6 голосов
/ 09 июля 2010

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;

Пожалуйста, не делайте этого, пока это не будет работать во второй версии 1.2.131 H2 (это версия, которую вы используете в соответствии с полученным кодом сообщения об ошибке).Причина в том, что «функции в схемах» были реализованы совсем недавно (в версии 1.2.135).На самом деле я предлагаю обновить до версии 1.2.138, потому что была исправлена ​​ошибка, связанная с этой функцией в более ранних версиях.Недостатком создания метода является специальная схема: если вы создаете такие функции в схемах, отличных от PUBLIC, то база данных не может быть открыта с более старыми версиями H2.

...