函数没有return期望值,当最大值returns为NULL

Function does not return expected value, when max value returns NULL

我已经创建了函数来 return 数据集中的最大数量,如果数据集存在,即如果 MAX return 是一个值,它工作正常。

如果没有匹配的数据集,我需要 return 值为 0,但无论我尝试什么,检索要么等于无值,要么找不到数据。

已尝试如下 when no data foundwhen othersnull values 但如果未找到最大值,则无法将此函数设为 return 0,即,如果 MAX值 returns NULL.

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;
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;