2010-09-06 91 views
2

Oracle數據庫中存在參數化錯誤消息。例如,在oraus.msg中有01919,00000,「角色'%s'不存在」。 如果有人發出一些廢話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; 

end;

我們可以將任何東西放在EXCEPTIONS部分。將錯誤記錄在表或文件中,引發警報,無論如何。向上傳播異常是一個好習慣:只有callstack的最頂層 - 面向用戶的層 - 不應拋出異常。

+0

感謝您的回覆,但UTL_LMS似乎更符合我的要求。 – 2010-09-07 06:09:04

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; 

我看不到任何方法來滿足OP的要求 - 提升系統級的異常並替換正確的參數。

不過,如果你可以使用一個不同的異常數量的生活,你可以寫自己的異常處理程序,可以

一)採取必要的例外 B的串行)使用utl_lms.get_message檢索文字 C)使用format_message在參數 d代替)使用生成的文本

的問題是,這是行不通的,如果你的呼叫系統預計的ORA-01919提高用戶定義的異常。