【问题标题】:Unix SQLLDR scipt gives 'Unexpected End of File' errorUnix SQLLDR scipt 给出“意外的文件结尾”错误
【发布时间】:2015-03-18 20:26:47
【问题描述】:

所有,我正在运行以下脚本以使用 unix box 和 sqlldr 将数据加载到 Oracle 服务器。早些时候它给了我一个错误,说 sqlldr: command not found。我添加了“SQLPLUS

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

【问题讨论】:

  • shellter - 感谢您的评论。我尝试了两种方式,仍然失败。有什么进一步的建议吗?我执行了以下操作:

标签: unix sqlplus etl sql-loader


【解决方案1】:

sqlplus 永远不知道如何处理命令sqlldr。它们是用于与 Oracle DB 交互的两个互补的命令行实用程序。

注意 NO 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 个标准 CTL_FILE,你通过 sed 传递来创建一个特定于表的 .ctl 文件(根据我的经验,这是一个很好的方法)。请注意,您不需要使用cat 将文件发送到sed,但您通过重定向(&gt; $f.ctl)创建更改文件的方式也非常类似于shell

在第二次编辑更新中,我在 S.O.并找到了一个示例 sqlldr cmdline,它具有正确的语法并已修改为使用您的变量名。

结束,

  • A.你确定机器上安装了Oracle客户端包吗 你正在运行你的脚本?

  • B. /path/to/oracle/client/tools/bin 是否包含在您的工作中
    $PATH?

    • C.试试which sqlldr。如果你没有得到任何东西,要么它没有 安装或不在路径中。

    • D.如果未安装,则必须安装它。

    • E.安装后,记下包含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

【讨论】:

  • 再次感谢您。我正在使用 FILES=$(ls *.txt) 因为我有多个文本文件,并且我将文本文件的名称插入到指定字段之一(在 Oracle 表中),该字段在 CTL 中所述的通用控制文件中指定='/blah/blah1/blah2/name/filename.ctl'。还是不对吗?
  • 哇,谢谢。我刚刚添加了@servername,并且在没有它之前也尝试过。两次它都给出 sqlldr: command not found.. 还有其他想法吗?
  • @shelter,向你致敬。这正是问题所在。我不得不去我的 unix 服务器并更改我的 .bash_profile 并添加您提到的导出路径。它解决了我的问题。非常感谢!
猜你喜欢
  • 2023-01-16
  • 2017-05-17
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 2018-11-28
  • 1970-01-01
相关资源
最近更新 更多