DBMS_OUTPUT と言う、有名なデバッグ用のパッケージがありますが、この出力結果をアプリケーションから取得するプロシージャは以下のような定義がなされています。
DBMS_OUTPUT.GET_LINE ( line OUT VARCHAR2, status OUT INTEGER); line 最後の改行文字を除いて、バッファに入れられた単一行の情報を戻します。 「ORA-06502: PL/SQL: 数値または値のエラーが発生しました: 文字列バッ ファが小さすぎます。」の発生を回避するために、このパラメータの実際 の値をVARCHAR2 (32767)として宣言する必要があります。 status コールが正常に完了すると、ステータス0(ゼロ)が戻ります。バッファに これ以上行がない場合は、ステータス1が戻ります。
以下は、Windows の PHP で、OracleInProcServer.XOraSession (OO4O) を使って一時的な PL/SQL 実行の中から DBMS_OUTPUT を行って、その結果を取得する例です。 Add メソッドの第二引数は以下のように説明されています。パラメータの初期値を指定するVariant。 初期値によってこのパラメータのデータ型が定義されるため、重要です。 これは、クライアント側の事で、サーバー側の定義は ServerType プロパティで行っています
<? com_load_typelib("{F2D4ED20-FFD3-101A-ADF2-04021C007002},5,0"); $OraSession = new COM( "OracleInProcServer.XOraSession" ); // *********************************************************** // 処理開始 // *********************************************************** $plsql = <<<MYTEXT DECLARE WK_KEY VARCHAR2(4) := '0001'; WK_NAME VARCHAR2(50); BEGIN SELECT 氏名 INTO WK_NAME FROM 社員マスタ where 社員コード = WK_KEY; DBMS_OUTPUT.PUT_LINE(WK_NAME); END; MYTEXT; // "PC名/サービス", "ユーザ/パスワード" $OraDatabase = $OraSession->OpenDatabase("night/xe", "LB/LB", ORADB_DEFAULT); $OraDatabase->LastServerErrReset(); // DBMS_OUTPUT を使用可能にする $Query = "BEGIN DBMS_OUTPUT.ENABLE(); END;"; $OraDatabase->ExecuteSQL( $Query ); // CrLf では動かないので、Lf に変換して実行 $Query = str_replace("\r\n","\n", $plsql ); $OraDatabase->ExecuteSQL( $Query ); // DBMS_OUTPUT.GET_LINE の仕様に基づいてパラメータの設定 $OraDatabase->Parameters->Add("PARAM", "", ORAPARM_OUTPUT); $OraDatabase->Parameters["PARAM"]->ServerType = ORATYPE_VARCHAR2; $OraDatabase->Parameters->Add("STATUS", 0, ORAPARM_OUTPUT); $OraDatabase->Parameters["STATUS"]->ServerType = ORATYPE_NUMBER; // 結果を読みだす為のメソッドを実行 $Query = "BEGIN DBMS_OUTPUT.GET_LINE(:PARAM,:STATUS); END;"; $OraDatabase->ExecuteSQL( $Query ); // メモリ上のデータを読み出し while( $OraDatabase->Parameters["STATUS"]->Value == 0 ) { print $OraDatabase->Parameters["PARAM"]->Value . "\n"; $OraDatabase->ExecuteSQL( $Query ); } // パラメータの削除 $OraDatabase->Parameters->Remove("STATUS"); $OraDatabase->Parameters->Remove("PARAM"); print "処理が終了しました"; ?>
タグ:PL/SQL
|
【Oracle : PL/SQLの最新記事】
- PL/SQL : 最も簡単な CSV 出力 の記述
- PL/SQL : Function と Procedure の簡単なサンプル
- Oracle : PL/SQL Function の使用方法
- Oracle : PL/SQL : 暗黙のカーソルとループブロックを使用した自動行挿入
- Oracle : PL/SQL : SELECT 〜 INTO 構文の一般的な使用方法
- Oracle : PL/SQL : カーソルを使った一般的なループ処理を行うプロシージャ
- Oracle : PL/SQL : Function のサンプルと使い方
- PL/SQL : プロシージャの呼び出し
- PL/SQL : Function 雛形