如何将sql查询输出存储在shell脚本中的变量中

Posted

技术标签:

【中文标题】如何将sql查询输出存储在shell脚本中的变量中【英文标题】:How to store sql query output in variable in shell script 【发布时间】:2021-05-14 15:17:30 【问题描述】:

我正在尝试使用 shell 脚本将 sql 查询输出的值存储在变量中。

size=`$PATH_TO_CLIENTsqlplus $IMPUSER/$IMPPWD@$ENDPOINT<< EOF
select owner, sum(bytes)/1024/1024/1024 Size_GB from dba_segments where owner = 'XXXX' group by owner;
exit;
EOF`
echo "Total data is $size"

我得到的输出是

**Total data is**
SQL*Plus: Release 21.0.0.0.0 - Production on Fri May 14 11:06:42 2021
Version 21.1.0.0.0

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

Last Successful login time: Fri May 14 2021 11:01:02 -04:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.8.0.0.0

SQL>
OWNER
--------------------------------------------------------------------------------
   SIZE_GB
----------
XXXXXXX
12.2345


SQL> Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.8.0.0.0

在变量完整连接字符串和 sql 查询输出中都被存储。我只想获得像 $size=12.2345 这样的价值,请告诉我如何获得它

【问题讨论】:

您应该通过正确设置ORACLE_HOME 变量来删除sqlplus 命令之前的$PATH_TO_CLIENT 【参考方案1】:

可以通过使用以下代码块将大小值分配给当前变量

size=$(sqlplus -S /nolog << EOF
 conn $IMPUSER/$IMPPWD@$ENDPOINT
 whenever sqlerror exit sql.sqlcode
 SET PAGES 0
 SELECT SUM(bytes)/1024/1024/1024 FROM dba_segments WHERE owner = 'XXXX';
EOF
)
echo "Total data is "$size

在哪里

保留owner 列和group by 子句是多余的,因为 仅返回单个架构的一个列值 使用SET PAGES 0命令隐藏列标题时,无需将计算值作为返回结果不需要的别名 使用直连不安全,但之前使用sqlplus -S /nolog 架构连接,以便在列出时隐藏密码 某人通过ps 命令。

【讨论】:

【参考方案2】:

如果输出与换行符一致,您可以使用:

size=`$PATH_TO_CLIENTsqlplus $IMPUSER/$IMPPWD@$ENDPOINT<< EOF | sed -n '/^\s*SIZE_GB$/n;n;n;p'
select owner, sum(bytes)/1024/1024/1024 Size_GB from dba_segments where owner = 'XXXX' group by owner;
exit;
EOF`

它将返回包含'SIZE_GB'的行之后的第三行。

【讨论】:

【参考方案3】:

你可以用这个:

size=`$PATH_TO_CLIENTsqlplus -s $IMPUSER/$IMPPWD@$ENDPOINT <<EOF
set echo off
set feedback off
set heading off
set pages 0
select sum(bytes)/1024/1024/1024 Size_GB from dba_segments where owner = 'SYS';
exit;
EOF`
echo "Total data is $size"

【讨论】:

这行得通,但值在总数据语句Total data is = 11.2105713之后以换行符出现@ 在设置标题离开“设置页面 0”之后再添加一行。我已经更新了上面的答案。

以上是关于如何将sql查询输出存储在shell脚本中的变量中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用sqlplus在shell中存储存储过程返回的多个输出列

如何将 SQLPlus 的结果存储到 shell 变量中

如何将命令存储在 shell 脚本的变量中?

如何使用 unix shell 脚本将 impala 查询输出日志转换为变量?

如何在 shell 脚本中运行 SQL 查询时获得类似 SQLPLUS 的输出

如何在 Informix 中过滤 dbaccess 输出?