首页 > 解决方案 > 如何处理 SQL 函数中的异常?

问题描述

我想做一个函数,返回 3 个不同数字之间的最大值。

如果这 3 个数字中的两个具有相同的值,则必须返回异常。

如果 3 个数字不同,我的代码返回最大值,但是当其中两个相同时,它返回错误。怎么了?有什么帮助吗?先感谢您!!

CREATE OR REPLACE FUNCTION NUMEROMAYOR1(num1 NUMBER, num2 NUMBER, num3 NUMBER)
RETURN NUMBER
IS
numeromayor NUMBER;
igualdad EXCEPTION;
BEGIN
IF (num1=num2) OR (num1=num3) OR (num2=num3) THEN
   RAISE igualdad;
   END IF;
   IF (num1>num2) AND (num1>num3) THEN
   numeromayor:=num1;
   ELSIF (num3>num2) AND (num3>num1) THEN
   numeromayor:=num3;
   ELSIF (num2>num1) AND (num2>num3) THEN
   numeromayor:=num2;
   END IF;
   RETURN(numeromayor);
   EXCEPTION
   WHEN igualdad THEN
   dbms_output.put_line('Numbers can't be repeated');
   END;

标签: sqloraclefunctionexceptionplsql

解决方案


一个函数必须要么返回一些东西,要么引发一个异常。此外,所有的括号和单独的if测试(更不用说布局和大写代码)使得很难遵循逻辑。稍微清理一下的版本是:

create or replace function numeromayor1
    ( num1 number
    , num2 number
    , num3 number )
    return number
as
    numeromayor number;
    igualdad    exception;
begin
    if num1 in (num2, num3) or num2 = num3 then
        raise igualdad;
    end if;

    if num1 = greatest(num1, num2, num3) then
        numeromayor := num1;
    elsif num3 = greatest(num1, num2, num3) then
        numeromayor := num3;
    elsif num2 = greatest(num1, num2, num3) then
        numeromayor := num2;
    end if;

    return numeromayor;
exception
    when igualdad then
        raise_application_error(-20000, 'Numbers can''t be repeated');
end numeromayor1;

但我个人会简化它:

create or replace function numeromayor1
    ( num1 number
    , num2 number
    , num3 number )
    return number
as
begin
    if num1 in (num2, num3) or num2 = num3 then
        raise_application_error(-20000, 'Numbers can''t be repeated');
    end if;

    return greatest(num1, num2, num3);
end numeromayor1;

唯一性检查也可以写成更可扩展的风格:

create or replace function numeromayor1
    ( num1 number
    , num2 number
    , num3 number )
    return number
is
    type ntt is table of number;
begin
    if ntt(num1, num2, num3) is not a set then
        raise_application_error(-20000, 'Los números no se pueden repetir');
    end if;

    return greatest(num1, num2, num3);
end numeromayor1;

推荐阅读