Option Explicit
'
'**********************************************************************
' *
' * File Name : CreateControlFile.vbs
' * Description : ユーザの全テーブル分のローダの制御ファイルと
' * ローダのコマンド(バッチファイル)を自動生成
' * 生成されたフォルダにTableName.CSVを格納し、
' * バッチファイルを実行してください
' * Creator : xxxxxxxxxx
' * Date : 2009/09/08
' *
' * History
' * ver. : date : person : reason
' * 1.0.0 2009/09/08 xxxxxxxxxx 新規作成
' *
'
'**********************************************************************
'***********************************************************
' ↓ここから下を変更して下さい
'***********************************************************
Public Const User = "
test" 'ユーザ名
Public Const Pass = "test" 'パスワード
Public Const Driver = "
Oracle In XE" 'ドライバ名
Public Const Sid = "xe" '接続文字列
'Public Const Sid = "" 'ローカルの場合
' Loader Mode Select
' 下記3行の内、1行選択。他はコメントアウトしてください。
Public Const loadmode = "TRUNCATE" 'Truncate & Load
'Public Const loadmode = "REPLACE" 'Delete & Load
'Public Const loadmode = "APPEND" '追加
'ロードするデータのフォーマット
' 下記2行の内、1行選択。他はコメントアウトしてください。
'Public Const formatmode = "固定長" '固定長
Public Const formatmode = "可変長" '可変長(,区切り、""括り)
'***********************************************************
' ↑ここから上を変更して下さい
'***********************************************************
Call CreateControlFile(User)
MsgBox "ローダの制御ファイルを作成しました。"
'###########################################################
'
' 関数名 :F_GetName
' 概要 :名前の生成
' 引数 :strTblName - テーブル名
' strtype - 拡張子
' 戻り値 :テーブル名 o rファイル名
'
'###########################################################
Function F_GetName(strTblName,strtype)
Select Case UCASE(strtype)
Case ""
F_GetName = strTblName
Case Else
F_GetName = strTblName & "." & strtype
End Select
End Function
'###########################################################
'
' 関数名 :CreateControlFile
' 概要 :Loaderの制御ファイルと
' Loaderのコマンド作成
' 引数 :owner - スキーマ名
'
'###########################################################
Sub CreateControlFile(owner)
Dim objADO 'ADOオブジェクト
Dim objRS '
Dim objRS2 '
Dim strSql 'SQL文格納
Dim strCtl '制御ファイル文格納
Dim TblName 'テーブル名格納
Dim i '添え字
Dim fs 'ファイルシステムオブジェクト
Dim fldr '書き込み先フォルダ名
Dim newText '書き込み先ファイル名
Dim nPosition
'ADOオブジェクトを作成
Set objADO = CreateObject("ADODB.Connection")
'DBオープン
'objADO.Open "Driver=Driver;DBQ=Sid;UID=User;PWD=Pass;"
objADO.Open "Driver=Oracle In XE;DBQ=xe;UID=test;PWD=test;"
'テーブル名取得SQL
strSQL = "SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = '" & UCASE(owner) & "'"
Set objRS = objADO.Execute(strSQL)
'スキーマの全テーブル分繰り返す
Do Until objRS.Eof = True
TblName = objRS("TABLE_NAME")
'制御ファイル文言クリア
strCtl = ""
'列名・型・桁数取得SQL
strSQL = _
"SELECT COLUMN_NAME, DATA_TYPE, NVL(DATA_PRECISION,DATA_LENGTH) DATA_PRECISION" & _
" FROM ALL_TAB_COLUMNS " & _
"WHERE TABLE_NAME = '" & UCASE(TblName) & "'" & _
" AND OWNER = '" & UCASE(owner) & "'" & _
"ORDER BY COLUMN_ID"
Set objRS2 = objADO.Execute(strSQL)
'====================================================
' 制御ファイル文言生成
'====================================================
strCtl = _
"LOAD DATA" & vbCrLf & _
loadmode & vbCrLf & _
"INTO TABLE " & F_GetName(TblName,"") & vbCrLf
If formatmode = "固定長" Then
strCtl = strCtl & "(" & vbCrLf
Else
'使用状況に応じて区切り文字は修正して下さい
strCtl = strCtl & "FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '""' " & vbCrLf & "(" & vbCrLf
End If
nPosition = 1
'列名分繰り返す
Do Until objRS2.Eof = True
strCtl = strCtl & space(4) & objRS2("COLUMN_NAME")
strCtl = strCtl & space(35 - len(objRS2("COLUMN_NAME")))
'データ型別の書式設定なし
If formatmode = "固定長" Then
strCtl = strCtl & _
" POSITION(" & nPosition & ":" & _
nPosition + objRS2("DATA_PRECISION") - 1 & ")"
End If
'データ型別の書式設定あり(使用状況に応じて修正して下さい)
'If formatmode = "固定長" Then
' If objRS2("DATA_TYPE") = "VARCHAR2" Then
' strCtl = strCtl & vbTab & "CHAR"
' End If
' If objRS2("DATA_TYPE") = "NUMBER" Then
' strCtl = strCtl & vbTab & "INTEGER EXTERNAL"
' End If
'End If
'If objRS2("DATA_TYPE") = "DATE" Then
' strCtl = strCtl & vbTab & " DATE ""YYYY/MM/DD HH24:MI:SS"""
'End If
strCtl = strCtl & "," & vbCrLf
nPosition = nPosition + objRS2("DATA_PRECISION")
'カーソルを次の行へ
objRS2.MoveNext
Loop
If strCtl <> "" Then
strCtl = Left(strCtl,Len(strCtl) - Len("," & vbCrLf))
End If
strCtl = strCtl & vbCrlf & ")" & vbCrlf
'オブジェクトの解放
objRS2.close
set objRS2 = nothing
'====================================================
' 制御ファイルの作成
'====================================================
Set fs = CreateObject("Scripting.FileSystemObject")
'フォルダ作成("'formatmode'Loader_TableName")
fldr = formatmode & "Loader_" & F_GetName(TblName,"")
fs.CreateFolder (fldr)
'制御ファイル書き込み("TableName.ctr")
fldr = fldr & "\"
Set newText = fs.CreateTextFile(fldr & F_GetName(TblName,"ctr"), True)
newText.Write strCtl
'ファイル・クローズ
newText.Close
'====================================================
' ローダーのコマンドファイル作成("TableName_LDR.cmd")
'====================================================
Set newText = fs.CreateTextFile(fldr & F_GetName(TblName,"") & "_LDR.cmd", True)
'コマンド生成
If Sid <> "" Then
newText.WriteLine "SQLLDR " & User & "/" & Pass & "@" & Sid & _
" CONTROL=" & F_GetName(TblName,"ctr") & _
" DATA=" & F_GetName(TblName,"csv") & _
" LOG=" & F_GetName(TblName,"log") & _
" BAD=" & F_GetName(TblName,"bad") & _
" DISCARD=" & F_GetName(TblName,"bsc") & _
" ERRORS=999999999" & _
" DIRECT=TRUE"
Else
newText.WriteLine "sqlldr " & User & "/" & Pass & _
" CONTROL=" & F_GetName(TblName,"ctr") & _
" DATA=" & F_GetName(TblName,"csv") & _
" LOG=" & F_GetName(TblName,"log") & _
" BAD=" & F_GetName(TblName,"bad") & _
" DISCARD=" & F_GetName(TblName,"bsc") & _
" ERRORS=999999999" & _
" DIRECT=TRUE"
End If
'ファイル・クローズ
newText.Close
'カーソルを次の行へ
objRS.MoveNext
Loop
'オブジェクトの解放
objRS.Close
objADO.Close
set objRS = Nothing
set objADO = Nothing
End Sub
最終更新:2009年09月25日 14:40