Plsql 当max value返回NULL时,函数不返回预期值
我已经创建了一个函数来从数据集中返回最大值,如果数据集存在,也就是说,如果最大值返回一个值,这个函数可以正常工作 如果没有匹配的数据集,我需要返回一个值0,但无论我尝试什么,检索要么等于no value,要么得到no data found 当Plsql 当max value返回NULL时,函数不返回预期值,plsql,oracle11g,null,case,coalesce,Plsql,Oracle11g,Null,Case,Coalesce,我已经创建了一个函数来从数据集中返回最大值,如果数据集存在,也就是说,如果最大值返回一个值,这个函数可以正常工作 如果没有匹配的数据集,我需要返回一个值0,但无论我尝试什么,检索要么等于no value,要么得到no data found 当未找到数据时,当其他人和空值时尝试如下,但如果未找到最大值,即如果最大值返回空值,则无法使此函数返回0 CREATE OR REPLACE FUNCTION OPC_OP.sitezone_msm (in_site_id AW_ACTIVE_ALAR
未找到数据时
,当其他人
和空值时
尝试如下,但如果未找到最大值,即如果最大值返回空值
,则无法使此函数返回0
CREATE OR REPLACE FUNCTION OPC_OP.sitezone_msm
(in_site_id AW_ACTIVE_ALARMS.site_id%TYPE
,in_zone_id AW_ACTIVE_ALARMS.zone_id%TYPE
,in_mod AW_ACTIVE_ALARMS.module%TYPE)
RETURN NUMBER
IS
v_msm NUMBER;
NULL_VALUES EXCEPTION;
BEGIN
SELECT MAX(AW_ACTIVE_ALARMS.weight)
INTO v_msm
FROM AW_ACTIVE_ALARMS
WHERE AW_ACTIVE_ALARMS.site_id = in_site_id
AND AW_ACTIVE_ALARMS.zone_id = in_zone_id
AND AW_ACTIVE_ALARMS.module LIKE in_mod||'%';
RETURN (v_msm);
EXCEPTION
WHEN NULL_VALUES
THEN
RETURN 0;
END sitezone_msm;
已经花了一段时间玩这个游戏,但无法得到想要的结果和非常受欢迎的建议试试这个:
CREATE OR REPLACE FUNCTION OPC_OP.sitezone_msm
(in_site_id AW_ACTIVE_ALARMS.site_id%TYPE
,in_zone_id AW_ACTIVE_ALARMS.zone_id%TYPE
,in_mod AW_ACTIVE_ALARMS.module%TYPE)
RETURN NUMBER
IS
v_msm NUMBER;
BEGIN
SELECT COALESCE(MAX(AW_ACTIVE_ALARMS.weight),0)
INTO v_msm
FROM AW_ACTIVE_ALARMS
WHERE AW_ACTIVE_ALARMS.site_id = in_site_id
AND AW_ACTIVE_ALARMS.zone_id = in_zone_id
AND AW_ACTIVE_ALARMS.module LIKE in_mod||'%';
RETURN (v_msm);
END sitezone_msm;
谢谢你,托尼,这就成功了。我猜,即使where子句没有找到匹配项,select max也不会引发异常?没错,聚合函数(没有GROUP BY)从不引发no_DATA_FOUND异常当max(AW_ACTIVE_ALARMS.weight)为空时,您可以尝试
select案例,然后0 ELSE max(AW_ACTIVE_ALARMS.weight).
Try this NVL function is generally used for handling NULL values
CREATE OR REPLACE FUNCTION OPC_OP.sitezone_msm
(in_site_id AW_ACTIVE_ALARMS.site_id%TYPE
,in_zone_id AW_ACTIVE_ALARMS.zone_id%TYPE
,in_mod AW_ACTIVE_ALARMS.module%TYPE)
RETURN NUMBER
IS
v_msm NUMBER;
--NULL_VALUES EXCEPTION; -- not required
BEGIN
SELECT nvl(MAX(AW_ACTIVE_ALARMS.weight),0)
INTO v_msm
FROM AW_ACTIVE_ALARMS
WHERE AW_ACTIVE_ALARMS.site_id = in_site_id
AND AW_ACTIVE_ALARMS.zone_id = in_zone_id
AND AW_ACTIVE_ALARMS.module LIKE in_mod||'%';
RETURN (v_msm);
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END sitezone_msm;