如何将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中存储存储过程返回的多个输出列
如何使用 unix shell 脚本将 impala 查询输出日志转换为变量?