如何通过OracleDataReader在C#中获取PL/SQL的输出结果?
问题原因及解决方案
你的问题核心在于**OracleDataReader只能读取SQL查询返回的结果集**,而dbms_output.put_line的输出不属于结果集范畴,所以用ExecuteReader根本拿不到这些内容。
要获取dbms_output的输出,你需要通过dbms_output.get_lines这个存储过程来提取,具体步骤如下:
- 显式启用会话级别的
dbms_output(避免依赖外部设置) - 执行你的PL/SQL输出块
- 调用
dbms_output.get_lines提取输出内容
以下是修正后的完整代码:
ConnectDB(); OracleCommand command = conn.CreateCommand(); // 1. 启用dbms_output,确保会话生效 command.CommandText = "begin dbms_output.enable(); end;"; command.CommandType = CommandType.Text; command.ExecuteNonQuery(); // 2. 执行输出内容的PL/SQL块 command.CommandText = "begin dbms_output.put_line('Output'); end;"; command.ExecuteNonQuery(); // 3. 获取dbms_output的输出 command.CommandText = "declare " + " v_lines dbms_output.chararr; " + " v_num_lines integer; " + "begin " + " v_num_lines := 100; -- 最多获取100行输出 " + " dbms_output.get_lines(v_lines, v_num_lines); " + " :output_lines := v_lines; " + " :output_count := v_num_lines; " + "end;"; // 绑定输出参数 OracleParameter linesParam = new OracleParameter("output_lines", OracleDbType.Varchar2, 32767, ParameterDirection.Output); linesParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray; linesParam.Size = 100; command.Parameters.Add(linesParam); OracleParameter countParam = new OracleParameter("output_count", OracleDbType.Int32, ParameterDirection.Output); command.Parameters.Add(countParam); command.ExecuteNonQuery(); // 处理输出结果 int outputCount = (int)countParam.Value; string[] outputLines = (string[])linesParam.Value; for (int i = 0; i < outputCount; i++) { MessageBox.Show(outputLines[i]); } if (outputCount == 0) { MessageBox.Show("No output"); } conn.Close();
关键说明
- 使用
ExecuteNonQuery执行PL/SQL块,因为这类块不返回结果集 dbms_output.get_lines需要通过绑定PL/SQL关联数组类型的参数来接收输出- 可调整
v_num_lines和参数Size来控制最多获取的行数
内容的提问来源于stack exchange,提问作者Jogi
相关产品推荐
相关产品推荐

