【问题标题】:How to connect Database and run query inside a shell script?如何连接数据库并在 shell 脚本中运行查询?
【发布时间】:2017-05-18 10:38:36
【问题描述】:

我正在尝试从 shell 脚本连接到数据库,但我遇到了以下错误。

数据库输出:错误: ORA-12154: TNS: 无法解析指定的连接标识符

SP2-0306:选项无效。 用法:CONN[ECT] [登录] [AS {SYSDBA|SYSOPER}] 在哪里 ::= [/][@] | / SP2-0306:无效选项。 用法:CONN[ECT] [登录] [AS {SYSDBA|SYSOPER}] 在哪里 ::= [/][@] | /

轨迹代码:

#!/bin/bash

LogDirectory='/users/users-06/p6***8/scripts/dir'

ORACLE_HOME=/tools/ver/oracle-10.2.0.1-64
export ORACLE_HOME

DBUSER='p6*02*1'
DBUSERPASSWORD='R****07'
DB='O**XDA3'

var=`$ORACLE_HOME/bin/sqlplus -S ${DBUSER}/${DBUSERPASSWORD}@${DB} << EOD
spool ${LogDirectory}/query.txt
set linesize 32767
set feedback off
set heading off
SELECT * FROM Omi.ESP_FEED_REQUEST WHERE FEED_NAME='PSAR_TRANSACTION_FEED' AND REQUEST_ID='3694707322503' AND AS_OF='04-Jan-2017' ORDER BY 1 DESC;
spool off
exit;
EOD`

echo $var > ${LogDirectory}/DB_output.txt

您能否建议我如何在“var”变量中获取 sql 输出?非常感谢!

【问题讨论】:

  • 注意:sqlplus 存在于路径 $ORACLE_HOME/bin
  • 您还应该将TNS_ADMIN 导出到您的tnsnames.ora 文件所在的位置。
  • @WernfriedDomscheit,感谢先生的反馈,它现在对我有用。
  • @WernfriedDomscheit,它对我有用,但似乎有错误(一个新的“on.lst”文件正在自动创建),你能建议如何克服它吗?请检查我在问题中的最后一个命令。
  • 你想在var得到什么?行数?选择的整个结果? (是一行还是几行)整个SQL脚本的退出代码?

标签: oracle bash shell unix sqlplus


【解决方案1】:

您的查询输出在下面的路径中被假脱机

{LogDirectory}/query.txt

var 将只有代码 1 或 0 的状态。如果语句成功执行,则 var status 将为 0 否则为 1

【讨论】:

  • 它回显 'VAR' 的输出而不是 var 的退出状态。 (见我的回复)
【解决方案2】:

这里运行良好:

#!/bin/bash

LogDirectory='/home/oracle'

ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export ORACLE_HOME

DBUSER='scott'
DBUSERPASSWORD='scott'
DB='db11g'

var=`$ORACLE_HOME/bin/sqlplus -S ${DBUSER}/${DBUSERPASSWORD}@${DB} << EOD
spool ${LogDirectory}/query.txt
set linesize 32767
set feedback off
set heading off
select 5 from dual;
exit;
EOD`

echo "Database output: ${var}"

$ ./stack.sh
Database output:
         5

您的数据库是否已启动并正在运行?检查:

ps -ef | grep pmon

这将显示一个正在运行的进程。如果不是,你会得到你得到的错误:

SQL> shu immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options
$ ./stack.sh
Database output: ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor


SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]
      <proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]
      <proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus

编辑 XING:

我把代码改成:

 select * from t1;

$ ./stack.sh
Database output:
A
B

并从 user_tables 中选择 *

$ ./stack.sh

Database output:
DEPT                           USERS                                                                                  VALID             10                     1        255          65536     1048576           1  2147483645           YES N           4          5            0          0          0          20                         0             0           1          1     N ENABLED            4 07-OCT-14 NO               N N NO  DEFAULT DEFAULT DEFAULT DISABLED YES NO             DISABLED YES                                DISABLED DISABLED              NO  NO  YES DEFAULT
SALGRADE                       USERS                                                                                  VALID             10                     1        255          65536     1048576           1  2147483645           YES N           5          5            0          0          0          10                         0             0           1          1     N ENABLED            5 07-OCT-14 NO               N N NO  DEFAULT DEFAULT DEFAULT DISABLED YES NO             DISABLED YES                                DISABLED DISABLED              NO  NO  YES DE

【讨论】:

  • 用户查询是SELECT * FROM ...。如果 select 语句返回多于 1 行怎么办。 var 会显示它。如果是这样,请包括在您的答案中
  • @XING 查看编辑 - 输出无关紧要。无论如何,这只是结果的回声。
【解决方案3】:
echo "SELECT * FROM Omi.ESP_FEED_REQUEST WHERE FEED_NAME='PSAR_TRANSACTION_FEED' AND REQUEST_ID='3694707322503' AND AS_OF='04-Jan-2017' ORDER BY 1 DESC;" | sqlplus -s $DBUSER@$DB/$DBUSERPASSWORD >> dboutput.txt

【讨论】:

  • 这是什么意思“在正文中添加了 4 个字符”?
猜你喜欢
  • 1970-01-01
  • 2012-05-03
  • 2011-04-16
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 2012-01-13
  • 2017-05-02
  • 2020-12-04
相关资源
最近更新 更多