OracleParameter への配列バインディングを使用して、Oracle SQL クエリのパフォーマンスを向上させようとしています。
これは基本的に私がやろうとしていることです:
List<string> IDValList = new List<string>();
IDValList.Add( "IDOne" );
IDValList.Add( "IDTwo" );
List<int> sizes = new List<int>();
foreach( string id in IDValList )
{
sizes.Add( id.Length );
}
using( OracleCommand cmd = new OracleCommand( "select col1, col2, col3 from table where col4 in ( :idArray )", _conn ) )
{
cmd.CommandType = System.Data.CommandType.Text;
OracleParameter arrayParam = new OracleParameter( "idArray", OracleDbType.Varchar2 );
arrayParam.Direction = System.Data.ParameterDirection.Input;
arrayParam.Value = IDValList.ToArray();
arrayParam.ArrayBindSize = sizes.ToArray();
cmd.ArrayBindCount = IDValList.Count;
cmd.Parameters.Add( arrayParam );
using( OracleDataReader dr = cmd.ExecuteReader() )
{
while( dr.Read() )
{
// now read the row...
これはコンパイルして実行しますが、最初の ID に対して常に 1 行しか返されません。パラメータの配列の残りの値を無視するようなものです。
興味深いことに、パラメーターの ArrayBindStatus はすべての値に対して成功しています。
私は何が欠けていますか?それとも、これは OracleReader では機能しませんか?
ありがとう
編集: 基本的に、私はこの例に従おうとしていますが、DataReader を使用してクエリから結果のデータセットを読み取れるようにしたいと考えています。
http://www.oracle.com/technology/oramag/oracle/09-sep/o59odpnet.html