Unix SQLLDR scipt 给出 'Unexpected End of File' 错误
Unix SQLLDR scipt gives 'Unexpected End of File' error
全部,我是运行下面的脚本使用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
sqlplus
永远不知道如何使用命令 sqlldr
。它们是两个互补的 cmd 行实用程序,用于连接 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
将正确处理其中包含奇数字符(如空格或其他语法中断值)的文件。但是您 想要进入 的另一个习惯是用 dbl-quotes 引用所有变量引用(例如 $f
):"$f"
,好吗? ;-) 这是对嵌入空格等文件的另一面保护。
在 编辑更新 中,我已将您的 CTL_PATH 和 CTL_FILE 变量化。我想我理解你的意图,你有 1 个 std CTL_FILE,你通过 sed
创建一个 table 特定的 .ctl 文件(根据我的经验,这是一个很好的方法)。请注意,您不需要使用 cat
将文件发送到 sed
,但是通过重定向 (> $f.ctl
) 创建更改的文件非常 shell
-也喜欢
在第二次编辑更新中,我在S.O上查看了这里。并找到了一个示例 sqlldr
cmdline,它具有正确的语法并已修改为与您的变量名称一起使用。
最后,
一个。您确定机器上安装了 Oracle Client 包吗
您正在 运行 启用您的脚本吗?
乙。 /path/to/oracle/client/tools/bin 是否包含在您的工作中
$PATH
?
C。尝试 which sqlldr
。如果你没有得到任何东西,要么它不是
安装或不在路径中。
D.如果未安装,则必须安装它。
E.安装后,请注意包含 sqlldr
cmd 的目录。
find / -name 'sqlldr*'
到运行需要很长时间,但会
打印出您要使用的路径。
F。取返回的 "path" 部分(如
/opt/oracle/11.2/client/bin/
(但不是最后的 sqlldr
),以及
在第 2 行使用
编辑脚本
(添加 Txt 以安抚 S.O。格式化程序 ;-) )
export ORCL_PATH="/path/you/found/to/oracle/client"
export PATH="$ORCL_PATH:$PATH"
这些步骤应该可以解决所有遗留问题。如果这不起作用,请查看您工作的地方是否有人了解您的本地计算环境,可以帮助解释任何遗漏或不同的步骤。
IHTH
全部,我是运行下面的脚本使用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
sqlplus
永远不知道如何使用命令 sqlldr
。它们是两个互补的 cmd 行实用程序,用于连接 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
将正确处理其中包含奇数字符(如空格或其他语法中断值)的文件。但是您 想要进入 的另一个习惯是用 dbl-quotes 引用所有变量引用(例如 $f
):"$f"
,好吗? ;-) 这是对嵌入空格等文件的另一面保护。
在 编辑更新 中,我已将您的 CTL_PATH 和 CTL_FILE 变量化。我想我理解你的意图,你有 1 个 std CTL_FILE,你通过 sed
创建一个 table 特定的 .ctl 文件(根据我的经验,这是一个很好的方法)。请注意,您不需要使用 cat
将文件发送到 sed
,但是通过重定向 (> $f.ctl
) 创建更改的文件非常 shell
-也喜欢
在第二次编辑更新中,我在S.O上查看了这里。并找到了一个示例 sqlldr
cmdline,它具有正确的语法并已修改为与您的变量名称一起使用。
最后,
一个。您确定机器上安装了 Oracle Client 包吗 您正在 运行 启用您的脚本吗?
乙。 /path/to/oracle/client/tools/bin 是否包含在您的工作中
$PATH
?C。尝试
which sqlldr
。如果你没有得到任何东西,要么它不是 安装或不在路径中。D.如果未安装,则必须安装它。
E.安装后,请注意包含
sqlldr
cmd 的目录。find / -name 'sqlldr*'
到运行需要很长时间,但会 打印出您要使用的路径。F。取返回的 "path" 部分(如
/opt/oracle/11.2/client/bin/
(但不是最后的sqlldr
),以及 在第 2 行使用 编辑脚本
(添加 Txt 以安抚 S.O。格式化程序 ;-) )
export ORCL_PATH="/path/you/found/to/oracle/client"
export PATH="$ORCL_PATH:$PATH"
这些步骤应该可以解决所有遗留问题。如果这不起作用,请查看您工作的地方是否有人了解您的本地计算环境,可以帮助解释任何遗漏或不同的步骤。
IHTH