如何在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
相关产品推荐
相关产品推荐

