2012-12-04 28 views
0

我有有一個參數和一個輸出參數如下存儲過程的參數類型:ORA-06550,錯號碼或呼叫到Oracle存儲過程

create or replace procedure worker_name (w_id in number, w_first out worker.first_name%type) is 

Begin 
    select first_name into w_first 
    from worker 
    where worker_id = w_id; 
end; 

代碼來調用這個存儲過程:

public DataTable <b>GetEmployeeName</b>(int _employeeID) 
{ 
      ArrayList arrEmployeeName = new ArrayList(); 
      OracleParameter paramEmployeeId = new OracleParameter(":employeeid", _employeeID); 
      arrEmployeeName.Add(paramEmployeeId); 
      DataLayer obj = new DataLayer(); 
      DataTable tblEmployee = obj.<b>GetData</b>("macw_conv.worker_name", arrEmployeeName, "SP"); 

      if (tblEmployee.Rows.Count &gt; 0) 
      { 
       return tblEmployee; 
      } 
      return null; 
     } 

public DataTable <b>GetData</b>(string query, ArrayList parameters,string queryType) 
{ 
      //DataTable dt = new DataTable(); 
      try 
      { 
       _con = 
        new OracleConnection(Oradb); 
       _con.Open(); 
       _cmd = new OracleCommand(query, _con); 
       if (_cmd.Connection.State == ConnectionState.Open) 
       { 
        if (queryType == "SP" &amp;&amp; parameters != null) 
        { 
         _cmd.CommandType = CommandType.StoredProcedure; 
         if (parameters.Count &gt; 0) 
         { 
          foreach (OracleParameter param in parameters) 
          { 
           _cmd.Parameters.Add(param); 
          } 
         } 
        } 
       } 
       DataSet ds = new DataSet(); 
       OracleDataAdapter da = new OracleDataAdapter(_cmd); 
       da.Fill(ds); 
       if (ds.Tables.Count &gt; 0) 
       { 
        return ds.Tables[0]; 
       } 
       return null; 
      } 

我想我無法看到明顯的錯誤。這與存儲過程中的out參數與代碼中的輸出參數之間的數據類型不匹配有關。任何形式的幫助表示讚賞。

謝謝!

我想通了這個問題:這是因爲保存out參數的變量的數據類型處理不當。我改變了代碼如下:

try 
{ 
      _con = new OracleConnection(Oradb); 
      _cmd = _con.CreateCommand(); 
      _cmd.CommandType = CommandType.StoredProcedure; 
      _cmd.CommandText = "macw_conv.worker_name"; 

      OracleParameter inobj1 = _cmd.Parameters.Add("w_id", OracleDbType.Int32,50); 
      inobj1.Direction = ParameterDirection.Input; 
      inobj1.Value = _employeeID; 

      OracleParameter inobj2 = _cmd.Parameters.Add("w_last", OracleDbType.Int32, 50); 
      inobj2.Direction = ParameterDirection.Input; 
      inobj2.Value = String.IsNullOrEmpty(_lastName) ? null : _lastName; 


      OracleParameter outobj = _cmd.Parameters.Add("w_first", OracleDbType.Varchar2, 50); 
      outobj.Direction = ParameterDirection.Output; 
      _con.Open(); 
      _cmd.ExecuteNonQuery(); 
      _employeeName = ((OracleString) _cmd.Parameters[1].Value).ToString(); 
      _cmd.Dispose(); 
      _con.Close(); 
} 
catch (OracleException ex) 
{ 
    Console.WriteLine(ex.Message); 
} 

return _employeeName; 

回答

0

嘗試

public DataTable GetEmployeeName(int _employeeID) 
     { 
      ArrayList arrEmployeeName = new ArrayList(); 

      OracleParameter paramEmployeeId = new OracleParameter("employeeid", _employeeID); 
      arrEmployeeName.Add(paramEmployeeId); 

      OracleParameter paramEmployeeFirst = new OracleParameter("first", OracleDbType.Varchar2, ParameterDirection.Output); 
      arrEmployeeName.Add(paramEmployeeFirst); 

      DataLayer obj = new DataLayer(); 
      DataTable tblEmployee = obj.GetData("macw_conv.worker_name(:1,:2)", arrEmployeeName, "SP"); 
      if (tblEmployee.Rows.Count &gt; 0) 
      { 
       return tblEmployee; 
      } 
      return null; 
     }