全部,我正在运行以下脚本,使用unix box和sqlldr将数据加载到Oracle Server。之前它给了我一个错误,说sqlldr:command not found。我添加了“SQLPLUS< EOF”,它仍然给出了第12行意外结束文件语法错误的错误,但它只有11行代码。根据你的意思似乎是什么问题。
#!/bin/bash
FILES='ls *.txt'
CTL='/blah/blah1/blah2/name/filename.ctl'
for f in $FILES
do
cat $CTL | sed "s/:FILE/$f/g" >$f.ctl
sqlplus ID/'PASSWORD'@SERVERNAME << EOF sqlldr SCHEMA_NAME/SCHEMA_PASSWORD control=$f.ctl data=$f EOF
done
答案 0 :(得分:0)
sqlplus
永远不会知道如何处理命令sqlldr
。它们是两个互补的cmd-line实用程序,用于与Oracle DB连接。
注意将数据加载到架构中所需的sqlplus
或EOF
等:
#!/bin/bash
#you dont want this FILES='ls *.txt'
CTL_PATH=/blah/blah1/blah2/name/'
CTL_FILE="$CTL_PATH/filename.ctl"
SCHEMA_NM=SCHEMA_NAME
SCHEMA_PSWD=SCHEMA_PASSWORD
for f in *.txt
do
# don't need cat! cat $CTL | sed "s/:FILE/$f/g" >"$f".ctl
sed "s/:FILE/$f/g" "$CTL_FILE" > "$CTL_PATH/$f.ctl"
#myBad sqlldr "$SCHEMA_NAME/$SCHEMA_PASSWORD" control="$CTL_PATH/$f.ctl" data="$f"
sqlldr $SCHEMA_USER/$SCHEMA_PASSWORD@$SERVER_NAME control="$CTL_PATH/$f.ctl" data="$f" rows=10000 direct=true errors=999
done
如果没有过于哲学,使用像FILES=$(ls *.txt)
这样的作业是一个不好的习惯。相比之下,for f in *.txt
将正确处理其中包含奇数字符的文件(如空格或其他语法中断值)。但是想进入的另一个习惯是引用所有变量引用(如$f
),使用dbl-quotes:"$f"
,好吗? ;-)这是保护其中嵌入了空格等文件的其他内容。
在编辑更新中,我已经对您的CTL_PATH和CTL_FILE进行了分类。我想我理解你的意图,你有1 std CTL_FILE,你通过sed
来创建一个特定于表的.ctl文件(根据我的经验,这是一个很好的方法)。请注意,您无需使用cat
将文件发送到sed
,但您通过重定向(> $f.ctl
)创建更改文件的用途非常shell
- 也喜欢。
在第二次编辑更新中,我看了S.O.并找到了一个示例sqlldr
cmdline,它具有正确的语法并已修改为可以使用您的变量名称。
完成,
一个。您确定计算机上是否安装了Oracle客户端软件包 您正在运行脚本?
B中。 / path / to / oracle / client / tools / bin是否包含在您的工作中
$PATH
?
℃。试试which sqlldr
。如果你没有得到任何东西,或者不是
安装或不在路径中。
d。如果没有安装,你必须安装它。
电子。安装后,请记下包含sqlldr
cmd的目录。
find / -name 'sqlldr*'
需要很长时间才能运行,但它会
打印出你想要使用的路径。
F。采取返回的“路径”部分(如
/opt/oracle/11.2/client/bin/
(但不是最后的sqlldr
),和
使用
(添加Txt以安抚S.O. Formatter ;-))
export ORCL_PATH="/path/you/found/to/oracle/client"
export PATH="$ORCL_PATH:$PATH"
这些步骤应解决任何遗留问题。如果这不起作用,请查看是否有人在哪里工作,了解您的本地计算环境,可以帮助解释任何缺失或不同的步骤。
IHTH