批处理脚本执行sqloader

时间:2017-07-12 11:03:25

标签: oracle cmd sql-loader

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

@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

通常,您有一个控制文件和一个执行此文件的脚本 你不能将参数传递给控制文件。在我的情况下,我想将fileName保存在表中的列上。因此我需要动态创建控制文件,因为这样我可以将fileName作为参数传递(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 个答案:

答案 0 :(得分:2)

  1. 您需要在^)等回显文本中转义右括号。否则,for ... do (的左括号将在意外点处关闭,因为第一个未转义的)被视为结束的^(。回声开放的那些也可以被转义(例如%%~ni),但是没有必要(虽然我更喜欢它用于化妆原因)。
  2. 然后不要将%%~ni存储在变量中,只需稍后直接回显controlfile.ctl
  3. 尾随的 SPACEs TABs 也会被回显并因此被写入文件> "controlfile.ctl" echo Text,除非您删除它们,否则将语法更改为{{ 1}},或者在下一个项目中实施建议。
  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