如何验证sqlplus可以连接?

How to verify sqlplus can connect?

我想知道是否有可能以某种方式获得 sqlplus 输出以发现我的数据库是否已启动。

我想 运行 数据库中的脚本列表,但在我这样做之前,我想知道数据库是否启动以及 运行 我的脚本。

这是我尝试过的:

 sqlplus /@DB1 << EOF
 > select 1 from dual;
 > EOF

连接不上,但是sqlplus的return代码还是说“一切正常”!

SQL*加:2016 年 11 月 28 日星期一发布 11.2.0.4.0 生产 10:06:41

版权所有 (c) 1982、2013,甲骨文。版权所有。

错误:
ORA-12505: TNS:listener 当前不知道连接中给定的 SID
描述符


输入用户名:SP2-0306:无效选项。
用法:CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM}] [edition=value]]
其中 ::= [/][@]
       ::= [][/][@]
输入用户名:ju@srv:/tmp/jcho $ echo $?
0

我知道我可以像这样 grep 我的测试查询的结果:

a.sh

sqlplus /@DB1 << EOF
  select 'ALL_GOOD_BOY' from dual;
EOF

通话:

如果连接有效,

给出 1 行,否则 0

$ a.sh |grep ALL_GOOD_BOY|wc -l

...这对我来说似乎很多步骤。在“无法连接”给出“错误”return 代码的模式下设置 sqlplus 的任何其他方法?

感谢@Kacper 提供的参考,我可以根据我的情况调整此 sqlplus /nolog;想法是这样的:

  1. 只打开sqlplus不连接
  2. SQLERROR 上设置特定的 return 代码 - 这就是 connect 失败时发生的情况
  3. return 可以在调用脚本中像往常一样收集代码:

a.sh

sqlplus /nolog << EOF
 WHENEVER SQLERROR EXIT 50
 WHENEVER OSERROR EXIT 66
 connect /@${MISTERY_DB}
 exit;
EOF

然后调用:

/ju $ export MISTERY_DB="eg_NON_EXISTING_DB"
/ju $ a.sh
SQL*Plus: Release 11.2.0.4.0 Production on Tue Nov 29 08:43:44 2016
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
SQL> SQL> SQL> ERROR:
  ORA-12154: TNS:could not resolve the connect identifier specified
/ju $ echo $?
50

还相关:Connect to sqlplus in a shell script and run SQL scripts

这是您可以使用的另一个解决方案:WHENEVER SQLERROR sql.sqlcode 适合我 (在 Oracle 11g 上):

# try a simple SELECT FROM DUAL on previously defined database in var MY_DB
sqlplus -s /@${MY_DB} << EOF
  whenever sqlerror exit sql.sqlcode;
  select 1 from dual;
  exit;
EOF
ERR_CODE=$? # then $? is loaded with error received
if [[ 0 != "${ERR_CODE}" ]] ; then
  echo could not connect :\(
else 
  echo connection succeeded
fi