我需要将不同的csv文件导入到1个表中。我需要使用sqlloader。(Oracle Version 12.1.0.2) 这是我的控制文件:
load data
append
into table SAMP_TABLE
fields terminated by ','
OPTIONALLY ENCLOSED BY '"' AND '"'
trailing nullcols
(
FILE_NAME "MyFileName",
INSERT_DATE EXPRESSION "current_timestamp(3)"
)
这是我的批处理文件(我需要在windows-machine中执行):
@echo off
IF NOT EXIST C:\Users\test\csvFiles
IF NOT EXIST C:\Users\test\logfiles
for %%F in ("C:\Users\test\*.csv") do (
SET tmpFile=%%F
SET newFile=%tmpFile:~0,-3%.log
sqlldr db_user/db_pw@db_ip CONTROL='C:\Users\test.ctl' LOG='C:\Users\logfiles\%newFile%' "DATA=%%F" skip=1
move %%F C:\Users\test\csvFiles
)
pause
它的作用是,它在开头创建了两个文件夹:“csvFiles”(在加载后将csv文件移动到该文件夹)和“logfiles”(移动创建的日志文件)。 (使用DATA = %% F我可以将csv文件传递给控制文件)
您可以看到我的控制文件中的前两列是“INSERT DATE”,它插入了current_timestamp和“FILE_NAME”。
现在我的问题是我不知道如何将csv文件的文件名(将被加载)传递给控制文件。我希望每个导入csv文件都将此csv文件的文件名插入此列。我搜索了一些解决方案,但其中一些是在UNIX中,但我需要在Windows中执行。
如果有人能帮助我,我将不胜感激,因为我对批处理脚本或脚本编写起来并不是很熟悉。
到目前为止,我的解决方案是动态创建控制文件并传递文件名:
我正在尝试动态创建控制文件,但它无法正常工作。 这是我的批处理文件(我的目录中有csv文件,所以循环应该有效):
IF NOT EXIST C:\Users\test\csvFiles
IF NOT EXIST C:\Users\test\logfiles
for %%F in ("C:\Users\test\*.csv") do (
echo load data >test1.ctl
echo append >>test1.ctl
echo into table SAMP_TABLE >>test1.ctl
echo fields terminated by ',' >>test1.ctl
echo OPTIONALLY ENCLOSED BY '"' AND '"' >>test1.ctl
echo trailing nullcols >>test1.ctl
echo ( >>test1.ctl
echo FILE_NAME constant "%FF", >>test1.ctl
echo INSERT_DATE EXPRESSION "current_timestamp(3)", >>test1.ctl
echo >>test1.ctl
echo ) >>test1.ctl
SET tmpFile=%%F
SET newFile=%tmpFile:~0,-3%.log
sqlldr db_user/db_pw@db_ip CONTROL='C:\Users\test1.ctl' LOG='C:\Users\logfiles\%newFile%' "DATA=%%F" skip=1
move %%F C:\Users\test\csvFiles
)
pause
它只能在没有for循环的情况下工作,我不知道为什么。如果有人可以帮助我,我将不胜感激..当我执行批处理文件时,它会再次自动关闭..