You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET调用带参数Oracle存储过程报ORA-00900错误求助

问题原因及解决步骤

1. 修复Oracle存储过程的语法错误

你的存储过程存在两处语法错误:

  • 输出语句应为dbms_output.put_line,而非dbms.output_put.line
  • 若要输出参数值,不能用单引号包裹param(否则仅输出字符串"param"),直接使用变量名即可

修正后的存储过程:

Create or replace PROCEDURE sproc_with_parameters (param NUMBER) AS
BEGIN
   dbms_output.put_line(param);
END;

2. 调整VB.Net代码的核心问题

ORA-00900错误由以下几个关键问题导致:

(1)设置正确的CommandType

调用存储过程时,必须将CommandType设为CommandType.StoredProcedure,而非CommandType.Text——否则Oracle会将存储过程名当作SQL语句执行,触发语法错误。

(2)修正参数命名规则

Oracle参数不需要@前缀,直接使用存储过程定义的参数名param即可(Oracle内部会自动处理冒号前缀)。

(3)选择正确的执行方法

你的存储过程没有返回结果集,仅通过dbms_output输出内容,因此不能使用ExecuteReader()(该方法用于读取查询结果)。若仅需执行存储过程,使用ExecuteNonQuery()即可;若要获取dbms_output的输出内容,需额外配置相关逻辑。

修正后的VB.Net代码示例

示例1:仅执行存储过程(不获取输出内容)

Dim rvConn As OracleConnection
Dim rvCmd As New OracleCommand
rvConn = CreateConnection()       
rvCmd.Connection = rvConn
Try
    rvConn.Open()
    Dim param As New OracleParameter
    param.ParameterName = "param" ' 移除@前缀
    param.Value = InputBox("Please enter a number")
    param.OracleDbType = OracleDbType.Int32

    rvCmd.CommandText = "sproc_with_parameters"
    rvCmd.CommandType = CommandType.StoredProcedure ' 修改为存储过程类型
    rvCmd.Parameters.Add(param)

    rvCmd.ExecuteNonQuery() ' 执行无结果集的存储过程
    MessageBox.Show("存储过程执行成功")
Catch ex As Exception
    MessageBox.Show(ex.Message)
Finally
    rvConn.Close()
End Try

示例2:获取dbms_output的输出内容

若需要捕获存储过程中dbms_output的输出,需额外启用并读取相关内容:

Dim rvConn As OracleConnection
Dim rvCmd As New OracleCommand
rvConn = CreateConnection()       
rvCmd.Connection = rvConn
Try
    rvConn.Open()
    ' 启用DbmsOutput
    Dim dbmsCmd As New OracleCommand("DBMS_OUTPUT.ENABLE", rvConn)
    dbmsCmd.ExecuteNonQuery()

    Dim param As New OracleParameter
    param.ParameterName = "param"
    param.Value = InputBox("Please enter a number")
    param.OracleDbType = OracleDbType.Int32

    rvCmd.CommandText = "sproc_with_parameters"
    rvCmd.CommandType = CommandType.StoredProcedure
    rvCmd.Parameters.Add(param)

    rvCmd.ExecuteNonQuery()

    ' 读取DbmsOutput内容
    Dim readCmd As New OracleCommand("DECLARE buf VARCHAR2(32767); BEGIN DBMS_OUTPUT.GET_LINE(buf, :status); END;", rvConn)
    Dim statusParam As New OracleParameter("status", OracleDbType.Int32)
    statusParam.Direction = ParameterDirection.Output
    Dim bufParam As New OracleParameter("buf", OracleDbType.Varchar2, 32767)
    bufParam.Direction = ParameterDirection.Output
    readCmd.Parameters.Add(statusParam)
    readCmd.Parameters.Add(bufParam)

    Dim output As String = ""
    Do
        readCmd.ExecuteNonQuery()
        If statusParam.Value = 0 Then
            output &= bufParam.Value & vbCrLf
        End If
    Loop While statusParam.Value = 0

    MessageBox.Show("存储过程输出:" & output)
Catch ex As Exception
    MessageBox.Show(ex.Message)
Finally
    rvConn.Close()
End Try

内容的提问来源于stack exchange,提问作者GuysIneedHelp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:50:29