2015-01-08 199 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;