如何验证sqlplus可以连接?

时间:2016-11-28 09:20:08

标签: oracle unix sqlplus

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

我想在数据库上运行脚本列表,但在此之前,我想知道数据库是否已启动并运行我的脚本。

以下是我的尝试:

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

它无法连接,但sqlplus的返回码仍然说“一切正常”!

SQL*Plus: Release 11.2.0.4.0 Production on Mon Nov 28 10:06:41 2016

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

ERROR:
ORA-12505: TNS:listener does not currently know of SID given in connect
descriptor


Enter user-name: SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM}] [edition=value]]
where  ::= [/][@]
       ::= [][/][@]
Enter user-name: ju@srv:/tmp/jcho $ echo $?
0

我知道我可以查看测试查询的结果,如:

a.sh

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

呼叫:

如果连接有效,

会给1行,否则为0

$ a.sh |grep ALL_GOOD_BOY|wc -l

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

2 个答案:

答案 0 :(得分:6)

感谢@Kacper提供的参考,我可以将 sqlplus /nolog 改编为我的案例;这就是这个想法:

  1. 仅在不连接
  2. 的情况下打开sqlplus
  3. SQLERROR上设置特定的返回代码 - 这是connect失败时发生的情况
  4. 返回代码可以像往常一样在调用者脚本中收集:
  5. 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

答案 1 :(得分:1)

以下是您可以使用的另一种解决方案:@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.qr, container, false); locdata = new ArrayList<>(); new LocDownloader(new DataListener(){ @Override public void onData(ArrayList<HashMap<String, String>> data){ locData.addAll(data); // <-- Data gets added here Toast.makeText(getActivity(),"hallo"+locdata,Toast.LENGTH_LONG).show(); } }).execute(); return rootView; } 适用于我(在Oracle 11g上):

WHENEVER SQLERROR sql.sqlcode