如何在Shell脚本中通过sqlplus将SQL结果转为指定列形式
用Shell脚本+sqlplus实现SQL结果的平铺键值对输出
我来帮你搞定这个格式转换的问题,刚好有几种实用的方法可以实现你要的"表头+值"平铺一行的输出效果,下面一步步说明:
方法一:直接SQL拼接字符串(最简单直观)
这种方法适合列固定的场景,直接把列名和对应的值拼接成你要的格式字符串,再配合sqlplus的参数去掉多余的默认输出。
步骤1:修改你的查询语句
假设原始查询是:
SELECT STAT_DATE, SERVER_NAME, Hits1, Hits2 FROM your_target_table WHERE [你的过滤条件];
把它改成拼接后的形式:
SELECT 'STAT_DATE ' || STAT_DATE || ' SERVER_NAME ' || SERVER_NAME || ' Hits1 ' || Hits1 || ' Hits2 ' || Hits2 AS result_line FROM your_target_table WHERE [你的过滤条件];
这样查询结果会直接生成一行符合要求的字符串。
步骤2:在Shell脚本中配置sqlplus参数
调用sqlplus时,需要关闭那些多余的默认输出(比如表头、分页空行、连接提示等),示例脚本如下:
#!/bin/bash # 替换成你的数据库信息 DB_USER="your_username" DB_PWD="your_password" DB_CONN="your_db_service" sqlplus -s ${DB_USER}/${DB_PWD}@${DB_CONN} <<EOF SET HEADING OFF SET FEEDBACK OFF SET PAGESIZE 0 SET LINESIZE 200 # 调整为足够容纳输出的宽度,避免换行 SET TRIMSPOOL ON # 去掉结果末尾的多余空格 # 这里放你拼接好的SQL语句 SELECT 'STAT_DATE ' || STAT_DATE || ' SERVER_NAME ' || SERVER_NAME || ' Hits1 ' || Hits1 || ' Hits2 ' || Hits2 AS result_line FROM your_target_table WHERE [你的过滤条件]; EXIT; EOF
参数说明:
-s:启用静默模式,去掉sqlplus的欢迎/退出提示信息SET HEADING OFF:关闭默认的表格表头输出SET FEEDBACK OFF:隐藏"X rows selected"这类提示SET PAGESIZE 0:关闭分页,避免输出空行SET LINESIZE 200:确保行宽足够,防止结果被自动换行SET TRIMSPOOL ON:去除结果字符串末尾的多余空格
方法二:PL/SQL变量赋值输出(适合复杂场景)
如果你的列比较多,或者需要做一些额外的逻辑处理,可以用PL/SQL先把值读到变量里,再拼接输出:
#!/bin/bash DB_USER="your_username" DB_PWD="your_password" DB_CONN="your_db_service" sqlplus -s ${DB_USER}/${DB_PWD}@${DB_CONN} <<EOF SET HEADING OFF SET FEEDBACK OFF SET PAGESIZE 0 SET LINESIZE 200 SET TRIMSPOOL ON DECLARE v_stat_date VARCHAR2(8); v_server_name VARCHAR2(20); v_hits1 NUMBER; v_hits2 NUMBER; BEGIN -- 把查询结果赋值到变量(确保查询只返回一行) SELECT STAT_DATE, SERVER_NAME, Hits1, Hits2 INTO v_stat_date, v_server_name, v_hits1, v_hits2 FROM your_target_table WHERE [你的过滤条件]; -- 输出拼接好的字符串 DBMS_OUTPUT.PUT_LINE( 'STAT_DATE ' || v_stat_date || ' SERVER_NAME ' || v_server_name || ' Hits1 ' || v_hits1 || ' Hits2 ' || v_hits2 ); END; / EXIT; EOF
注意:这个方法要求你的查询必须只返回一行,否则INTO子句会抛出"too many rows"的错误,刚好符合你说的"仅需显示一行"的需求。
测试效果
执行上面的Shell脚本后,你就能得到完全符合要求的输出:
STAT_DATE 20180515 SERVER_NAME abcd3363 Hits1 112389 Hits2 659405
内容的提问来源于stack exchange,提问作者harshit srivastava
相关产品推荐
相关产品推荐

