2017-04-15 200 views
0

另一個程序使用的函數處理異常我有這樣的功能:從在Oracle SQL Developer中

CREATE OR REPLACE FUNCTION TEST_FUNCTION (p_test IN NUMBER) RETURN NUMBER 
AS 
    my_exception EXCEPTION; 
    PRAGMA EXCEPTION_INIT(my_exception, -20001); 
BEGIN 
    IF (p_test = 0) THEN 
     RAISE my_exception; 
    ELSE 
     RETURN 1; 
    END IF; 
EXCEPTION 
    WHEN my_exception THEN 
     raise_application_error(-20001, 'p_test = 1'); 
     RETURN 0; 
END; 

存在使用我的函數的過程。問題是,當我的函數引發錯誤20001時,該過程無法處理異常;當我嘗試編譯它時,我得到了PLS-00201: identifier my_exception must be declared

如果我在不處理此異常的情況下運行該過程,它仍會拋出異常和錯誤代碼,並停止執行。我該如何處理my_exception

回答

2

您已在函數的專用名稱空間中聲明my_exception。這意味着它對任何其他程序單元都是隱藏的。

這是包裝的一個優勢:任何事情,我們在包裝規格聲明是提供給我們的模式(或其他用戶的任何其他程序,如果我們授予了他們的執行權限

所以,你可以這樣做:

CREATE OR REPLACE PACKAGE app_exceptions 
AS 
    my_exception EXCEPTION; 
    PRAGMA EXCEPTION_INIT(my_exception, -20001); 
end; 
/

現在你的函數應該是這樣的:

CREATE OR REPLACE FUNCTION TEST_FUNCTION (p_test IN NUMBER) RETURN NUMBER 
AS 
BEGIN 
    IF (p_test = 0) THEN 
     RAISE app_exceptions.my_exception; 
    ELSE 
     RETURN 1; 
    END IF; 
END; 

如果我們想調用程序來處理異常(通常我們這樣做),它的罰款只是宣傳它。

您的通話過程將是這個樣子:

.... 
    l_n := TEST_FUNCTION (l_whatever); 
exception 
    when app_exceptions.my_exception then 
     -- handling code here 
0

你目前的代碼是這樣做的:1。 的過程調用TEST_FUNCTION。 2. TEST_FUNCTION引發my_exception。 3. TEST_FUNCTION捕獲my_exception並將其替換爲-20001 4.調用過程收到用戶定義的異常-20001。

據我瞭解你的要求是: 1.一個過程調用TEST_FUNCTION。 2. TEST_FUNCTION引發用戶定義的異常(my_exception)-20001。 3.調用過程應該處理錯誤。

要讓調用過程處理,您需要將my_exception的聲明和他的編譯指示移動到該過程,從TEST_FUNCTION中刪除異常塊並直接在TEST_FUNCTION中引發用戶定義的錯誤。然後在調用過程中處理my_exception。

SO:

create or replace 
function test_function (p_test in number) 
    return number 
as 
begin 
    if (p_test = 0) then 
     raise_application_error(-20001,'p_test = 0'); 
    end if; 
    return 1; 
end test_function; 

create or replace 
procedure caller_for_test_function 
is 
    my_exception EXCEPTION; 
    PRAGMA EXCEPTION_INIT(my_exception, -20001); 

    x number; 
begin 
    ... 
    x := text_function(0); 
    ... 
exception 
    when my_exception then 
     <Handle my_exception here>; 

end caller_for_test_function; 

當然也有擺出代碼的許多其他有效方式,但主要的想法是,異常申報和附註指令 需要在過程/函數,句柄錯誤,而不是引發錯誤的錯誤。