我需要使用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.
忽略第二部分(或者你可能确切地知道我为什么会收到此错误)...为什么我的控制文件中缺少大部分内容?有人可以帮助我......我被困住了,不知道该怎么做
答案 0 :(得分:2)
^)
等回显文本中转义右括号。否则,for ... do (
的左括号将在意外点处关闭,因为第一个未转义的)
被视为结束的^(
。回声开放的那些也可以被转义(例如%%~ni
),但是没有必要(虽然我更喜欢它用于化妆原因)。%%~ni
存储在变量中,只需稍后直接回显controlfile.ctl
。> "controlfile.ctl" echo Text
,除非您删除它们,否则将语法更改为{{ 1}},或者在下一个项目中实施建议。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