web-dev-qa-db-ja.com

OUT sys_refcursor、OUT varchar2、およびOUT番号を出力するストアドプロシージャを作成し、c#.netアプリで使用する方法

Refcursor、varchar2、および数値を出力するストアドプロシージャの構文は何ですか?

カウントを表示するために、結果の3つすべてと、sys_refcursor出力に加えてクエリが成功したことを示すメッセージを出力したいのですが、その良い例を見つけることができないようです。

私の現在のC#コードは次のようになります。

using Oracle.DataAccess.Client; 
//...

OracleCommand myCmd = new OracleCommand();
myCmd.Connection = myConnection;
myCmd.CommandText = "mypackage.myprocedure"
myCmd.CommandType = CommandType.StoredProcedure;
OracleParameter param0 = myCmd.Parameters.Add("myinput", OracleDbType.Varchar2, myinput, ParameterDirection.Input);
OracleParameter param1 = myCmd.Parameters.Add("myretcursor", OracleDbType.RefCursor, ParameterDirection.Output);

myConnection.Open();
OracleDataReader resultReader = myCmd.ExecuteReader();
mydatatable.Load(resultReader, LoadOption.OverwriteChanges);

oracleのストアドプロシージャは次のようになります。

    PROCEDURE myprocedure (myinput IN Varchar2, myretcursor OUT sys_refcursor)

    IS

    BEGIN
    OPEN myretcursor FOR
    SELECT * FROM MYTABLE

    END myprocedure

追加の出力パラメーターとしてparam2、param3をc#に追加したいと思います。それから、どういうわけかそれらもストアドプロシージャに出力しますか?これを行う方法がわからず、エラーが発生し続けました。理想的には、たとえば、選択カウント(*)を出力としてc#アプリケーションに渡すとともに、「Query Successful」のようなvarchar2文字列メッセージを渡すのが理想的です。

ありがとうございました。

更新:ヴィンセントのソリューションは以下で機能します...背後にあるC#コードに関して、彼が提供したリンクへの回答は、reader = executereaderをUSING()で囲んでテーブルをロードし、他の変数をロードする前にリーダーを閉じることを推奨しています。

https://stackoverflow.com/q/6882690/613799

Oracleからの文字列のサイズによっては、呼び出し元のc#コードで、文字列メッセージの出力パラメーター定義にvarchar2のサイズを指定する必要がある場合があります。最後に、次のリンクは、カウントをOracleDecimalからC#intに型キャストするのに役立ちました。

https://stackoverflow.com/q/3026036/613799

1
fa1c0n3r

プロシージャに2つのOUTパラメータがありません:

PROCEDURE myprocedure (myinput      IN Varchar2, 
                       myretcursor  OUT sys_refcursor,
                       p_count      OUT NUMBER,
                       p_message    OUT VARCHAR2) IS
BEGIN
   OPEN myretcursor FOR
      SELECT * FROM MYTABLE;
   p_count := 123;
   p_message := 'message';
END myprocedure

それに応じて、新しいOUTパラメータを登録するためにC#コードを変更する必要もあります。

4
Vincent Malgrat