代码之家  ›  专栏  ›  技术社区  ›  NoName123

执行sqloader的批处理脚本

  •  0
  • NoName123  · 技术社区  · 7 年前

    我需要使用sql加载器将一些数据导入表中。

    @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
    

    无法将参数传递给控制文件。在我的例子中,我想将文件名保存在表中的列上。因此,我需要动态创建控制文件,因为通过这种方式,我可以将文件名作为参数(tmpFile)传递

    然而,我被困住了,不能再往前走了。

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

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

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

    暂时忽略第二部分(或者你可能知道我为什么会出现这个错误)……为什么我的控制文件中缺少大部分内容?有人能帮我吗?我被困住了,不知道该怎么办

    1 回复  |  直到 7 年前
        1
  •  2
  •   aschipfl    7 年前
    1. 你需要在回音文本中转义右括号,如 ^) for ... do ( 在意外点关闭,因为第一个未被替换 ) 被视为结束语。回音的开头也可以转义(如 ^(
    2. %%~ni 在变量中,只需回显 %%~倪 直接在以后。
    3. 尾随 选项卡 controlfile.ctl ,除非删除它们,否则将语法更改为 > "controlfile.ctl" echo Text ,或者您在下一项中实施该建议。
    4. 您也可以放置所有 echo > "controlfile.ctl" .

    @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