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

如何在C#中执行SQL*Plus两条语句?存储过程调用疑问

正确实现C#调用Oracle存储过程的方法

你的问题出在把SQL*Plus专属命令直接放到OracleCommand里了,而且StoredProcedure的用法有误,以下是修正后的实现:

1. 优化存储过程(可选但更规范)

存储过程里的dbms_sql.return_result是SQL*Plus用来直接输出游标的命令,在C#调用时不需要,可删除以避免重复返回结果:

CREATE OR REPLACE PROCEDURE get_column1 (p_MaritalStatus IN VARCHAR2, p_cursor OUT SYS_REFCURSOR)
AS
BEGIN
   OPEN p_cursor FOR
      SELECT column_name FROM all_tab_columns WHERE table_name = p_MaritalStatus ORDER BY column_id;
EXCEPTION
   WHEN NO_DATA_FOUND THEN 
      NULL;
END;
/

2. C#代码正确写法

直接指定存储过程名,通过参数传递输入值和输出游标:

using (OracleCommand cmd = con.CreateCommand())
{
    // 指定存储过程名称
    cmd.CommandText = "get_column1";
    cmd.CommandType = CommandType.StoredProcedure;

    // 添加输入参数:传入表名
    cmd.Parameters.Add("p_MaritalStatus", OracleDbType.Varchar2).Value = "V_$SGA";

    // 添加输出游标参数:接收返回的结果集
    var cursorParam = cmd.Parameters.Add("p_cursor", OracleDbType.RefCursor);
    cursorParam.Direction = ParameterDirection.Output;

    // 执行并读取结果
    using (OracleDataReader dr = cmd.ExecuteReader())
    {
        while (dr.Read())
        {
            // 读取每行的column_name值,按需处理
            string columnName = dr["column_name"].ToString();
            // 此处添加数据处理逻辑...
        }
    }
}

关键注意点

  • 不要在CommandText中写SQLPlus的VARIABLE或execute命令,这些是SQLPlus客户端专属语法,OracleCommand不支持。
  • 当CommandType设为StoredProcedure时,CommandText只需填写存储过程的名称。
  • 必须显式定义输出游标参数,并设置Direction = ParameterDirection.Output。
  • 使用using语句自动释放资源,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:47:33