2015-01-08 203 views
0

我想从oracle存储过程返回的C#中的立场输出。 DBMS_OUTPUT.PUT_LINE(“你好字”) 我使用C#代码是如何获得oracle存储过程标准输出在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; 

存储过程执行成功,但我不能让你好字回来。

回答

1

经过一番挣扎我已成功地找到了答案,并决定后,可以帮助其他后。

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

下面就来为DBMS_OUTPUT包在Oracle中的文档的链接 - DBMS_OUTPUT

它明确规定,它用于调试Oracle存储过程,而这在本质上是一个调试缓冲区,你需要积极地调查使用GET_LINES为了看到输出。

+0

我是否需要在C#代码中使用GET_LINES。如果是的话,我该如何使用这个。 – user3202862

+0

您需要从原始存储过程中的GE​​T_LINES中返回值。 – toadflakz

0

功能在PL/SQL应该是这样的:

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