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。

注意将数据加载到架构中不需要 sqlplusEOF 等:

#!/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