Asp.net Oracle存储过程PLS-00306:参数的数量或类型错误
我收到以下oracle错误: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 我仔细阅读了这个错误,有人说,如果将不同的值类型传递给存储过程类型,则可能会发生此错误,但对我来说似乎不是这样 我的大部分编码几乎与我所拥有的完全相同
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到硬线参数,以确保不存在差异。