2017-04-15 160 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; 

当然也有摆出代码的许多其他有效方式,但主要的想法是,异常申报和附注指令 需要在过程/函数,句柄错误,而不是引发错误的错误。