单连接执行多PLSQL查询并存结果到不同变量的Unix脚本优化
单次SQLPlus连接执行多查询并存储结果到不同变量
你当前的脚本每次执行查询都新建SQLPlus连接,会产生额外的连接开销。要实现单次连接执行多查询并将结果分别存入shell变量,需要借助输出标记+结果提取的方式(因为SQLPlus子进程无法直接修改父shell的变量),具体实现如下:
当前低效代码
var1=`sqlplus -s $user/$password <<EOF @$query1 $value exit EOF` var2=`sqlplus -s $user/$password <<EOF @$query2 $value exit EOF` var3=`sqlplus -s $user/$password <<EOF @$query3 $value exit EOF`
优化后的实现方案
# 单次连接执行所有查询,输出带分隔标记的结果 sqlplus_output=$(sqlplus -s "$user/$password" <<EOF SET HEAD OFF SET FEEDBACK OFF SET PAGESIZE 0 SET LINESIZE 1000 SET TRIMSPOOL ON -- 执行查询1,用标记包裹结果 PROMPT ###VAR1_BEGIN### @$query1 $value PROMPT ###VAR1_END### -- 执行查询2,用标记包裹结果 PROMPT ###VAR2_BEGIN### @$query2 $value PROMPT ###VAR2_END### -- 执行查询3,用标记包裹结果 PROMPT ###VAR3_BEGIN### @$query3 $value PROMPT ###VAR3_END### EXIT; EOF ) -- 从总输出中提取各查询结果并赋值给变量 var1=$(echo "$sqlplus_output" | sed -n '/###VAR1_BEGIN###/,/###VAR1_END###/{/###VAR1_BEGIN###/!{/###VAR1_END###/!p}}') var2=$(echo "$sqlplus_output" | sed -n '/###VAR2_BEGIN###/,/###VAR2_END###/{/###VAR2_BEGIN###/!{/###VAR2_END###/!p}}') var3=$(echo "$sqlplus_output" | sed -n '/###VAR3_BEGIN###/,/###VAR3_END###/{/###VAR3_BEGIN###/!{/###VAR3_END###/!p}}') -- 可选:清理结果中的换行、首尾空格 var1=$(echo "$var1" | tr -d '\n' | sed 's/^ *//;s/ *$//') var2=$(echo "$var2" | tr -d '\n' | sed 's/^ *//;s/ *$//') var3=$(echo "$var3" | tr -d '\n' | sed 's/^ *//;s/ *$//')
关键说明
- SQLPlus环境配置:
SET系列命令用于关闭表头、反馈信息、分页等,避免多余输出混入查询结果;SET TRIMSPOOL ON会去除每行末尾的空格。 - 标记分隔:用
PROMPT输出唯一的开始/结束标记,确保shell能精准定位每个查询的结果范围。 - 结果提取:通过
sed命令提取两个标记之间的内容,排除标记本身,得到纯净的查询结果。 - 结果清理:最后一步的
tr和sed用于去除结果中的换行和首尾空格,保证变量值的整洁。
内容的提问来源于stack exchange,提问作者Dhvani Minda
相关产品推荐
相关产品推荐

