处理异常 1) 定义 Oracle 函数时 2) 调用 Oracle 函数时

Posted

技术标签:

【中文标题】处理异常 1) 定义 Oracle 函数时 2) 调用 Oracle 函数时【英文标题】:Handling exception 1) when defining Oracle function 2) When Calling Oracle function 【发布时间】:2019-06-22 15:58:33 【问题描述】:

下面的我的 Oracle 函数(代码 1)没有异常处理。 因此,如果调用(code2)为0,则会显示错误。

--Code 1
CREATE OR REPLACE FUNCTION TEST2
    (P1 IN VARCHAR2)
    RETURN NUMBER AS V_VALUE NUMBER;
    BEGIN
    SELECT(
        SELECT 1/TO_NUMBER(P1)
        FROM DUAL
        )
INTO V_VALUE
FROM DUAL;
RETURN V_VALUE;
END;
/

--Code2 
SELECT TEST2('0') FROM DUAL;

请帮助为每个 1) 2) 情况添加异常处理,如下所示。

case 1) 定义函数时,如何修改code1 如果系统异常,函数返回 -1, 包括除以零吗?

案例 2) 在我的 Oracle 函数中不添加异常, 如果系统异常(包括除零)发生在函数中,如何修改code2以使reslut为-1?

【问题讨论】:

从 Oracle 12.2 开始的预定义异常定义为 here。 zero_divide 是其中之一,但我不确定您想将哪些其他内容归类为系统异常。 value_errorinvalid_number,也许? 【参考方案1】:

我认为你让这变得比它需要的更复杂。我没有在下面编译此代码,但应该作为示例提供。关于异常,处理被零除是可以的,但是隐藏所有其他异常类型是非常非常糟糕的设计。此外,如果我通过 test2(-1),那么结果将是有效值 -1。你确定你的输入参数总是积极的。无论如何,这是一个检查 0 参数并避免除法问题的解决方案。更好的解决方案是将 TEST1 P1 定义为一个 NUMBER 开头,并让调用者根据需要对其进行格式化。如果没有,我可以传入 TEST2('fsfd') 之类的内容并获得异常。

CREATE OR REPLACE FUNCTION TEST2(P1
                       IN VARCHAR2)
    RETURN  NUMBER;
    D_Result NUMBER : = -1;

    BEGIN
    IF P1 <> 0 THEN
      D_result := 1/TO_NUMBER(P1);
    END IF;
RETURN D_Result;
END

如果真的要抛出除法错误,可以catch是这样的:

DECLARE
    result NUMBER;
BEGIN
    result := test2(0);
 EXCEPTION
    WHEN OTHERS THEN
      result := -1;

END;

【讨论】:

【参考方案2】:

@OldProgrammer 展示了如何防止异常发生,这是最好的选择。但是,如果您想允许异常发生并在您可以使用的函数中捕获它:

CREATE OR REPLACE FUNCTION TEST2(P1 IN VARCHAR2)
  RETURN NUMBER
AS
  V_VALUE  NUMBER;
BEGIN
  BEGIN
    V_VALUE := 1 / TO_NUMBER(P1);
  EXCEPTION
    WHEN OTHERS THEN
      V_VALUE := -1;
  END;

  RETURN V_VALUE;
END TEST2;

或者您可以将其简化为

CREATE OR REPLACE FUNCTION TEST2(P1 IN VARCHAR2)
  RETURN NUMBER
AS
BEGIN
  RETURN 1 / TO_NUMBER(P1);
EXCEPTION
  WHEN OTHERS THEN
    RETURN -1;
END TEST2;

【讨论】:

以上是关于处理异常 1) 定义 Oracle 函数时 2) 调用 Oracle 函数时的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE异常处理及函数

Oracle存储过程的异常处理

Oracle异常

ORACLE 异常错误处理

ORA-06510: PL/SQL: 未处理的用户定义异常 [Oracle]

Oracle SQL 异常处理