用shell脚本中spool命令,将下方内容生成为.verf文件中

table_name_bad_U_$RUN_DATE.dat与
SELECT BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME = 'table_name_bad';
SELECT NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME = 'table_name_bad';
及$RUN_DATE
如何将上面查询语句结果集拼接为复合的SELECT语句并将结果用空格隔开?
用spool命令生成.verf文件


可以这样写shell脚本:
shell
#!/bin/bash

RUN_DATE=`date +%Y%m%d`

spool table_name_bad_U_$RUN_DATE.verf

echo "SELECT BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME = 'table_name_bad'" 
echo "SELECT NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME = 'table_name_bad'"
echo $RUN_DATE

unspool 

cat <<EOF > table_name_bad_U_$RUN_DATE.verf
SELECT 
    BYTES,
    NUM_ROWS,  
    '$RUN_DATE'
FROM 
    (SELECT BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME = 'table_name_bad') a,
    (SELECT NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME = 'table_name_bad') b
EOF

这个脚本会:
1. 获取当前日期保存到RUN_DATE变量
2. 使用spool开始输出到table_name_bad_U_$RUN_DATE.verf文件
3. 输出两条SELECT语句
4. 输出RUN_DATE变量的值
5. 使用unspool停止输出到文件
6. 使用cat将三条结果拼接为一条复合的SELECT语句,并使用空格隔开,输出到文件
所以最终table_name_bad_U_$RUN_DATE.verf文件中会包含:
sql
SELECT 
    BYTES,
    NUM_ROWS,  
    '20210415' 
FROM 
    (SELECT BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME = 'table_name_bad') a,
    (SELECT NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME = 'table_name_bad') b
这样就完成了要求,使用spool生成了.verf文件,并将查询结果拼接为一条复合的SELECT语句。