Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sqloader将文件名保存到表中_Sql_Oracle_Sql Loader - Fatal编程技术网

sqloader将文件名保存到表中

sqloader将文件名保存到表中,sql,oracle,sql-loader,Sql,Oracle,Sql Loader,我需要将不同的csv文件导入到一个表中。我需要使用sqlloader。(Oracle版本12.1.0.2) 这是我的控制文件: load data append into table SAMP_TABLE fields terminated by ',' OPTIONALLY ENCLOSED BY '"' AND '"' trailing nullcols ( FILE_NAME "MyFileName",

我需要将不同的csv文件导入到一个表中。我需要使用sqlloader。(Oracle版本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计算机上执行此操作):

它所做的是,它在开始时创建两个文件夹:“csvFiles”(加载csv文件后将其移动到此文件夹)和“logfiles”(移动创建的日志文件)。(数据为%%F时,我可以将csv文件传递给控制文件)

您可以看到,我的控制文件的前两列是“插入日期”,它插入当前的时间戳和“文件名”

现在我的问题是,我不知道如何将csv文件的文件名(将被加载)传递到控制文件。我希望每个导入csv文件都将此csv文件的文件名插入此列。我搜索了一些解决方案,但其中一些在UNIX中,但我需要在Windows中执行

如果有人能帮助我,我将不胜感激,因为我不太熟悉批处理脚本或脚本

到目前为止,我的解决方案是动态创建控制文件并传递文件名:

我正在尝试动态创建控制文件,但它不起作用。 这是我的批处理文件(我的目录中有csv文件,因此循环应该可以工作):


它只在没有for循环的情况下工作,我不知道为什么。如果有人能帮助我,我将不胜感激。当我执行批处理文件时,它会再次自动关闭。

这篇文章将帮助您将csv文件名添加到控制文件中。Thx,但我不确定这是否有效…如果我能够在控制文件(不是文本文件)中搜索字符串。我不太清楚,因为我从未使用过VBScription,你的意思是在执行批处理文件之前,在我的for循环中,我需要执行其他命令吗?例如,在这行后面:“for%%F in(“C:\Users\test*.csv”)do(”我可以使用%%F访问文件名。然后我应该首先搜索我的控制文件,并将此文件名传递到预定义的占位符,然后执行其余的代码?这篇文章提供了一些不同的方法来使用批处理文件修改文档,尽管最广为接受的答案是vbscript。看起来这很理想更新for do循环中的控制文件。另一种方法是动态创建控制文件并将文件名作为参数传递。此帖子将帮助您将csv文件名添加到控制文件中。Thx,但我不确定这是否有效…如果我能够搜索控制文件中的字符串(不是文本文件)。我不太清楚,因为我从未使用过VBScription。您的意思是,在执行批处理文件之前,在我的for循环中,我需要执行其他命令吗?例如,在这行后面:“for%%F in(“C:\Users\test*.csv”)do(”我可以使用%%F访问文件名。然后我应该首先搜索我的控制文件,并将此文件名传递到预定义的占位符,然后执行其余的代码?这篇文章提供了一些不同的方法来使用批处理文件修改文档,尽管最广为接受的答案是vbscript。看起来这很理想更新for do循环中的控制文件。另一种方法是动态创建控制文件,并将文件名作为参数传递
@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  
 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