sql - 如何处理 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;
解决方案
一个函数必须要么返回一些东西,要么引发一个异常。此外,所有的括号和单独的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;
推荐阅读
- linux - 在作为 Selenium Grid 运行的 Linux Docker 容器上忽略边缘浏览器选项
- javascript - 使用 dayjs 获取 beforeDate
- java - 获取 MediaPlayer 专辑封面作为位图
- python - 从 OneDrive 读取 Python 文件
- python - Python Unittest - 来自boto资源S3存储桶的模拟客户端错误
- three.js - 如何减少 Cannon RaycastVehicle 内的车身晃动
- mongodb - 如何为 $ 和 mongodb 动态形成对象?
- symfony5 - 安装文件系统组件后找不到ckeditor
- javascript - 检查数组中每个子项的出现频率
- permissions - (Discord.py) 如何锁定和解锁语音通道