TUTOS.EU

Export Import Oracle en VbScript

Exporter les données d'une base Oracle avec un script vbs

'Version du 24 juin 2013
'Nécessite que le client Oracle soit installé sur le poste (ici la 9.2)
'Le data source dans ConnectionString est la valeur prise sous 'Bases de données' dans le Entreprise Management Console de Oracle

'Pb avec PRU qui est un numériqu et 13, 4 pose problème, pas 13
'Voir avec un point au lieu d'une virgule ?
'[PRU] [numeric](13, 4) NULL,

Dim objFSO
Dim objTextFileDataBrut
Dim objTextFileRequeteSQLInsert
Dim CheminFichierDataBrut
Dim CheminFichierRequeteSQLInsert
Dim CheminScriptActuel

Dim LineNumber
Dim RequeteNomTableSelect
Dim RequeteNomBaseInsert
Dim RequeteNomTableInsert
Dim RequeteInsert01
Dim RequeteInsert02
Dim RequeteInsertComplete

'Déclaration des constantes
Const ForReading = 1
Const ForWritting = 2
Const ForAppending = 8


'Constantes pour le recordset
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3

'---- LockTypeEnum Values ----
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4

'---- CursorLocationEnum Values ----
Const adUseServer = 2
Const adUseClient = 3

Const adCmdText = 1
Const adModeRead = 1
Const adModeReadWrite = 3


Call DetectExeType

RequeteNomTableSelect = "ma.table"
RequeteNomBaseInsert = "NomBaseOracle"
RequeteNomTableInsert = "dbo.NomTableCible"

CheminScriptActuel = Left(wscript.scriptfullname,Len(wscript.scriptfullname)-Len(wscript.scriptname)-1)
CheminFichierDataBrut = CheminScriptActuel & "\VbOracleExport_Export.txt" 'Déclaration du chemin et du nom du fichier
CheminFichierRequeteSQLInsert = CheminScriptActuel & "\VbOracleExport_RequeteSQLInsert.txt"

If Len(CheminFichierDataBrut) > 0 Then

	Set objFSO = CreateObject("Scripting.FileSystemObject")
	Set objTextFileDataBrut = objFSO.OpenTextFile(CheminFichierDataBrut, ForWritting, True)
	Set objTextFileRequeteSQLInsert = objFSO.OpenTextFile(CheminFichierRequeteSQLInsert, ForWritting, True)
	'objTextFileDataBrut.WriteLine(Now) 'On ecrit la date et l'heure dans le fichier
	
	Set objConnection = CreateObject("ADODB.Connection")
	Set MonRecordset = CreateObject("ADODB.Recordset")

	objConnection.Mode = adModeReadWrite
	objConnection.CursorLocation = adUseClient
	objConnection.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=NomDeclarationOracle;User ID=login;Password=motdepasse"

	objConnection.Open

	Wscript.Echo "Connexion avec la Base Ok"

	RequeteSql = "SELECT *"
	RequeteSql = RequeteSql & " " & "FROM " & RequeteNomTableSelect
	
	On Error Resume Next
	MonRecordset.Open RequeteSql, objConnection, adOpenKeyset, adLockOptimistic
	'MsgBox Err.Description

	LineNumber = 0
	If MonRecordset.BOF = False Then MonRecordset.MoveFirst
	Do While MonRecordset.EOF = False

		LineNumber = LineNumber + 1
		If LineNumber = 1 Then 'Si c'est la première ligne, on va commencer par écrire le nom des champs
			MaLigne = ""
			RequeteInsert01 = ""
			For CompteurChamps = 0 To MonRecordset.fields.Count - 1
				MaLigne = MaLigne & MonRecordset.fields(CompteurChamps).Name & VbTab
				RequeteInsert01 = RequeteInsert01 & MonRecordset.fields(CompteurChamps).Name & ", "
			Next

			'On retire le dernier caractère (la dernière tabulation etc...)
			If Len(MaLigne) > 0 Then
				MaLigne = Left(MaLigne,Len(MaLigne)-1)
				RequeteInsert01 = Left(RequeteInsert01,Len(RequeteInsert01)-2)
			End If
			objTextFileDataBrut.WriteLine(MaLigne)

			objTextFileRequeteSQLInsert.WriteLine("Use " & RequeteNomBaseInsert & ";")
			objTextFileRequeteSQLInsert.WriteLine("Delete * From " & RequeteNomTableInsert & ";")
			objTextFileRequeteSQLInsert.WriteLine("Go")
			
		End If
		
		MaLigne = ""
		RequeteInsert02 = ""
		For CompteurChamps = 0 To MonRecordset.fields.Count - 1
			MaLigne = MaLigne & MonRecordset.fields(CompteurChamps).Value & VbTab
			'RequeteInsert02 = RequeteInsert02 & "'" & MonRecordset.fields(CompteurChamps).Value & "',"
			RequeteInsert02 = RequeteInsert02 & "'" & ModifierCaractSpeRequeteSQL(MonRecordset.fields(CompteurChamps).Value) & "',"
			
		Next

		'On retire le dernier caractère (la dernière tabulation)
		If Len(MaLigne) > 0 Then
			MaLigne = Left(MaLigne,Len(MaLigne)-1)
			RequeteInsert02 = Left(RequeteInsert02,Len(RequeteInsert02)-1)
		End If
		
		RequeteInsertComplete = "Insert Into " & RequeteNomTableInsert & " (" & RequeteInsert01 & ") Values (" & RequeteInsert02 & ");"
		objTextFileDataBrut.WriteLine(MaLigne)
		objTextFileRequeteSQLInsert.WriteLine(RequeteInsertComplete)

		'objTextFileDataBrut.WriteLine(Now) 'On ecrit la date et l'heure dans le fichier
		MonRecordset.MoveNext
	Loop

	MonRecordset.Close
	objConnection.Close

	objTextFileRequeteSQLInsert.WriteLine("Go")
	
	objTextFileRequeteSQLInsert.Close 'Fermeture du fichier
	objTextFileDataBrut.Close 'Fermeture du fichier

	Set objTextFileDataBrut = Nothing
	Set objFSO = Nothing

End If 'CheminFichierDataBrut
Wscript.Echo "Termine"

Sub DetectExeType()
	'Version du 10 juillet 2008

	Dim ScriptHost
	Dim ShellObject

	Dim CurrentPathExt
	Dim EnvObject

	Dim RegCScript
	Dim RegPopupType ' This is used to set the pop-up box flags.
											' I couldn't find the pre-defined names
	RegPopupType = 32 + 4

	On Error Resume Next

	ScriptHost = WScript.FullName
	ScriptHost = Right(ScriptHost, Len(ScriptHost) - InStrRev(ScriptHost, "\"))

	If (UCase(ScriptHost) = "WSCRIPT.EXE") Then
		WScript.Echo ("This script does not work with WScript.")

		' Create a pop-up box and ask if they want to register cscript as the default host.
		Set ShellObject = WScript.CreateObject("WScript.Shell")
		' -1 is the time to wait.  0 means wait forever.
		RegCScript = ShellObject.PopUp("Would you like to register CScript as your default host for VBscript?", 0, "Register CScript", RegPopupType)
		                                                    
		If (Err.Number <> 0) Then
			ReportError ()
			WScript.Echo "To run this script using CScript, type: ""CScript.exe " & WScript.ScriptName & """"
			WScript.Quit (GENERAL_FAILURE)
			WScript.Quit (Err.Number)
		End If

		' Check to see if the user pressed yes or no.  Yes is 6, no is 7
		If (RegCScript = 6) Then
			ShellObject.RegWrite "HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command\", "%WINDIR%\System32\CScript.exe //nologo ""%1"" %*", "REG_EXPAND_SZ"
			ShellObject.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\VBSFile\Shell\Open\Command\", "%WINDIR%\System32\CScript.exe //nologo ""%1"" %*", "REG_EXPAND_SZ"
			' Check if PathExt already existed
			CurrentPathExt = ShellObject.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PATHEXT")
			If Err.Number = &H80070002 Then
				Err.Clear
				Set EnvObject = ShellObject.Environment("PROCESS")
				CurrentPathExt = EnvObject.Item("PATHEXT")
			End If

			ShellObject.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PATHEXT", CurrentPathExt & ";.VBS", "REG_SZ"

			If (Err.Number <> 0) Then
				ReportError ()
				WScript.Echo "Error Trying to write the registry settings!"
				WScript.Quit (Err.Number)
			Else
				WScript.Echo "Successfully registered CScript"
			End If
		Else
			WScript.Echo "To run this script type: ""CScript.Exe adsutil.vbs <cmd> <params>"""
		End If

		Dim ProcString
		Dim ArgIndex
		Dim ArgObj
		Dim Result

		ProcString = "Cscript //nologo " & WScript.ScriptFullName

		Set ArgObj = WScript.Arguments

		For ArgIndex = 0 To ArgCount - 1
				ProcString = ProcString & " " & Args(ArgIndex)
		Next

		'Now, run the original executable under CScript.exe
		Result = ShellObject.Run(ProcString, 0, True)

		WScript.Quit (Result)
	End If

End Sub

Public Function ModifierCaractSpeRequeteSQL(ByVal MaLigne)

	'Version du 25 juillet 2008
	'Ex Version du 3 janvier 2007
	'Modifie les caractères spéciaux d'une requête SQL par leur code ASCII pour ne pas la faire planter les requêtes à cause de caractères réservés
	'Caractères comme ' , ;

	'Par defaut
	ModifierCaractSpeRequeteSQL = MaLigne
	If Len(Trim(MaLigne)) > 0 Then
		'ParametresScriptForSQL = Replace(ParametresScriptForSQL,",","' + Char(44) + '")
		MaLigne = Replace(MaLigne, "'", "' + Char(39) + '") 'Cette ligne doit être passée en premier
		MaLigne = Replace(MaLigne, ";", "' + Char(59) + '")
		'MaLigne = Replace(MaLigne, "+", "' + Char(43) + '")
		MaLigne = Replace(MaLigne, Chr(9), "' + Char(9) + '")
		MaLigne = Replace(MaLigne, Chr(10), "' + Char(10) + '")
		MaLigne = Replace(MaLigne, Chr(13), "' + Char(13) + '")

		ModifierCaractSpeRequeteSQL = MaLigne
	End If 'If Len(Trim(MaLigne)) > 0 Then

End Function
Lien vers le fichier : cliquez ici