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

我正在尝试使用 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 这样的价值,请告诉我如何获得它

【问题讨论】:

  • 您应该通过正确设置ORACLE_HOME 变量来删除sqlplus 命令之前的${PATH_TO_CLIENT}

标签: bash oracle shell sqlplus


【解决方案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_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`
    

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

    【讨论】:

      【解决方案3】:

      你可以用这个:

      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}"
      
      

      【讨论】:

      • 这行得通,但值在总数据语句Total data is = 11.2105713之后以换行符出现@
      • 在设置标题离开“设置页面 0”之后再添加一行。我已经更新了上面的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      相关资源
      最近更新 更多