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

How to store sql query output in variable in shell script

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

size=`${PATH_TO_CLIENT}sqlplus $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 这样的值 请告诉我如何获得

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

size=`${PATH_TO_CLIENT}sqlplus $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`

它将 return 包含 'SIZE_GB'.

的行之后的第三行

你可以使用这个:

size=`${PATH_TO_CLIENT}sqlplus -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}"

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

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 命令。