执行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.
暂时忽略第二部分(或者您可能知道我为什么会收到此错误)...为什么我的控制文件中缺少大部分内容?有人可以帮助我吗...我被困住了,不知道该怎么办
- 您需要转义
^)
等回显文本中的右括号。否则,for ... do (
的左括号会在意想不到的位置关闭,因为第一个未转义的 )
被视为结束括号。回声开头的也可以转义(如^(
),但这不是必需的(尽管出于美观原因我更喜欢它)。
- 那就不要把
%%~ni
存到变量里了,后面直接echo %%~ni
就可以了。
- 结尾的 SPACE 和 TAB 也会回显并因此写入文件
controlfile.ctl
,除非您删除它们,您将语法更改为 > "controlfile.ctl" echo Text
,或者您在下一项中实施建议。
- 您也可以将所有
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
我需要使用 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.
暂时忽略第二部分(或者您可能知道我为什么会收到此错误)...为什么我的控制文件中缺少大部分内容?有人可以帮助我吗...我被困住了,不知道该怎么办
- 您需要转义
^)
等回显文本中的右括号。否则,for ... do (
的左括号会在意想不到的位置关闭,因为第一个未转义的)
被视为结束括号。回声开头的也可以转义(如^(
),但这不是必需的(尽管出于美观原因我更喜欢它)。 - 那就不要把
%%~ni
存到变量里了,后面直接echo%%~ni
就可以了。 - 结尾的 SPACE 和 TAB 也会回显并因此写入文件
controlfile.ctl
,除非您删除它们,您将语法更改为> "controlfile.ctl" echo Text
,或者您在下一项中实施建议。 - 您也可以将所有
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