Asp.net Oracle存储过程PLS-00306:参数的数量或类型错误

Asp.net Oracle存储过程PLS-00306:参数的数量或类型错误,asp.net,vb.net,stored-procedures,oracle10g,runtime-error,Asp.net,Vb.net,Stored Procedures,Oracle10g,Runtime Error,我收到以下oracle错误: 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 我仔细阅读了这个错误,有人说,如果将不同的值类型传递给存储过程类型,则可能会发生此错误,但对我来说似乎不是这样 我的大部分编码几乎与我所拥有的完全相同

我收到以下oracle错误:

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
我仔细阅读了这个错误,有人说,如果将不同的值类型传递给存储过程类型,则可能会发生此错误,但对我来说似乎不是这样

我的大部分编码几乎与我所拥有的完全相同,而且它们都是有效的。与此唯一不同的是,我也在使用布尔值,所以我不确定这是否也会导致问题

受保护的子BtnNew\u Clicksender作为对象,e作为事件参数处理BtnNew。单击 作为OleDbConnection的Dim conn=新的OleDbConnectionProvider=*****;用户id=&strUserID&;数据源=&strDatabase&;密码=&strpswd 如果Page.is有效,则 如果是CatText.Text,那么 Dim分类器作为新的OLEDB命令 ClassifiedStr.CommandType=CommandType.StoredProcess '存储过程的名称='插入\u类别' ClassifiedStr.CommandText=插入_类别 ClassifiedStr.Connection=conn '必须基于存储过程进行组织 ClassifiedStr.Parameters.Addval_category,OleDbType.VarChar,40.Value=CatText.Text 康涅狄格州公开赛 '确保该类别不存在**************** Dim myParm作为OLEDBPParameter=ClassifiedStr.Parameters.Addval_newcat,OleDbType.Boolean myParm.Direction=参数Direction.Output ClassifiedStr.ExecuteOnQuery “myParm需要执行 Dim STANDARID为整数=myParm.Value '*********************************************** 如果standardid=False,则 关闭连接 回复。写下“谢谢!已添加记录。“; Response.RedirectDisplayCategories.aspx 其他的 回复,写下“对不起!记录已存在。“; 出口接头 如果结束 其他的 Writealert“您必须插入一条记录”; 出口接头 如果结束 如果结束 端接头 存储过程

创建或替换过程插入\u类别 val_类别表名。类别%type, val_newcat out布尔值 作为num_catid编号; 开始 从dual中选择category_seq.nextval to num_catid; 插入到表名中 从TABLENAME中选择num_catid,val_category,其中category!=瓦卢类; 犯罪 val_newcat:=SQL%已找到; 终止
更新该修复问题:

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;     

将存储过程更改为使用合并,这样SP就可以确定是否应该插入或更新存储过程。这也会清理你的VB。将你的TABLENAME.Category%type更改为varchar2。请记住,您使用的是OleDb,这并不理想。切换到ODP.net for oracle。我以前从未做过合并,但是我做过类似上面的存储过程,它们工作得很好。因此,我认为我不必同时使用merge@t.S。我的其他存储过程使用%type,没有任何问题。只是出于某种原因,我对这个有意见one@Chuck不过,我会研究一下合并版本,看看是否必须使用它可能需要一些时间。事实上,我想,我知道你的问题是什么。Boolean是pl/sql类型,可以在代码中使用,但很可能作为输出参数使用时出现问题。将输出参数编号为,传递1表示真,传递0表示假。再说一次,ODP.NET可能理解这种类型,但您使用OleDB,所以,您会让自己陷入困境。此外,OleDB最终将不受支持。我要求您使用varchar2到硬线参数,以确保不存在差异。