C#获取oracle存储过程标准输出的方法
how to get oracle stored procedure standard output in c#
我正在尝试获取从 oracle 存储过程返回的 c# 中的标准输出。 dbms_output.put_line('Hello Word')
我使用的 C# 代码是
using (OracleConnection con = new OracleConnection())
{
con.ConnectionString = My_connection_string;
con.Open();
OracleCommand cmd = new OracleCommand("tmp_test", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.BindByName = true;
var result = cmd.ExecuteScalar();
}
oracle存储过程代码为
create or replace procedure tmp_test as
v_count integer;
begin
dbms_output.put_line('Hello Word');
end;
存储过程执行成功,但我无法取回 Hello Word。
这是 Oracle 中 DBMS_OUTPUT 包文档的 link - DBMS_OUTPUT
它特别声明它用于调试 Oracle 存储过程,这本质上是一个调试缓冲区,您需要主动轮询使用 GET_LINES 以查看输出。
PL/SQL 中的函数应该是这样的:
create or replace function tmp_test as
begin
RETURN 'Hello World';
end;
经过一番努力,我设法找到了答案,并决定 post 这可能对其他人有所帮助。
using (OracleConnection con = new OracleConnection())
{
con.ConnectionString = My_connection_string;
con.Open();
OracleCommand cmd = new OracleCommand("tmp_test", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.BindByName = true;
var result = cmd.ExecuteScalar();
//it is included dbms_output
cmd.CommandText = "begin dbms_output.enable (1000); end;";
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
string out_string;
int status = 0;
cmd.CommandText = "BEGIN DBMS_OUTPUT.GET_LINE (:out_string, :status); END;";
cmd.CommandType = CommandType.Text;
cmd.Parameters.Clear();
cmd.Parameters.Add("out_string", OracleType.VarChar, 32000);
cmd.Parameters.Add("status", OracleType.Double);
cmd.Parameters[0].Direction = System.Data.ParameterDirection.Output;
cmd.Parameters[1].Direction = System.Data.ParameterDirection.Output;
cmd.ExecuteNonQuery();
out_string = cmd.Parameters[0].Value.ToString();
status = int.Parse(cmd.Parameters[1].Value.ToString());
}
我正在尝试获取从 oracle 存储过程返回的 c# 中的标准输出。 dbms_output.put_line('Hello Word') 我使用的 C# 代码是
using (OracleConnection con = new OracleConnection())
{
con.ConnectionString = My_connection_string;
con.Open();
OracleCommand cmd = new OracleCommand("tmp_test", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.BindByName = true;
var result = cmd.ExecuteScalar();
}
oracle存储过程代码为
create or replace procedure tmp_test as
v_count integer;
begin
dbms_output.put_line('Hello Word');
end;
存储过程执行成功,但我无法取回 Hello Word。
这是 Oracle 中 DBMS_OUTPUT 包文档的 link - DBMS_OUTPUT
它特别声明它用于调试 Oracle 存储过程,这本质上是一个调试缓冲区,您需要主动轮询使用 GET_LINES 以查看输出。
PL/SQL 中的函数应该是这样的:
create or replace function tmp_test as
begin
RETURN 'Hello World';
end;
经过一番努力,我设法找到了答案,并决定 post 这可能对其他人有所帮助。
using (OracleConnection con = new OracleConnection())
{
con.ConnectionString = My_connection_string;
con.Open();
OracleCommand cmd = new OracleCommand("tmp_test", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.BindByName = true;
var result = cmd.ExecuteScalar();
//it is included dbms_output
cmd.CommandText = "begin dbms_output.enable (1000); end;";
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
string out_string;
int status = 0;
cmd.CommandText = "BEGIN DBMS_OUTPUT.GET_LINE (:out_string, :status); END;";
cmd.CommandType = CommandType.Text;
cmd.Parameters.Clear();
cmd.Parameters.Add("out_string", OracleType.VarChar, 32000);
cmd.Parameters.Add("status", OracleType.Double);
cmd.Parameters[0].Direction = System.Data.ParameterDirection.Output;
cmd.Parameters[1].Direction = System.Data.ParameterDirection.Output;
cmd.ExecuteNonQuery();
out_string = cmd.Parameters[0].Value.ToString();
status = int.Parse(cmd.Parameters[1].Value.ToString());
}