Oracle SQL Server のパッケージ内にストアド プロシージャがあります。このプロシージャには、入力パラメータと出力パラメータがあります。プロシージャ自体は機能し、Oracle SQL Developer で実行すると、出力パラメータは期待される出力 (最後の行の列値) を読み取ります。このプロシージャは、ODP.NET (Oracle Managed Data Access) を介して Web API によって呼び出される必要があります。
問題: 出力パラメーター (ODP では Long 型、db では NUMBER(12,0) 型) が返されません。コマンドの実行後、出力パラメータは常に DBNull です。
以下は、私のコードの関連部分です (他のパラメーターは省略されています): パッケージ プロシージャ:
PROCEDURE post_event (event_id OUT OPIS_REGISTRATIE_PROJ.PROJECT_ID%TYPE)
IS BEGIN
-- Some stuff that's happening (that works)
SELECT MAX(PROJECT_ID) INTO event_id FROM OPIS_REGISTRATIE_PROJ WHERE PERSOON_ID = worksheet_id;
END;
使用されるパラメーター:
parameters.Add(new OracleParameter("event_id", OracleDbType.Long, ParameterDirection.Output));
C# の呼び出しコード:
if (con.State == ConnectionState.Open)
{
// Create command and set parameters
using (var cmd = new OracleCommand(cmdText, con))
{
cmd.CommandType = CommandType.StoredProcedure;
foreach (var p in parameters)
{
cmd.Parameters.Add(p);
}
// Execute the stored procedure
try
{
cmd.ExecuteNonQuery();
}
catch (OracleException ex)
{
Console.WriteLine(ex.Message);
}
long paramEventId = 0;
if (cmd.Parameters["event_id"].Value != DBNull.Value)
{
paramEventId = (long)(OracleDecimal)cmd.Parameters["event_id"].Value;
}
ご覧のとおり、DBNull 値をチェックする方法は知っていますが、それは問題ではありません。DBNull 値を取得することは想定されていません。
これまでに試したいくつかのこと:
- パラメータ DBType を Int64 などに変更します (他のパラメータでは、パラメータ タイプに関するエラーが正しく表示されます)。
- 値でハードコードされた event_id を設定します (event_id := 1234567;)
- SELECT MAX(... クエリをプロシージャの外でデータベース内で直接実行します。
SQL Developerで試したことはすべて期待どおりに機能します。問題があるのは、呼び出し元の C# API への Output パラメーターの転送です。私はたくさんグーグルで検索し、Stackoverflowも検索したので、誰かがうまくいく答えを手伝ってくれることを願っています.