2010-09-06 3 views
2

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

Код:

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

ответ

3

Цель пользовательских исключений заключается в том, что мы можем замаскировать определенные исключения в разделе исключений нашей программы 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; 

конец;

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

+0

Спасибо за ответ, но UTL_LMS, похоже, лучше соответствует моим требованиям. –

0

Замечание. По-видимому, вы можете использовать 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; 

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

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

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

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

Смежные вопросы