我想将一个字符串数组传递给oracle,并在数据库中获取所有这些值的匹配项。这是我的Proc:
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行 哪一个超出范围?在web中提到的一些引用添加了maxRowsSize,但我在cmd或参数属性中找不到它。
答案 0 :(得分:0)
尝试这个,它编译,但请测试它。
CREATE TYPE myArray AS TABLE of varchar(50);
create or replace procedure CheckExistL(L IN myArray, lotNotMatch OUT myArray) AS
j number:=1;
cnt number :=0;
BEGIN
lotNotMatch := new myArray();
lotNotMatch.EXTEND(L.count);
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;