2017-02-27 44 views
1

當我的C#代碼調用Oracle函數時,出現「空數據操作無效」錯誤。只有在找不到數據時纔會發生這種情況。如果找到數據並且函數返回一個值,那麼一切正常。我有點困惑,因爲 - 至少我的理解 - 如果沒有找到數據,函數應該返回100(參見函數異常)。C#調用Oracle函數 - 錯誤:「空數據無效操作」

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#代碼:

using (OracleCommand cmd = new OracleCommand()) 
{ 
    cmd.Connection = conn; 
    cmd.CommandText = "F_SCO_DPD"; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add(new OracleParameter("p_tip", Podjetje.TipSub)); 
    cmd.Parameters.Add(new OracleParameter("p_dav", Podjetje.Davcna)); 
    cmd.Parameters.Add(new OracleParameter("sco", OracleDbType.Decimal, ParameterDirection.ReturnValue)); 
    cmd.BindByName = true; 

    cmd.ExecuteScalar(); 

    Score.ScoDpd = (int)(OracleDecimal)cmd.Parameters["sco"].Value;          
} 

回答

2

您正在運行的聚合功能。 max(score) keep (dense_rank first order by vrednost)max(score)一樣具有聚合功能。

這意味着您的查詢是沒有GROUP BY的聚合查詢。所有這樣的查詢返回正好 1行。如果沒有行匹配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; 
+0

謝謝,戈登。您的迅速答覆和非常明確的解釋。當然,它現在按預期工作。學到了新東西,所以謝謝你。贊成你的答案,但不能被看到,因爲我的聲望<15。 – Flin