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 "処理が終了しました";
?>