форматирование (или предоставление строки) сообщений об исключениях в Oracle - PullRequest
2 голосов
/ 06 сентября 2010

В базе данных Oracle есть параметризованные сообщения об ошибках. Например, есть 01919, 00000, «роль«% s »не существует» в oraus.msg. Если кто-то выдаст какую-то глупость, GRANT ... TO ...% s будет заменен этой несуществующей привилегией. Можно вызвать исключение -1919 и передать некоторую строку в% s?

Код:

not_system_privilege EXCEPTION;
    PRAGMA EXCEPTION_INIT(not_system_privilege, -01919);
.......
RAISE not_system_privilege;

выдает только ORA-01919: role '' does not exist сообщение.

Ответы [ 2 ]

3 голосов
/ 06 сентября 2010

Цель пользовательских исключений состоит в том, что мы можем перехватывать определенные исключения в разделе исключений нашей программы PL / SQL и элегантно обрабатывать их. Например, если мы поместим немного мяса в ваш фрагмент кода ....

create or replace grant_priv 
    ( p_priv in varchar2
      , p_grantee in varchar2 )
is
    not_system_privilege EXCEPTION;
    PRAGMA EXCEPTION_INIT(not_system_privilege, -01919);  
begin
    execute immediate 'grant '||p_priv||' to '||p_grantee;
exception
    when not_system_privilege then
        raise_application_error(-20000, p_priv||' is not a real privilege', true);
    when others then
        raise;

конец;

Мы можем поместить что угодно в раздел ИСКЛЮЧЕНИЯ. Зарегистрируйте ошибку в таблице или файле, поднимите оповещения, что угодно. Рекомендуется распространять исключение вверх: только самый верхний уровень стека вызовов - уровень, обращенный к пользователю - не должен отбрасывать исключения.

0 голосов
/ 07 сентября 2010

Наблюдение - похоже, вы можете использовать utl_lms.format_message для печати в стиле C - жаль, что я знал бы это раньше (как бы сэкономил написание). Кажется, только Ora10 и выше.

begin
    dbms_output.put_line(
       utl_lms.format_message( 
       'A %s is here and a %s is there and a %s too','Giraffe','Lion','Spider'));
 end;

Я не вижу способа удовлетворить требование OP - поднять исключение системного уровня и подставить правильный параметр.

Однако, если вы можете использовать другой номер исключения, вы можете написать собственную процедуру обработки исключений, которая может

а) взять в сериале необходимое исключение б) использовать utl_lms.get_message для получения текста c) использовать format_message для замены в параметрах d) вызвать пользовательское исключение, используя сгенерированный текст

Проблема в том, что это не сработает, если ваша вызывающая система ожидает ORA-01919.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...