0

戻り値の型が数値の Oracle 関数を呼び出そうとしています。OleDB を使用して C# から呼び出していますが、Oracle での型番号のマッピングは 10 進数であることを理解しています。これを呼び出すたびに、0 が返されます。

using (OleDbCommand _cmdDueAtDock = new OleDbCommand()) {

   _cmdDueAtDock.Connection = connection;
   _cmdDueAtDock.CommandType = CommandType.StoredProcedure;
   _cmdDueAtDock.CommandText = "IFSAPP.PURCHASE_ORDER_LINE_API.GET_DUE_AT_DOCK";

   _cmdDueAtDock.Parameters.Add(new OleDbParameter() {
       ParameterName = "rv_",
       OleDbType = OleDbType.Decimal,
       Direction = ParameterDirection.ReturnValue
   });
   _cmdDueAtDock.Parameters.Add(new OleDbParameter() {
       ParameterName = "order_no_",
       OleDbType = OleDbType.VarChar,
       Size = 50,
       Direction = ParameterDirection.Input,
       Value = _order_line.ORDER_NO
   });
   _cmdDueAtDock.Parameters.Add(new OleDbParameter() {
       ParameterName = "line_no_",
       OleDbType = OleDbType.VarChar,
       Size = 50,
       Direction = ParameterDirection.Input,
       Value = _order_line.LINE_NO
   });
   _cmdDueAtDock.Parameters.Add(new OleDbParameter() {
       ParameterName = "release_no_",
       OleDbType = OleDbType.VarChar,
       Size = 50,
       Direction = ParameterDirection.Input,
       Value = _order_line.RELEASE_NO
   });

   try {
      _cmdDueAtDock.ExecuteNonQuery();
      dueAtDock = Convert.ToDecimal(_cmdDueAtDock.Parameters["rv_"].Value);
   } catch (Exception ex)  {
      dueAtDock = 0;
   }
}

を使用してOracle client 11.2.0おり、Oracle データベースのバージョンは10.2.0.4.0.

11.1クライアントに問題があることについて読んだことがあります.11.1クライアントの動作を実際にシミュレートすることがselect to_char(function) from dualできましto_charた. クライアントを 11.2 にアップグレードすると、この問題はローカルで解決されます。0to_char

4

2 に答える 2

1

あなたの応答に感謝しますが、それはデータベース トランザクションとコード実行の順序に依存していました。このコードの前に、関数の結果に影響を与える何かを実行していたコード ブロックがありました。

私の行方不明が頭を悩ませている他の誰かに役立つことを願っています!

ドム

于 2015-12-01T16:52:39.863 に答える
0

私の推測では、catch ブロックが常にトリップしているため、値は常に 0 です。明白な犯人が 1 人と、別の可能性がある人が見えます。ストアド プロシージャが次のようになっていると仮定しています。

create or replace procedure GET_DUE_AT_DOCK(
  order_no_ in varchar2,
  line_no_ in varchar2,
  release_no_ in varchar2,
  rv_ out number
) as
BEGIN
  rv_ := 999;
END;

の代わりにあなたのParameterDirectionプロパティが必要だと思います。私は間違っている可能性がありますが、句がある通常の SQL コマンドで使用されると思います。たとえば、次のようになります。OutputReturnValueReturnValueRETURNING

insert into foo (name, birthday)
values (:NAME, :BIRTHDAY)
returning unique_id into :ID;

間違っているかもしれませんが、私はそう思います。

次に、ストアド プロシージャの場合、パラメータの宣言が重要であり、プロシージャ内の実際のパラメータと一致させる必要があると思います。上記の例が概念的に正しい場合、パラメーターをその正確な順序 (order_no、line_no、release_no、rv) に配置する必要があります。ストアド プロシージャを実際に見ないと、なんとも言えませんが、実際には正しいかもしれません。

したがって、SP が私の例のように見えると仮定すると、次のようになります。

_cmdDueAtDock.Parameters.Add(new OleDbParameter() {
    ParameterName = "order_no_", OleDbType = OleDbType.VarChar,
    Direction = ParameterDirection.Input, Value = _order_line.ORDER_NO });
_cmdDueAtDock.Parameters.Add(new OleDbParameter() {
    ParameterName = "line_no_", OleDbType = OleDbType.VarChar,
    Direction = ParameterDirection.Input, Value = _order_line.LINE_NO });
_cmdDueAtDock.Parameters.Add(new OleDbParameter() {
    ParameterName = "release_no_", OleDbType = OleDbType.VarChar,
    Direction = ParameterDirection.Input, Value = _order_line.RELEASE_NO });
_cmdDueAtDock.Parameters.Add(new OleDbParameter() {
    ParameterName = "rv_", OleDbType = OleDbType.Decimal,
    Direction = ParameterDirection.Output });   /// <- change is here

try
{
    _cmdDueAtDock.ExecuteNonQuery();
    decimal dueAtDock = Convert.ToDecimal(_cmdDueAtDock.Parameters[3].Value);
}
catch (Exception ex)
{
    decimal dueAtDock = 0;
}
于 2015-12-01T14:22:25.560 に答える