ラブびあ

ビール。ときどきラブ

rpxファイルをDBへインポートする

ActiveReportsのrpxファイルを、データベースにインポートするVBScript
UTF-8のリソースファイルをDBにインポートするときのテンプレ

CREATE TABLE ACTIVEREPORTS
(
  REPORTID          VARCHAR2(32) NOT NULL,
  LINE_NO           NUMBER(5,0) NOT NULL,
  LINE              VARCHAR2(2000)
  CONSTRAINT ACTIVEREPORTS_PK PRIMARY KEY (REPORTID, LINE_NO) USING INDEX
)
Option Explicit

'動作環境変数
dim oraconst
dim database
dim username
dim password
oraconst = "C:\Oracle\Ora92\oo4o\ORACONST.TXT" ' 設定しなければ %ORACLE_HOME% を探しに行きます
database = "database"
username = "username"
password = "password"

'Globalオブジェクト
dim wsh
dim fso
dim ado
dim OraSession
dim OraDatabase

'ADODB定数
const adBinary   = 1
const adText     = 2
const adUTF8     = "UTF-8"
const adReadAll  = -1
const adReadLine = -2

dim arg
dim msg

call init()
for each arg in WScript.Arguments
	msg = msg & fso.GetFilename(arg) & vbCrLf
	call main(arg)
next
call fini()

WScript.Echo msg & vbCrLf & "を ActiveReports へインポートしました"
WScript.Quit

sub init()
	set wsh = CreateObject("WScript.Shell")
	set fso = CreateObject("Scripting.FileSystemObject")

	if WScript.Arguments.Count = 0 then
		call err.Raise(vbObjectError + 1,, "*.rpx(ActiveReportsレポート定義ファイル) をドロップして下さい")
	end if

	for each arg in WScript.Arguments
		if StrComp("rpx", fso.GetExtensionName(arg), vbTextCompare) <> 0 then
			call err.Raise(vbObjectError + 2,, fso.GetFilename(arg) & " は *.rpx(ActiveReportsレポート定義ファイル) ではありません")
		end if
	next

	'ORACONST.TXT定義展開
	if len(oraconst) = 0 then
		if StrComp("%ORACLE_HOME%", wsh.ExpandEnvironmentStrings("%ORACLE_HOME%"), vbTextCompare) = 0 then
			call err.Raise(vbObjectError + 3,, "環境変数 ORACLE_HOME を取得できません")
		end if
		oraconst = fso.BuildPath(wsh.ExpandEnvironmentStrings("%ORACLE_HOME%"), "oo4o\ORACONST.TXT")
	end if
	if fso.FileExists(oraconst) then
		ExecuteGlobal Replace(fso.OpenTextFile(oraconst).ReadAll, "Global ","")
	else
		call err.Raise(vbObjectError + 4,, oraconst & " ファイルが見つかりません")
	end if

	'入力ファイル設定
	Set ado     = CreateObject("ADODB.Stream")
	ado.Type    = adText
	ado.Charset = adUTF8

	'ORACLE接続
	Set OraSession = CreateObject("OracleInProcServer.XOraSession")
	Set OraDatabase = OraSession.OpenDatabase(database, username & "/" & password, ORADB_DEFAULT)

	OraDatabase.Parameters.Add "REPORTID", 0, ORAPARM_INPUT
	OraDatabase.Parameters.Add "LINE_NO" , 0, ORAPARM_INPUT
	OraDatabase.Parameters.Add "LINE"    , 0, ORAPARM_INPUT
end sub

sub main(filename)
	dim reportid
	dim line_no
	dim line
	reportid = ucase(fso.GetFilename(filename))
	line_no   = 0

	ado.Open
	ado.LoadFromFile filename

	OraSession.BeginTrans

	OraDatabase.Parameters("REPORTID").AutoBindEnable
	OraDatabase.Parameters("LINE_NO").AutoBindDisable
	OraDatabase.Parameters("LINE").AutoBindDisable
	OraDatabase.Parameters("REPORTID").Value = reportid
	OraDatabase.ExecuteSQL "DELETE FROM ActiveReports WHERE REPORTID = :REPORTID"

	OraDatabase.Parameters("REPORTID").AutoBindEnable
	OraDatabase.Parameters("LINE_NO").AutoBindEnable
	OraDatabase.Parameters("LINE").AutoBindEnable

	do while not ado.EOS
		line_no  = line_no + 1
		line = ado.ReadText(adReadLine)
		OraDatabase.Parameters("REPORTID").Value = reportid
		OraDatabase.Parameters("LINE_NO").Value   = line_no
		OraDatabase.Parameters("LINE").Value  = line
		OraDatabase.ExecuteSQL "INSERT INTO ActiveReports VALUES (:REPORTID, :LINE_NO, :LINE)"
	loop

	OraSession.CommitTrans

	ado.Close
end sub

sub fini()
	set wsh = Nothing
	set fso = Nothing
	set ado = Nothing
	set OraDatabase = Nothing
	set OraSession = Nothing
end sub