0

NPoco ORM を使用しており、Oracle 関数から結果を取得しようとしています。私が試してみました:

    public string GetData(int param1, int param2)
    {
        var command = "PKG_SOMEPACKAGE.SET_DATA( @p_param1, @p_param2);";
        var sql = Sql.Builder.Append(command, new { p_param1 = 10, p_param2 = 20 });
        string result = this.Db.ExecuteScalar<string>(sql);

        return result;
    }

しかし、それは機能せず、戻りますORA-00900: invalid SQL statement

Oracle 関数は次のようになります。

function SET_DATA
( 
    p_param1 IN NUMBER,
    p_param2 IN NUMBER
) return varchar2 IS

BEGIN

    IF some condition is true THEN
      RETURN 'Y';         
    END IF;

    -- some logic

    RETURN 'N';
END;
4

2 に答える 2

1

このような前に試してみましたが、SQLを書いたときにラップされたバージョンが含まれていたため、例外であるラップされたSQLが発生しました。以下のように SQL を記述すれば、問題なく動作します。この呼び出しでは、JSON データを関数に送信し、結果を取得しています。

public string UpdateParticipant(ParticipantUpdate Participant)
{
    string ret = "";
    IsoDateTimeConverter dt = new IsoDateTimeConverter();
    dt.DateTimeFormat = "MM-dd-yyyy"; // we must have this format for our dates
    string json = JsonConvert.SerializeObject(Participant, dt);
    // Creating this output parameter is the key to getting the info back.
    var result = new OracleParameter
    {
        ParameterName = "RESULT",
        Direction = System.Data.ParameterDirection.InputOutput,
        Size = 100,
        OracleDbType = OracleDbType.Varchar2
    };
    // Now, setting the SQL like this using the result as the output parameter is what does the job.
    string sql = $@"DECLARE result varchar2(1000); BEGIN  @0 := WEBUSER.F_UpdateParticipant(@1); END;";
    var res = _db.db.Execute(sql, result, json);

    // Now return the value of the Output parameter!!

    ret = result.Value.ToString();
    return ret;
}
于 2016-09-08T16:44:20.373 に答える
0

Oracle クライアントで関数の実行を実行して、SQL ステートメントが機能していることを確認します。潜在的にコードを変更するよりも。それでもうまくいかない場合は、いくつかのデータベース プロファイラー (たとえば、mssql にはデータベース プロファイラーがあります) を実行して、アプリケーションが実際に Oracle サーバーに送信している SQL ステートメントを確認します。

于 2016-01-31T12:19:17.383 に答える