2016-08-26 11 views
0

私は、文字列の配列を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やパラメータのプロパティでそれを見つけることができませんでした。

+0

Oracleの配列は、 'J番号変更してみてください、1から始まるようだ:= 1;' – Vijai

+0

おかげVijai、今私は別のエラーを取得しています:実行バインド長 –

答えて

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; 
+0

異なる コンパイル・バインド長を私は エラー(7,24):PLS-00222:このスコープに 'MYARRAY'という名前の関数がありません。 –

+0

'myArray'を作成するコードを更新しました。 – Vijai

関連する問題