C# 如何在c语言中获得oracle存储过程标准输出#

C# 如何在c语言中获得oracle存储过程标准输出#,c#,oracle,stored-procedures,C#,Oracle,Stored Procedures,我正在尝试获取从oracle存储过程返回的c#格式的stand输出。dbms_output.put_行('Hello Word') 我使用的c代码是 using (OracleConnection con = new OracleConnection()) { con.ConnectionString = My_connection_string; con.Open(); OracleCommand cmd = new OracleComma

我正在尝试获取从oracle存储过程返回的c#格式的stand输出。dbms_output.put_行('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单词

这里有一个指向Oracle中DBMS_输出包文档的链接-


它特别声明它用于调试Oracle存储过程,本质上这是一个调试缓冲区,您需要主动轮询使用GET_行以查看输出。

PL/SQL中的函数应该是这样的:

create or replace function tmp_test as
begin
   RETURN 'Hello World';
end; 

经过一番努力,我终于找到了答案,并决定发表可能对其他人有所帮助的文章

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());
}

我需要在c代码中使用GET#U行吗。如果是,请如何使用。您需要从原始存储过程中的GET_行返回值。