2009年4月24日金曜日

C# oracle 連想配列 配列 CLOB

C#でoracleのTableにCLOBのデータを格納したい。
一レコードではなく、複数レコードあるのでまとめて格納したい。

知っている知識として、連想配列を使用する方法を試してみたがエラーが出る。
マニアックなプログラミング備忘録
「内部エラー・コード、引数: [15419],[severe error during PL/SQL execution],[],[],[],[],[],[]」

CommandTypeはTextを指定していたのでそれがいけないのかと思い、ストアドにしてみた。
結果同じエラーが発生。

CLOB以外はうまく行くのでどうやらCLOBでは連想配列を使用出来ないみたい。
10gを使っているので、もしかしたら11gならうまく行くかもしれないけどね。

以下通常版
using(OracleCommand cmd = new (sql, con))
{
cmd.BindName=true;
cmd.CommandType = CommandType.Text;
OracleParameter parm = new OracleParameter("iINPUT", value);
cmd.Parameters.Add(parm);
cmd.ExecuteNonQuery();
}

以下連想配列版
OracleParameter parm = new OracleParameters("iINPUT", OracleDbType.Varchar2, valueList.Count);
parm.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
parm.Direction = ParameterDirection.Input;
parm.Value = valueList.ToArray();
cmd.Parameters.Add(parm);

以下配列
cmd.ArrayBindCount = valueList.Count;
OracleParameter parm = new OracleParameters("iINPUT", OracleDbType.Clob, valueList.Count);
parm.Direction = ParameterDirection.Input;
parm.Value = valueList.ToArray();
cmd.Parameters.Add(parm);

配列バージョンだとCLOBで格納できた。
配列のままをストアドに渡すのか、渡した配列数分繰り返しストアドを実行するのか。
どっちが良いかわからんけど、CLOBでは配列しか出来ないので悩む必要はないかな。
一回一回クライアント側から引数渡して実行するよりは圧倒的に早いだろう。
たぶん。

0 コメント: