2015-06-26 53 views
0

我收到以下Oracle錯誤:Oracle存儲過程PLS-00306:錯號碼或類型的參數

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

我讀了這個錯誤,有人說,如果你是傳遞一個不同的值類型的存儲過程類型可以使這個錯誤,但它似乎並不是我的情況。

enter image description here

我的大部分編碼的幾乎是相同的我有什麼(他們的工作)。與此不同的是我也使用了布爾值,所以我不確定是否也會導致問題。

Protected Sub BtnNew_Click(sender As Object, e As EventArgs) Handles BtnNew.Click 
    Dim conn As OleDbConnection = New OleDbConnection("Provider=""*******"";user id=" & strUserID & ";data source=" & strDatabase & ";password=" & strPssWd) 

    If Page.IsValid Then 

     If CatText.Text <> "" Then 


      Dim ClassifiedStr As New OleDbCommand 

      ClassifiedStr.CommandType = CommandType.StoredProcedure 
      'name of stored procedure = 'insert_category' 
      ClassifiedStr.CommandText = "insert_category" 
      ClassifiedStr.Connection = conn 

      'Must be organized based on Stored Procedure 
      ClassifiedStr.Parameters.Add("val_category", OleDbType.VarChar, 40).Value = CatText.Text 
      conn.Open() 

      'Makes sure the Category doesn't already exist**************** 
      Dim myParm As OleDbParameter = ClassifiedStr.Parameters.Add("val_newcat", OleDbType.Boolean) 
      myParm.Direction = ParameterDirection.Output 

      ClassifiedStr.ExecuteNonQuery() 
      'myParm needs Execute 
      Dim standardid As Integer = myParm.Value 
      '*********************************************** 

      If standardid = False Then 

       conn.Close() 

       Response.Write("<script language=""javascript"">alert('Thanks! Record Has Been Added.');</script>") 
       Response.Redirect("DisplayCategories.aspx") 
      Else 
       Response.Write("<script language=""javascript"">alert('Sorry! Record Already Exist.');</script>") 
       Exit Sub 
      End If 

     Else 
      Response.Write("<script language=""javascript"">alert('You must insert a record.');</script>") 
      Exit Sub 
     End If 

    End If 

End Sub 

存儲過程

CREATE OR REPLACE PROCEDURE insert_category 
(val_category  TABLENAME.Category%type, 
val_newcat out boolean) 

as num_catid number; 

begin 

select category_seq.nextval into num_catid from dual; 

    INSERT INTO TABLENAME 
    (select num_catid, val_category from TABLENAME WHERE Category != val_Category); 

commit; 

    val_newcat := SQL%FOUND; 

end; 
+0

更改您的存儲過程使用合併,這樣的SP可以確定它是否應該插入或更新。這也將清理你的VB。 – Chuck

+0

將您的'TABLENAME.Category%type'更改爲'varchar2'。請記住,你使用OleDb,這是不理想的。切換到Oracle的ODP.net。 –

+0

我從來沒有做過一個合併之前,但我已經完成像上面的存儲過程,他們工作得很好。 (所以我不認爲我必須使用合併)也@ T.S。我的其他存儲過程使用%類型沒有問題。只是由於某種原因,我有這個問題 – narue1992

回答

0

更新是固定的問題:

Dim ClassifiedStr As New OleDbCommand 

ClassifiedStr.CommandType = CommandType.StoredProcedure 
'name of stored procedure = 'insert_category' 
ClassifiedStr.CommandText = "insert_category" 
ClassifiedStr.Connection = conn 

'Must be organized based on Stored Procedure 
ClassifiedStr.Parameters.Add("val_category", OleDbType.VarChar, 40).Value = CatText.Text 
conn.Open() 

'Makes sure the Category doesn't already exist 
Dim myParm As OleDbParameter = ClassifiedStr.Parameters.Add("val_newcat", OleDbType.VarChar, 10) 
myParm.Direction = ParameterDirection.Output 

ClassifiedStr.ExecuteNonQuery() 
'myParm needs Execute before declared 

Dim standardid As String = myParm.Value 

'*********************************************** 

If standardid = "TRUE" Then 

    conn.Close() 
    etc.... 

存儲過程:

(val_category  t_category.Category%type,  
val_newcat out varchar2)  

as num_catid number;  

begin  

select newCategory_seq.nextval into num_catid from dual;   

INSERT INTO TABLENAME  
select num_catid, val_category from dual WHERE not exists (select * from TABLENAME where Category = val_Category);  

val_newcat := case SQL%FOUND when TRUE then 'TRUE' else 'FALSE' end;  

commit;  

end;  
相關問題