执行sql loader的批处理脚本

batch script to execute sqloader

我需要使用 sql-loader 将一些数据导入 table。 这是我的批处理脚本:

@echo off
for %%i in ("C:\Users\test\*.csv") do (
SET tmpFile=%%~ni
echo load data                                                      >controlfile.ctl
echo INFILE 'controlfile.ctl'                                               >>controlfile.ctl
echo into table TABLE_NAME                                          >>controlfile.ctl
echo append                                                         >>controlfile.ctl
echo fields terminated by ','                                       >>controlfile.ctl
echo OPTIONALLY ENCLOSED BY '"' AND '"'                             >>controlfile.ctl
echo trailing nullcols                                              >>controlfile.ctl
echo            (                                                   >>controlfile.ctl
echo                 COLUMN1 CHAR(4000),                                >>controlfile.ctl
echo                 COLUMN2 CHAR(4000),                            >>controlfile.ctl
echo                 COLUMN3 CHAR(4000),                                >>controlfile.ctl
echo                 FILE_NAME  %tmpFile%                           >>controlfile.ctl
echo            )                                                   >>controlfile.ctl
sqlldr db_user/db_pw CONTROL='C:\test\controlfile.ctl' LOG='C:\Users\test\mylog.log' skip=1
) 
pause

通常你有一个控制文件和一个执行这个文件的脚本,但是 您不能将参数传递给控制文件。就我而言,我想将文件名保存在 table 中的列中。因此我需要即时创建控制文件,因为这样我可以将文件名作为参数传递 (tmpFile)

然而,我被卡住了,不能再进一步了。

首先,将生成控制文件,但缺少大部分内容:

  COLUMN1 CHAR(4000
              COLUMN2 CHAR(4000),                            
              COLUMN3 CHAR(4000),
          FILE_NAME test                         
           )  

其次,我在 cmd 上收到此消息:

The process cannot access the file because it is being used by another process.

暂时忽略第二部分(或者您可能知道我为什么会收到此错误)...为什么我的控制文件中缺少大部分内容?有人可以帮助我吗...我被困住了,不知道该怎么办

  1. 您需要转义 ^) 等回显文本中的右括号。否则,for ... do ( 的左括号会在意想不到的位置关闭,因为第一个未转义的 ) 被视为结束括号。回声开头的也可以转义(如^(),但这不是必需的(尽管出于美观原因我更喜欢它)。
  2. 那就不要把%%~ni存到变量里了,后面直接echo %%~ni就可以了。
  3. 结尾的 SPACETAB 也会回显并因此写入文件 controlfile.ctl,除非您删除它们,您将语法更改为 > "controlfile.ctl" echo Text,或者您在下一项中实施建议。
  4. 您也可以将所有 echo 行放在另一对括号中,并通过 > "controlfile.ctl".
  5. 重定向(写入)整个块一次

固定代码如下:

@echo off
for %%i in ("C:\Users\test\*.csv") do (
    > "controlfile.ctl" (
        echo load data
        echo INFILE 'controlfile.ctl'
        echo into table TABLE_NAME
        echo append
        echo fields terminated by ','
        echo OPTIONALLY ENCLOSED BY '"' AND '"'
        echo trailing nullcols
        echo            ^(
        echo                 COLUMN1 CHAR^(4000^),
        echo                 COLUMN2 CHAR^(4000^),
        echo                 COLUMN3 CHAR^(4000^),
        echo                 FILE_NAME  %%~ni
        echo            ^)
    )
    sqlldr db_user/db_pw CONTROL='C:\test\controlfile.ctl' LOG='C:\Users\test\mylog.log' skip=1
)
pause