我在编写bash脚本时遇到了问题。
我正在尝试从sqlplus提示符输出到bash变量。我在很多论坛上都尝试了许多方法。
t=$(./bin/sqlplus 'oracleuser/password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.2)(Port=1521))(CONNECT_DATA=(SID=connectstring)))' << END
SELECT (1 - (Sum(getmisses)/(Sum(gets) + Sum(getmisses)))) * 100 FROM V\$rowcache;
exit;
END
)
echo $t
这正是我想要做的事情。在上面,我正在生成字符串
'oracleuser/password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.2)(Port=1521))(CONNECT_DATA=(SID=connectstring)))'
动态。这部分很有效,当我传递命令
时会出现问题SELECT (1 - (Sum(getmisses)/(Sum(gets) + Sum(getmisses)))) * 100 FROM V\$rowcache;
在sqlplus提示符下。这里发生的事情是,$符号被转义,但*符号会导致问题(例如在sqlprompt中它列出运行它的目录中的所有文件!)在整个命令运行时。
我的编码如下: -
connect="'oracleuser/password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.2)(Port=1521))(CONNECT_DATA=(SID=connectstring)))'"
arr[1]="SELECT (1 - (Sum(getmisses)/(Sum(gets) + Sum(getmisses)))) * 100 FROM V\$rowcache;"
exp=$(./bin/sqlplus $mconnect << END
printf "${arr[1]}";
exit;
END
)
echo $exp
运行脚本时,它成功进入sqlplus,但是当运行SELECT命令*导致问题时,但是如果我手动输入命令就可以了。
有没有更好的方法?我不是一个狂热的怪人:(。
我需要一些真正的帮助!
感谢您花时间查看我的问题。
祝你好运, Bhuvanesh
答案 0 :(得分:0)
如何将查询作为单独的query1.sql文件运行?
另外,如果你只想要结果(在这种情况下,(1 - (Sum(getmisses)/(Sum(gets)+ Sum(getmisses)))* 100)返回并且没有标题信息,请使用sqlplus -S。
sqlplus -h
-S设置静音模式,禁止显示 SQL * Plus横幅,提示和回显 命令。
bash.sh:
#/bin/bash
connect="'oracleuser/password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.2)(Port=1521))(CONNECT_DATA=(SID=connectstring)))'"
exp=$(./bin/sqlplus -S $connect << END
@query1.sql
END
)
echo $exp
QUERY1.SQL:
SET HEAD OFF
SELECT count(*) from all_users;
exit
然后运行示例..
./bash.sh
36