2012-09-20 156 views
0

這裏是我的程序和它的作品通過PL/SQL開發人員:ORA-06550:錯號碼或類型的呼叫參數 'CHECK_INFO_INS'

create or replace procedure CHECK_INFO_INS 
(
    p_id_aircraft IN VARCHAR2,   
    p_id_check_type IN NUMBER,  
    p_last_check IN DATE,    
    p_next_check IN DATE,    
    p_expectedcost IN NUMBER,        
    p_id_currency IN NUMBER, 
    p_currency_rate IN NUMBER       
)    
is 
Rate number; 
CurrentDate Date; 
catID Checkcategories.Id%type; 
begin 
select C.ID into catID from CHECKCATEGORIES C WHERE C.NAME='C' and C.CHECKTYPEID = p_id_check_type; 

    Rate:=round(p_expectedcost/MONTHS_BETWEEN(p_next_check, p_last_check),3)*p_currency_rate; 
    CurrentDate := SYSDATE; 
    INSERT INTO CHECK_INFO 
    (
     id_check_info,    
     id_aircraft,    
     id_check_categories,  
     last_check,    
     next_check,    
     expectedcost,    
     is_accumulation_complited, 
     rate,      
     id_currency,    
     current_date,    
     monthes_between, 
     CURENCY_RATE    
) 
    values 
    (
    CHECKS_INFO_SEQ.NEXTVAL, 
    p_id_aircraft, 
    catID, 
    p_last_check, 
    p_next_check, 
    p_expectedcost, 
    0, 
    Rate, 
    p_id_currency, 
    CurrentDate, 
    round(MONTHS_BETWEEN(p_next_check, p_last_check),1), 
    p_currency_rate 
); 
    commit; 
    EXCEPTION 
    WHEN OTHERS 
    THEN 
     DBMS_OUTPUT.PUT_LINE(SQLERRM); 
     ROLLBACK; 
end CHECK_INFO_INS; 

這裏是我的C#代碼:

 decimal expectedCost = Decimal.Parse(ExpCostTextBox.Text); 
     DateTime lastCheck = DateTime.Parse(LastCheckdateTimePicker.Text); 
     DateTime nextCheck = DateTime.Parse(NextCheckdateTimePicker.Text); 
     int checkType = int.Parse(ChCmbx.SelectedValue.ToString()); 
     string AirCraft = AirCraftCmbx.SelectedValue.ToString(); 
     int curID = int.Parse(CurrComboBox.SelectedValue.ToString()); 
     decimal curRate = decimal.Parse(CurRateTextBox.Text.Replace('.',',')); 


     con = new OracleConnection(conStr); 
     con.Open(); 
     cmd = con.CreateCommand(); 
     cmd.BindByName = true; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = schema_name + ".CHECK_INFO_INS"; 

     cmd.Parameters.Add("p_id_aircraft", OracleDbType.NVarchar2, AirCraft, ParameterDirection.Input); 
     cmd.Parameters.Add("p_id_check_categories", OracleDbType.Int32, checkType, ParameterDirection.Input); 
     cmd.Parameters.Add("lastCheck", OracleDbType.Date, lastCheck, ParameterDirection.Input); 
     cmd.Parameters.Add("nextCheck", OracleDbType.Date, nextCheck, ParameterDirection.Input); 
     cmd.Parameters.Add("p_expectedcost", OracleDbType.Decimal, expectedCost, ParameterDirection.Input); 
     cmd.Parameters.Add("p_id_currency", OracleDbType.Int32, curID, ParameterDirection.Input); 
     cmd.Parameters.Add("p_currency_rate", OracleDbType.Decimal, curRate, ParameterDirection.Input); 
     cmd.ExecuteNonQuery(); 

它輕視爲ExecuteNonQuery線異常:

ORA-06550: line 1, column 7: 
PLS-00306: wrong number or types of arguments in call to 'CHECK_INFO_INS' 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

我試圖重新創建過程,但沒有奏效。我的C#代碼有什麼問題?

回答

2

我對Oracle不是很熟悉,但程序中的第二個參數名爲「p_id_check_type」,而當您將參數添加到參數集合中時,您使用名稱「p_id_check_categories」。可能是你的問題?

0

在參數列表和SQL語句中,Oracle參數名都應以冒號(如:p_currency_rate)開頭。

+0

我應該在哪裏更改我的代碼? – Nate

+2

在您的parameters.Add調用中,並在存儲過程的SQL語句中。 –

0

克里斯是正確的,

你在你調用存儲過程使用了錯誤的參數名稱。在存儲過程中發現

cmd.Parameters.Add("p_id_check_categories", OracleDbType.Int32, checkType, ParameterDirection.Input); 
cmd.Parameters.Add("lastCheck", OracleDbType.Date, lastCheck, ParameterDirection.Input); 
     cmd.Parameters.Add("nextCheck", OracleDbType.Date, nextCheck, ParameterDirection.Input); 

它應該是相同的參數值,像這樣:

在你的來電來訪

所以

cmd.Parameters.Add("p_id_check_type", OracleDbType.Int32, checkType, ParameterDirection.Input); 
cmd.Parameters.Add("p_last_check", OracleDbType.Date, lastCheck, ParameterDirection.Input); 
     cmd.Parameters.Add("p_next_check", OracleDbType.Date, nextCheck, ParameterDirection.Input); 

至少每當我遇到這個問題:

PLS-00306:調用 'CHECK_INFO_INS'時出現錯誤數量或類型的參數'

這通常是每當我遇到這個問題的原因,除非我有參數錯誤的順序。