C# C“调用Oracle函数-错误:”;对空数据的操作无效";

C# C“调用Oracle函数-错误:”;对空数据的操作无效";,c#,oracle,C#,Oracle,当我的C#代码调用Oracle函数时,我得到一个错误“对空数据的操作无效”。只有在找不到数据时才会发生这种情况。若找到数据并且函数返回一个值,那个么一切正常。我有点困惑,至少据我所知,如果没有找到数据,函数应该返回100(参见函数异常) Oracle功能: create or replace FUNCTION F_SCO_DPD ( p_tip IN NUMBER, p_dav IN VARCHAR2 ) RETURN NUMBER IS sco NUMBER; BEG

当我的C#代码调用Oracle函数时,我得到一个错误“对空数据的操作无效”。只有在找不到数据时才会发生这种情况。若找到数据并且函数返回一个值,那个么一切正常。我有点困惑,至少据我所知,如果没有找到数据,函数应该返回100(参见函数异常)

Oracle功能:

create or replace FUNCTION F_SCO_DPD
(
    p_tip IN NUMBER,
    p_dav IN VARCHAR2
)
RETURN NUMBER 
IS
    sco NUMBER;
BEGIN
    SELECT max(score) keep(dense_rank first order by vrednost)
        INTO sco
        FROM sco_sif_score
        WHERE sif_kat = 11
        AND tip_pod = p_tip
        AND vrednost >= (SELECT a.dpd
                         FROM sco_dpd a                                      
                         WHERE a.par_davcna = p_dav);
    RETURN sco;
EXCEPTION
        WHEN NO_DATA_FOUND 
        THEN 
             RETURN 100;   
END F_SCO_DPD;
C#代码:


您正在运行聚合函数
max(score)keep(由vrednost进行密集排序)
max(score)
一样是一个聚合函数

这意味着您的查询是一个聚合查询,没有
分组依据
。所有这些查询只返回一行。如果没有与
WHERE
子句匹配的行,则该值为
NULL

因此,永远不会触发异常。相反,检查返回值是否为
NULL

生成的代码是:

create or replace FUNCTION F_SCO_DPD
(
    p_tip IN NUMBER,
    p_dav IN VARCHAR2
)
RETURN NUMBER 
IS
    v_sco NUMBER;
BEGIN
    SELECT max(score) keep (dense_rank first order by vrednost)
    INTO v_sco
    FROM sco_sif_score
    WHERE sif_kat = 11 AND
          tip_pod = p_tip AND
          vrednost >= (SELECT a.dpd
                       FROM sco_dpd a                                      
                       WHERE a.par_davcna = p_dav
                      );

    RETURN COALESCE(v_sco, 100);
END F_SCO_DPD;

谢谢,戈登。感谢您迅速的回复和非常清楚的解释。当然,它现在正在按预期工作。学到了一些新东西,所以谢谢你。我对你的答案投了赞成票,但不能像我一样被看到
create or replace FUNCTION F_SCO_DPD
(
    p_tip IN NUMBER,
    p_dav IN VARCHAR2
)
RETURN NUMBER 
IS
    v_sco NUMBER;
BEGIN
    SELECT max(score) keep (dense_rank first order by vrednost)
    INTO v_sco
    FROM sco_sif_score
    WHERE sif_kat = 11 AND
          tip_pod = p_tip AND
          vrednost >= (SELECT a.dpd
                       FROM sco_dpd a                                      
                       WHERE a.par_davcna = p_dav
                      );

    RETURN COALESCE(v_sco, 100);
END F_SCO_DPD;