2017-02-27 6 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

関連する問題