1

Mono を使用して、Oracle データベースで関数を呼び出す必要がありました。この関数には、2 つの入力パラメーターと 1 つの出力パラメーターがあります。

最初に、.Net ランタイムでテストしました。次の非常に単純なコードがその仕事をしました:

var dbcon = new OracleConnection("my connection string");
dbcon.Open();

OracleCommand cmd = dbcon.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "my_pkg.my_func";

OracleParameter p = new OracleParameter("ReturnValue", OracleType.Number);
p.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(p);

p = new OracleParameter("p_in1", OracleType.VarChar);
p.Size = 5;
p.Direction = ParameterDirection.Input;
p.Value = p1;
cmd.Parameters.Add(p);

p = new OracleParameter("p_in2", OracleType.VarChar);
p.Size = 20;
p.Direction = ParameterDirection.Input;
p.Value = p2;
cmd.Parameters.Add(p);

p = new OracleParameter("p_out", OracleType.VarChar);
p.Direction = ParameterDirection.Output;
p.Size = 512;
cmd.Parameters.Add(p);    

cmd.ExecuteNonQuery();

return cmd.Parameters["p_out"].Value.ToString();

ただし、ターゲットOSがLinuxなので、ランタイム( Utilities=>Options=>.Net Runtimes )をMono(ver.2.10.9)に変更しました。私が最初に経験した問題は、で言及されたバグでした

  1. バグ 10164 - System.Data.OracleClient.OracleParameter.SetOracleType が System.NullReferenceException をスローする
  2. System.Data.OracleClient.OracleParameter.SetOracleType() バグ?

私が理解している限り、唯一の方法は、出力パラメーターであってもOracleParameter.Valuebeforeを設定するOracleParameter.OracleTypeことです...したがって、コードは次のように変更されました

p = new OracleParameter();
p.ParameterName = "p_in1";
p.Size = 5;
p.Direction = ParameterDirection.Input;    
p.Value = code.ToString ();                
p.OracleType = OracleType.VarChar;

NullReferenceException姿を消しましたが、別のものが現れました。

PLS-00306: 'my_func'へのコールの引数の数またはタイプが正しくありません

ORA-06550: 行1、列7: PL/SQL: 文は無視されました

Mono - Oracle: System.Data.OracleClient の現在のステータスで述べられているように:

Input/Output and Return parameters have not been tested.

ParameterDirection.ReturnValueサポートされていますか?

または、.Net ランタイムで動作し、Mono では動作しないのはなぜですか?

4

0 に答える 0