sql - 如何在 Bash 脚本中运行 SQL 命令并将该命令的输出保存到变量

标签 sql oracle bash

我希望将一些 Oracle 组件包含在 Bash 脚本中,该脚本将执行一组目标:

  1. 以 root 身份登录远程服务器(我的 Oracle 数据库所在的位置)。
  2. 执行“su - oracle”。
  3. 以特定 Oracle 用户身份登录 sqlplus 环境。
  4. 执行 SQL 选择命令并将该命令的输出存储到变量中。
  5. 在 Bash shell 中显示该变量的结果。

我在 stackoverflow 上浏览了几个示例,其中许多示例似乎都在执行命令,但不一定详细说明如何向用户显示输出(尽管我仍在检查更多示例)。例如,假设所有 key 交换均已预先设置,则可以使用以下方法:

#!/bin/sh
ssh -q <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7705181803374259415940594f" rel="noreferrer noopener nofollow">[email protected]</a>
sqlplus ABC/XYZ@core <<ENDOFSQL
select CREATE_DATE from PREPAID_SUBSCRIBER where MSISDN='12345678912';
exit;
ENDOFSQL

相反,这是我尝试设置的方法:

#!/bin/sh
datasource_name=`echo "select CREATE_DATE from PREPAID_SUBSCRIBER where MSISDN='12345678912';" | ssh -q 5.6.7.8 "su - oracle -c 'sqlplus -S ABC/XYZ@core'" | tail -2 | head -1`

理想情况下,datasource_name 变量现在应该采用以下值:

no rows selected

或者如果表中有一个条目:

CREATE_DATE
-------------------
07-06-2009 18:04:48

tail 和 head 命令用于去除输出中的空行,ssh -q 和 sqlplus -S 选项用于忽略警告。

但是,当我运行该命令并执行以下操作时:

echo "${datasource_name}"

我明白了...

警告:无法访问 tty(错误文件描述符)。 因此此 shell 中没有作业控制。

...而不是上面两个输出之一。如果我理解正确的话,这是一个根据是否使用特定 shell 可能导致的警告,但大多数在线来源表明这可以忽略。这个警告的好处是,我上面的命令实际上正在运行并将“某些内容”存储到 datasource_name 中,但这不是我想要的。

现在为了简化这个问题,我注意到当我简单地尝试从运行 bash 脚本的框中 su 到远程计算机上的 oracle 时,我得到了相同的 tty 警告:

ssh <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4a3825253e0a7f647c647d6472" rel="noreferrer noopener nofollow">[email protected]</a> "su - oracle"
Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell.

如果我执行以下操作,我实际上可以成功进入 sqlplus 环境,没有任何问题:

ssh -q <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="483a27273c087d667e667f6670" rel="noreferrer noopener nofollow">[email protected]</a> "su - oracle -c 'sqlplus ABC/XYZ@core'"

SQL*Plus: Release 9.2.0.4.0 - Production on Tue May 29 12:35:06 2012

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, Real Application Clusters, OLAP, Data Mining and Real Application Testing options

SQL>

如果我理解为什么会出现上述问题,我可能就能弄清楚如何让我的脚本正常工作。任何建议将不胜感激!谢谢。

最佳答案

将第一行更改为:

ssh -t  <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8cfee3e3f8ccb9a2baa2bba2b4" rel="noreferrer noopener nofollow">[email protected]</a> "su - oracle"     

获取一个 tty 来看看这是否适合您。

你可以在脚本中做的另一件事是将 stderr 重定向到你的变量,如果你想在你的变量中看到它,这对你来说似乎不是这样,尽管我已经这样做了在某些情况下是过去的。下面的评论中有一个示例。

关于sql - 如何在 Bash 脚本中运行 SQL 命令并将该命令的输出保存到变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10805433/

相关文章:

sql - 如何将ORM迁移文件压缩为一个

mysql - 为什么此 SQL 查询失败?

java - 比较 Oracle PACKAGE 中的日期类型不起作用

Bash for 循环 - 在 n 之后命名(这是用户的输入)

php 表单未将日期发送到数据库 SQL

php - 比较同一个表的不同列和行

java - 在 Apache Spark 中插入查询花费太多时间

mysql - 2个单独表格的总和

linux - Bash 函数在作业暂停时压缩 'jobs' 的输出

bash - Bash脚本-列出hadoop文件