如何在 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
命令。
我正在尝试使用 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
命令。