2016-01-21 84 views
0

我不得不數組和字符串傳遞給存儲過程,並返回數據表通數組存儲過程

C#側:

public DataTable fetchRequested(string [] empID, string [] account, string [] refNo, string orgID, string Id, DateTime valueDate) 
{ 
      string connetionString = null; 
      OracleConnection con; 
      OracleDataAdapter objAdapter = null; 
      OracleCommand objComm = new OracleCommand(); 

      connetionString = @"Data Source= Payment_devlope; User ID=ORGPAYMENT;Password=OrgPayment"; 
      con = new OracleConnection (connetionString); 

      try 
      { 
       con.Open(); 
       objComm.Connection = con; 
       objComm.CommandType = CommandType.StoredProcedure; 
       objComm.CommandText = "PKG_REPORTS.Requested_Payment"; 

       // Add and Set Procedure Parameters 
       //////////////////////////////////////////////////////////////////// 

        objComm.Parameters.Add("p_empID", OracleDbType.NVarchar2, 100); 
        objComm.Parameters["p_empID"].CollectionType = OracleCollectionType.PLSQLAssociativeArray; 

        if (empID.Length != 0) 
         objComm.Parameters["p_empID"].Value = empID; 

       //////////////////////////////////////////////////////////////////// 

        objComm.Parameters.Add("p_account", OracleDbType.NVarchar2, 100); 
        objComm.Parameters["p_account"].CollectionType = OracleCollectionType.PLSQLAssociativeArray; 

        if (account.Length != 0) 
         objComm.Parameters["p_account"].Value = account; 

       //////////////////////////////////////////////////////////////////// 

       objComm.Parameters.Add("p_refrence_number", OracleDbType.NVarchar2, 100); 
       objComm.Parameters["p_refrence_number"].CollectionType = OracleCollectionType.PLSQLAssociativeArray; 

       if (refNo.Length != 0) 
        objComm.Parameters["p_refrence_number"].Value = refNo; 

       //////////////////////////////////////////////////////////////////// 

       objComm.Parameters.Add("p_Organization_Id", OracleDbType.Varchar2); 
       objComm.Parameters["p_Organization_Id"].Direction = ParameterDirection.Input; 

       if (!String.IsNullOrEmpty(orgID)) 
       { 
        objComm.Parameters["p_Organization_Id"].Value = orgID; 
       } 
       //////////////////////////////////////////////////////////////////// 

       objComm.Parameters.Add("p_Id", OracleDbType.Varchar2); 
       objComm.Parameters["p_Id"].Direction = ParameterDirection.Input; 

       if (!String.IsNullOrEmpty(Id)) 
       { 
        objComm.Parameters["p_Id"].Value = Id; 
       } 
       //////////////////////////////////////////////////////////////////// 

       objComm.Parameters.Add("p_Value_date", OracleDbType.Date); 
       objComm.Parameters["p_Value_date"].Direction = ParameterDirection.Input; 

       if (valueDate == null) 
       { 
        objComm.Parameters["p_Value_date"].Value =valueDate; 
       } 

       //////////////////////////////////////////////////////////////////// 
       objComm.Parameters.Add("cur_report_data", OracleDbType.RefCursor); 
       objComm.Parameters["cur_report_data"].Direction = ParameterDirection.Output; 
       //////////////////////////////////////////////////////////////////// 

       objAdapter = new OracleDataAdapter(); 
       objAdapter.SelectCommand = objComm; 

       // Filling Dataset with searched result 
       DataSet ds = new DataSet(); 
       objAdapter.Fill(ds,"ReportData"); 

       return ds.Tables["ReportData"]; 
      } 
      finally 
      { 
       if (objAdapter != null) 
       { 
        objAdapter.Dispose(); 
        objAdapter = null; 
       } 

       if (objComm != null) 
       { 
        objComm.Dispose(); 
        objComm = null; 
       } 

      } 
} 

PL/SQL側:

Procedure Requested_Payment (

    p_empID    in nvarchar_array := Null , 
    p_account   in nvarchar_array := Null, 
    p_refrence_number in nvarchar_array := Null, 
    p_Organization_Id in nvarchar2  := NULL, 
    p_Id  in nvarchar2  := NULL, 
    p_Value_date  in date   := NULL, 
    cur_report_data  out Data_Table 

) 

is 

BEGIN 
    open cur_report_data for 
    SELECT /*+ index(bp,B_PAYMENT_PK) */ 
      org.ORGANIZATION_CODE org_ID, 
      bm.ID, 
      bd.BENEFICIARY_organization_ID Employee_ID, 
      bd.BENEFICIARY_NAME Employee_Name, 
      bp.REFERENCE_NUMBER Reference_No, 
      bp.CREDIT_ACCOUNT ACC_NO, 
      ct.ENGLISH_DESCRIPTION Reason, 

      from 
       Organization org inner join B_MASTER bm 
       on bm.organization_CODE = org.organization_CODE 
      inner join B_DETAIL bd 

       on bd.MASTER_SEQUENCE_ID = bm.MASTER_SEQUENCE_ID 
      inner join B_payment bp 
       on bp.MASTER_SEQUENCE_ID = bm.MASTER_SEQUENCE_ID 
      inner join CODE_TABLE ct 
       on ct.code = BP.PAYMENT_STATUS 

      where 
       (p_Organization_Id is Null or org.organization_CODE = p_Organization_Id) 
       AND (p_Id is Null OR bm.BATCH_NUMBER = p_Id) 
       AND (p_Value_date is null or bm.Debit_VALUE_DATE between startofday(p_Value_date) and endofday(p_Value_date)) 
       AND (ct.GROUP_CODE = 4) 
       AND (BD.DETAIL_SEQUENCE_ID = BP.DETAIL_ID) 
       AND (p_empID is Null or bd.BENEFICIARY_organization_ID in (Select column_value FROM TABLE (p_empID))) 
       AND (p_account is null or bp.CREDIT_ACCOUNT in (Select column_value FROM TABLE (p_account))) 
       AND (p_refrence_number is null or bp.REFERENCE_NUMBER in (Select column_value FROM TABLE (p_account))) 

;  

    end Requested_Payment ; 

創建類型:

CREATE OR REPLACE TYPE ORGPAYROLL.NVARCHAR_ARRAY 
AS TABLE OF VARCHAR2(100) 

我得到了這個e RROR在Visual Studio中,當陣列中的一個是空的:

OracleParameter.Value無效

,當我通過所有三個陣列我得到這個錯誤:

ORA- 06550:第1行,第7列:
PLS-00306:錯誤數量或類型的在調用 'REQUESTED_PAYMENT'
ORA-06550參數:第1行,第7列:
P LS-00306:錯誤數量或類型的在調用 'REQUESTED_PAYMENT'
ORA-06550參數:第1行,第7列:
PLS-00306:錯誤數量或類型的在調用 'REQUESTED_PAYMENT'
參數ORA- 06550:第1行,第7列:
PL/SQL:語句被忽略

+0

可能有用http://stackoverflow.com/questions/2885575/passing-an-array-of-data-as-an-input-parameter-to-an-oracle-procedure – Irshad

+0

and this http://stackoverflow.com/questions/831188/how-to-create-a-stored-procedure-in-oracle-which-accepts-array-of-parameters – Irshad

回答

0

你的存儲過程,不應該被期待的表型,而不是應該期待associative array。您可以在存儲過程中將其轉換爲您需要的類型。請參閱this link更多詳細信息

+0

但我設置參數的集合類型爲PLSQLAssociativeArray –

+0

感謝您指出。我已經更新了我的答案。問題是存儲過程中使用的類型不正確。 :) – Martin