私は、文字列の配列をOracleに渡し、データベース内のそれらの値に一致しないものをすべて取得したいと考えています。ここに私のprocは次のとおりです。c#Oracleのプロシージャを呼び出す返す配列
TYPE myArray IS TABLE of varchar(50) INDEX BY PLS_INTEGER;
create or replace PACKAGE BODY TEST AS
procedure CheckExistL(L IN myArray, lotNotMatch OUT myArray) AS
j number:=0;
cnt number :=0;
BEGIN
FOR i IN 1..L.count LOOP
select COUNT(*) INTO cnt FROM myTable
WHERE L01 = L(i);
if (cnt = 0)
then
lotNotmatch(j):=L(i);
j := j + 1;
end if;
END LOOP;
END CheckExistL;
END TEST;
and in my C# my code is
using (OracleCommand cmd = connection.CreateCommand())
{
//
cmd.BindByName = true;
cmd.ArrayBindCount = myArray.Count();
cmd.CommandText = "TEST.CheckExistLPNDetailLottables";
cmd.CommandType = CommandType.StoredProcedure;
cmd.BindByName = true;
OracleParameter P_In = new OracleParameter("L", OracleDbType.Varchar2, 50);
P_In.Direction = ParameterDirection.Input;
P_In.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
P_In.ArrayBindSize = new int[L.Count()];
P_In.Size = myArray.Count();
P_In.Value = myArray;
cmd.Parameters.Add(P_In);
OracleParameter P_result = new OracleParameter("lotNotMatch", OracleDbType.Varchar2, 50);
P_result.Direction = ParameterDirection.Output;
P_result.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
P_result.Size = myArray.Count();
P_result.ArrayBindSize = new int[myArray.Count()];
cmd.Parameters.Add(P_result);
cmd.Parameters["L"].Value = myArray;
cmd.ExecuteNonQuery();
var arrNotMatch = cmd.Parameters["lotNotMatch"].Value;
}
私はすべてのエラーのコンパイルを取得しないとexcuteNonQueryがあるとき、私はOracleのエラーを取得: ORA-06513:PL/SQL:のための範囲の外PL/SQLテーブルのインデックスをホスト言語配列 ORA-06512:1行目 どれが範囲外ですか? maxRowsSizeを追加するために言及されたWebのいくつかの参照ですが、cmdやパラメータのプロパティでそれを見つけることができませんでした。
Oracleの配列は、 'J番号変更してみてください、1から始まるようだ:= 1;' – Vijai
おかげVijai、今私は別のエラーを取得しています:実行バインド長 –