VBS/PHP : OO4O : 一時PL/SQLを実行して、DBMS_OUTPUT の結果を取得する

  PL/SQL から比較的多くの文字列を取得する手段



PL/SQL のプロシージャからデータを戻すには、引数のタイプを OUTPUT にしてビルド
しますが、サーバーに登録できない場合は、PL/SQL 文字列として作成して、DBMS_OUTPUT
を利用して取得する事が可能です


Oracle10g の Express では、DBMS_OUTPUT に対する使用権限が無いので、以下を参考にして下さい
【Oracle:PL/SQL】 テキストファイルの書き込み

Oracle 11g : DBMS_OUTPUT

ENABLEプロシージャ
GET_LINEプロシージャ
OraParameters.Add


  
<JOB>
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />

<OBJECT id="OraSession" progid="OracleInProcServer.XOraSession" />
<REFERENCE guid="F2D4ED20-FFD3-101A-ADF2-04021C007002" />

<SCRIPT language=VBScript>
Dim OraDatabase,OraDynaset
' ***********************************************************
' 処理開始
' ***********************************************************
' GUI 
if vbCancel = MsgBox( "処理を開始しますか?   ", vbOKCancel , "サンプル" ) then
	Wscript.Echo "キャンセルされました"
	Wscript.Quit
end if

' REFERENCE 要素定義の為可能な定数参照
Wscript.Echo "ORADB_DEFAULT = " & ORADB_DEFAULT
Wscript.Echo "ORADB_ORAMODE = " & ORADB_ORAMODE
Wscript.Echo "ORADB_NOWAIT = " & ORADB_NOWAIT
Wscript.Echo "ORADB_NO_REFETCH = " & ORADB_NO_REFETCH
Wscript.Echo "ORADB_NONBLK = " & ORADB_NONBLK
Wscript.Echo "ORADB_ENLIST_IN_MTS = " & ORADB_ENLIST_IN_MTS
Wscript.Echo "ORADB_ENLIST_FOR_CALLBACK = " & ORADB_ENLIST_FOR_CALLBACK

' "PC名/サービス", "ユーザ/パスワード"
Set OraDatabase = OraSession.OpenDatabase("night/xe", "LB/LB", ORADB_DEFAULT)
Call OraDatabase.LastServerErrReset

' DBMS_OUTPUT を使用可能にする
Query = "BEGIN DBMS_OUTPUT.ENABLE(); END;"
Call OraDatabase.ExecuteSQL( Query )

' CrLf では動かないので、Lf に変換して実行
Query = REplace(RegTrim(GetResource("myTextData")),vbCrLf,vbLf)
Call OraDatabase.ExecuteSQL( Query )

' DBMS_OUTPUT.GET_LINE の仕様に基づいてパラメータの設定
Call OraDatabase.Parameters.Add( "PARAM", "", ORAPARM_OUTPUT )
OraDatabase.Parameters("PARAM").ServerType = ORATYPE_VARCHAR2

Call OraDatabase.Parameters.Add("STATUS", 0, ORAPARM_OUTPUT )
OraDatabase.Parameters("STATUS").ServerType = ORATYPE_NUMBER

' 結果を読みだす為のメソッドを実行
Query = "BEGIN DBMS_OUTPUT.GET_LINE(:PARAM,:STATUS); END;"
Call OraDatabase.ExecuteSQL( Query )

' メモリ上のデータを読み出し
Do while OraDatabase.Parameters("STATUS").Value = 0
	' 表示
	Wscript.Echo OraDatabase.Parameters("PARAM").Value
	' 繰り返し
	OraDatabase.ExecuteSQL( Query )
Loop

' パラメータの削除
Call OraDatabase.Parameters.Remove("STATUS")
Call OraDatabase.Parameters.Remove("PARAM")

' **********************************************************
' オブジェクト解放
' **********************************************************
Set OraDatabase = Nothing

Wscript.Echo "処理が終了しました"

' ***********************************************************
' 文字列前後の漢字スペースを含むホワイトスペースの削除
' ***********************************************************
Function RegTrim( strValue )

	Dim regEx, str

	Set regEx = New RegExp
	regEx.IgnoreCase = True
	regEx.Pattern = "^[ \s]+"
	str = regEx.Replace( strValue, "" )
	regEx.Pattern = "[ \s]+$"
	RegTrim = regEx.Replace( str, "" )

End Function
</SCRIPT>

<COMMENT>
************************************************************
 ソース内テキストデータ
************************************************************
</COMMENT>
<RESOURCE id="myTextData">
<![CDATA[
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;
]]>
</RESOURCE>

</JOB>
  



  参照



関連する記事

VBScript : WSH : (超) 雛型
VBScript : ADO と OO4O による PL/SQL 呼び出し( 入力引数のみ )
OO4O によるバッチ処理
VBScript : OO4O : 利用できるディレクトリオブジェクトの一覧






  PHP で同等の実行

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

?>
  

PHPドキュメントへのリンク

PHP: com_load_typelib - Manual













  infoboard   管理者用   
このエントリーをはてなブックマークに追加




SQLの窓  天気  IT用語辞典
Yahoo!ニュース  マルチ辞書
PHP マニュアル  Google URL短縮 


フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ