调用ORACLE存储过程的问题?(在线等,马上结帖)

shyuan 2003-07-24 11:11:25
我建立了一个简单的过程:
CREATE OR REPLACE PROCEDURE SP_NEW_ONE

AS
BEGIN
insert into one values('first','second');
END;

我用下列语句执行:
Public Overloads Function SetData(ByVal strspName As String, ByVal parameters As IDataParameter(), _
ByRef intRowsAffected As Integer) As Integer

Dim intResult As Integer = 0
Dim cmd As OleDbCommand = BuildIntCommand(strspName, parameters)

Try
conn.Open()
intRowsAffected = cmd.ExecuteNonQuery()
intResult = CInt(cmd.Parameters("ReturnValue").Value)
conn.Close()
Catch exp As OleDbException
AppException.LogEvent("Oracle sql OleDbException! " + exp.Message)
Catch exp As Exception
AppException.LogEvent("Oracle server connection error! " + exp.Message)
End Try

Return intResult
End Function

Dim cmd As OleDbCommand = BuildIntCommand(strspName, parameters)
可以返回一个cmd对象,连接也可以打开。但运行到:intRowsAffected = cmd.ExecuteNonQuery()时出错。

提示:ORA-06550: 第 1 行, 第 25 列:
PLS-00222: 在此范围中不存在名为 'SP_NEW_ONE' 的函数
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored

我的后台数据库是oracle8.1.4。这是什么原因?
...全文
118 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
shyuan 2003-07-24
  • 打赏
  • 举报
回复
补充:我用sql plus运行 exec sp_new_one 可以向表中增加一条记录。我是用systemn帐号建的表和存储过程,有权限问题吗?
shyuan 2003-07-24
  • 打赏
  • 举报
回复
这是创建command对象的函数:

'Desc:创建用于查询的命令
'Input:strspName 存储过程名,parameters 参数集
'Output:cmd 命令对象
Private Function BuildQueryCommand(ByVal strspName As String, ByVal parameters As IDataParameter()) _
As OleDbCommand

Dim cmd As New OleDbCommand(strspName, conn)
cmd.CommandType = CommandType.StoredProcedure
Dim para As SqlParameter
For Each para In parameters
cmd.Parameters.Add(para)
Next
Return cmd
End Function

'Desc:创建用于执行的命令,参数ReturnValue存放了存储过程的返回值
'Input:strspName 存储过程名,parameters 参数集
'Output:cmd 命令对象
Private Function BuildIntCommand(ByVal strspName As String, ByVal parameters As IDataParameter()) _
As OleDbCommand

Dim cmd As OleDbCommand = BuildQueryCommand(strspName, parameters)
Dim para As New OleDbParameter()
With para
.ParameterName = "ReturnValue"
.DbType = SqlDbType.Int
.Size = 4
.Direction = ParameterDirection.ReturnValue
.IsNullable = False
.Precision = 0
.Scale = 0
.SourceColumn = String.Empty
.SourceVersion = DataRowVersion.Default
.Value = Nothing
End With
cmd.Parameters.Add(para)
Return cmd
End Function
xrll 2003-07-24
  • 打赏
  • 举报
回复
SP_NEW_ONE应是你的存储过程,怎么会变成函数,代码贴出来,大家试试!
jinye 2003-07-24
  • 打赏
  • 举报
回复
up
shyuan 2003-07-24
  • 打赏
  • 举报
回复
一样的错误。
xrll 2003-07-24
  • 打赏
  • 举报
回复
cmd.ExecuteScalar()
shyuan 2003-07-24
  • 打赏
  • 举报
回复
我找到原因了,错误了两处:
Dim para As SqlParameter 改成 dim para as oledbparameter

.DbType = SqlDbType.Int 改成 .DbType = DbType.VarNumeric

搞定,我把sqlserver 迁移到 oracle上来,没注意到这些……白忙活了一天。
多谢各位了!奇怪怎么报这样的错误?????

今天累死了,明早结帖。
dragonsuc 2003-07-24
  • 打赏
  • 举报
回复
cmd.Connection=conn

试试
shyuan 2003-07-24
  • 打赏
  • 举报
回复
我用system权限访问难道不行吗?
xrll 2003-07-24
  • 打赏
  • 举报
回复
有权限问题!
shyuan 2003-07-24
  • 打赏
  • 举报
回复
我注明了呀: cmd.CommandType = CommandType.StoredProcedure
这个是针对oracle数据库的,我只是把操作sql server的sql**改成了oledb**。
Englishgenius 2003-07-24
  • 打赏
  • 举报
回复
up
xrll 2003-07-24
  • 打赏
  • 举报
回复
连接后要注明是存储过程,SQL是这样的:
SqlDataAdapter myCommand = new SqlDataAdapter("Ten Most Expensive Products", myConnection);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
shyuan 2003-07-24
  • 打赏
  • 举报
回复
我用system用户通过sql plus可以连接到这个数据库,而且我测试了,可以返回连接对象。在另外一个程序里,我是这样调用的:

Dim data As New Oracle(ConfigurationSettings.AppSettings("Oracle"))
Dim intRows As Integer

Dim intReturn As Integer = data.SetData("SYSTEM.SP_NEW_ONE", New OleDbParameter() {}, intRows)
BenZ004 2003-07-24
  • 打赏
  • 举报
回复
在此范围中不存在名为 'SP_NEW_ONE' 的函数?
这个应该是连接的问题.
你的conn是用哪个用户连接的及连接哪一张数据库的表?
要用system用户连接试试.

62,068

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧