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)に変更しました。私が最初に経験した問題は、で言及されたバグでした
- バグ 10164 - System.Data.OracleClient.OracleParameter.SetOracleType が System.NullReferenceException をスローする
- System.Data.OracleClient.OracleParameter.SetOracleType() バグ?
私が理解している限り、唯一の方法は、出力パラメーターであってもOracleParameter.Value
beforeを設定する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 では動作しないのはなぜですか?