sqloader将文件名保存到表中

时间:2017-07-11 18:33:05

标签: sql oracle sql-loader

我需要将不同的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循环的情况下工作,我不知道为什么。如果有人可以帮助我,我将不胜感激..当我执行批处理文件时,它会再次自动关闭..

0 个答案:

没有答案