アットウィキロゴ

vbs-DB操作

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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。