2017-05-29 47 views
0

我尝试连接到服务器上托管的这里Oracle数据库是我的脚本为什么这个sqlplus连接字符串在bash中不起作用?

#!/bin/bash 

RAW=`cat sqlTemp.sql` 
IFS=";" 
exit=" exit;" 
for var in $RAW 
do 
query=$(echo $var | sed '/^$/d') 

sqlplus64 username/[email protected]:portnumber/servicename $query 2>> errorLog.txt 
ERRORCODE=$? 

if [ $ERRORCODE != 0 ] 
then 
    echo "$ERRORCODE" >> "errorLog.txt" 
     echo "this query has error- check the log file for detail" 
else 
    echo "SUCCESS"  
fi 
done 

如果我通过

sqlplus64 -S username/[email protected]:portnumber/servicename <<ENDOFSQL 
whenever sqlerror exit sql.sqlcode; 
$query 
exit; 
ENDOFSQL 

脚本工作更换连接字符串。

以前的连接字符串有什么问题,以及如何纠正它?

+0

'-S'选项对sqlplus64有什么意义? – choroba

+0

@choroba -S有助于抑制(无声)连接细节。 – realName

回答

0

两个命令中的连接字符串“username/pwd @ hostname:portnumber/servicename”没有区别。不同之处在于您如何尝试呈现您想要执行的SQL命令。失败的命令和有效的命令之间至少有两个重要的区别。

  • 的作品的一个使用此文件重定向输入的几行,包括你的“查询”字符串,进入命令的标准输入,而失败的一个扩展命令行参数中的查询字符串,这是完全不同的事情。

  • 当查询字符串提出未加引号的命令行是扩大后,受分词,但是当它出现在一个同样在这里并不适用文档

最有可能的, sqlplus64命令期望其SQL输入显示在标准输入上,您已经知道该如何操作。如果它准备在命令行上接受SQL,那么至少需要引用它,并且可能会有一个命令行选项来告诉它查找SQL。

+0

你能告诉我在第一个连接字符串本身没有做什么吗?第二个不返回sql.sqlerrm – realName

+0

@realName,我的观点是,你在第一个例子中无法做的事情可能就是使它像你的第二个例子。也就是说,我认为(但绝对不知道绝对的事实)'sqlplus64'会想从它的'stdin'而不是从命令行读取它的SQL输入。你的第二个选择适应这种情况;你的第一个没有。 –

+0

@realName,为了重申我在回答中已经说过的内容,第二个示例中的“here文档”将feed数据用于命令的标准输入 - 它是*重定向*运算符。这与将第一个示例尝试执行相同的数据作为命令行参数完全不同。 –

相关问题