2012-03-03 17 views
1

System.Data.OrcaleClientを使用してC#でPL-SQLブロックを実行しようとしています。 PL-SQLブロックをoracleで実行すると、dbms.ouputを使用して結果が出力されます。C#でPL-SQLブロックから返されたdbms.output値を取得する方法

dbms.ouput」の結果がC#コードに表示されます。

助けてください。

+0

なぜあなたは[機能](http://www.techonthenet.com/oracle/functions.php)にブロックし、結果を_返すのですか? – Ben

+0

こんにちはベン、私たちはサードパーティと統合しており、必要な結果を得るためにPL-SQLブロックを提供しています – Dinu

答えて

4

dbms_outputパッケージのget_line機能を使用してみてください。出力を返すプロシージャを作成できます。このような何か(単なる例):

procedure call_with_output(p_output out varchar2) is 
    vret integer := 0; 
    vtxt varchar2(4000); 
begin 
    dbms_output.enable; 
    -- here call code that generate lines 
    -- use the loop to retrieve info 
    while vret = 0 loop 
    dbms_output.get_line(vtxt, vret); 
    if vret = 0 then 
     if p_output is null then 
     p_output := vtxt; 
     else 
     p_output := p_output || chr(10) || vtxt; 
     end if; 
    end if; 
    end loop; 
    dbms_output.disable; 
end; 
+0

私はあなたのソリューションが好きです。これは、 'get_lines'を(get_linesの代わりに)サーバーへの単一の呼び出しで使用するという単純さを組み合わせています。私が取り組んでいた答えは、ばかげた愚か者であるODP.NETを介して 'get_lines'を呼び出すことでした。 +1 –

+1

+1ただし、これは出力の総量が32k以下の場合にのみ有効です。これが当てはまるかもしれませんが、デバッグ出力を得るには、dbms_outputに書き込むことができます(ループ内で生成する場合)。 –

+0

32Kを取得するには、vtxtの宣言を 'vtxt varcahr2(32767)'に変更する必要があります。 –

1

私は次の方法で使用しています。システムでdbms_output.get_linesを呼び出すことに問題があるので

private string GetDbmsOutputLine() 
    { 
     OracleCommand command = new OracleCommand 
     { 
      Connection = <connection>, 
      CommandText = "begin dbms_output.get_line(:line, :status); end;", 
      CommandType = CommandType.Text 
     }; 

     OracleParameter lineParameter = new OracleParameter("line", 
      OracleType.VarChar); 
     lineParameter.Size = 32000; 
     lineParameter.Direction = ParameterDirection.Output; 
     command.Parameters.Add(lineParameter); 

     OracleParameter statusParameter = new OracleParameter("status", 
      OracleType.Int32); 
     statusParameter.Direction = ParameterDirection.Output; 
     command.Parameters.Add(statusParameter); 

     command.ExecuteNonQuery(); 

     if (command.Parameters["line"].Value is DBNull) 
      return null; 

     string line = command.Parameters["line"].Value as string; 

     return line; 
    } 

は値をマルチストリングを取得するために数回、それを呼び出します。 Data.OracleClient。

関連する問題