c#调用Oracle的Procedure Return数组

时间:2016-08-26 22:17:54

标签: c# oracle database-connection oracle-sqldeveloper

我想将一个字符串数组传递给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或参数属性中找不到它。

1 个答案:

答案 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;