2016-07-26 8 views
0

3つの異なる配列をパラメータとして取り込むプロシージャをコールしようとしましたが、これを行うためにさまざまな方法を試しましたが、またはパラメータの型が間違っています。 あなたは私が間違っていることを正確に理解するのを手助けできますか?問題C#でのOracle Arrayパラメータのバインド

これは、これまでの私のコードです:

using (var command = new OracleCommand(sql, connection)) 
      { 
       command.CommandType = CommandType.StoredProcedure; 
       command.BindByName = true; 
       command.Connection.Open(); 

       //Bind Client Ids Array to Database Parameter 
       var nArrClientId = new OracleParameter("nArrClientId", OracleDbType.Int32) 
       { 
        Size = clientIds.Length, 
        ArrayBindSize = new int[clientIds.Length],       
        Direction = ParameterDirection.Input, 
        CollectionType = OracleCollectionType.PLSQLAssociativeArray 
       }; 

       for (var index = 0; index < clientIds.Length; index++) 
       { 
        nArrClientId.ArrayBindSize[index] = 12;      
       } 
       nArrClientId.Value = clientIds; 

       //Bind DocNames Array to Database Parameter 
       var vArrDocNum = new OracleParameter("vArrDocNum", OracleDbType.Varchar2) 
       { 
        Size = docNums.Length, 
        ArrayBindSize = new int[docNums.Length],       
        Direction = ParameterDirection.Input, 
        CollectionType = OracleCollectionType.PLSQLAssociativeArray 
       }; 
       for (var index = 0; index < docNums.Length; index++) 
       { 
        vArrDocNum.ArrayBindSize[index] = 20;       
       } 
       vArrDocNum.Value = docNums; 

       //Bind Status Array to Database Parameter 
       var vArrStatus = new OracleParameter("vArrStatus", OracleDbType.Varchar2) 
       { 
        Size = statusArr.Length, 
        ArrayBindSize = new int[statusArr.Length],      
        Direction = ParameterDirection.Input, 
        CollectionType = OracleCollectionType.PLSQLAssociativeArray 
       }; 
       for (var index = 0; index < statusArr.Length; index++) 
       { 
        vArrStatus.ArrayBindSize[index] = 15;       
       } 
       vArrStatus.Value = statusArr; 

       command.Parameters.Add(nArrClientId); 
       command.Parameters.Add(vArrDocNum); 
       command.Parameters.Add(vArrStatus);     

       command.ExecuteNonQuery(); 
       connection.Close();     
       command.Connection.Close(); 
      } 

は、これは、Oracle

TYPE tnClientId IS TABLE OF clients.id%TYPE INDEX by pls_integer; -- Number (12,0) 
TYPE tvDocNumber IS TABLE OF documents.document_number%TYPE INDEX by pls_integer; --VARCHAR2 (20 BYTES) 

TYPE tvStatus IS TABLE OF varchar2(15); 


PROCEDURE update_status (nArrClientId IN tnClientId, 
        vArrDocNum  IN tvDocNumber, 
        vArrStatus  IN tvStatus); 

の操作手順の定義であるすべてのヘルプは、あなたがNested tableを使用することはできません

+0

PL/SQLテーブルは使用できません。連想配列を使用する必要があります。つまり、INDEX BY ... –

+0

意味が分かりません。 –

答えて

1

を歓迎以上である、あなたが使用する必要があります。連想配列。

I.e. TYPE tvStatus IS TABLE OF varchar2(15);あなたが

TYPE tvStatus IS TABLE OF varchar2(15) INDEX by pls_integer;

clientIdsdocNumsstatusArrの種類は何を使用しなければならないことはできませんか?それらは配列でなければならないかもしれません。vArrDocNum.Value = docNums.ToArray();