Plsql 当max value返回NULL时,函数不返回预期值

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,但无论我尝试什么,检索要么等于no value,要么得到no data found

未找到数据时
当其他人
空值时
尝试如下,但如果未找到最大值,即如果最大值返回
空值
,则无法使此函数返回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;