由于最近的工作基本都是在与shell和存储过程打交道,任何任务的开始都是以shell脚本开始,之前的任务是通过shell并行执行,后续的任务依赖于并行的任务是否执行完毕,下一个shell如果获取并行任务是否结束成为了一个难题,最后采取如下方案:
1、每一个并行执行的任务完成之后都写入对应数据的成功标志
2、下一个任务shell脚本每隔一段时间执行一次,判断是否所有标志都为成功,如果成功,执行该shell,于是就需要shell从数据库中获取是否都执行成功的标志。
写了一个oracle存储过程来获取标志
create or replaceprocedure p_getstatus(status out number) as .....;
然后通过shell脚本获取存储过程的返回值,纠结了好长时间,shell脚本大致如下:
#!/bin/bash
value=`sqlplus -S username/password <
set pagesize 0;
set feedback off;
set verify off;
set heading off;
set echo off;
var policyflag number;
execute p_getstatus(:flag);
select :flag from dual;
exit;
EOF`
echo $value
if [ $value == 1 ]; then
else
fi
终于搞定,脚本特殊说明以下两点
1、sqlplus 命令必须使用 -S 参数,该参数会过滤掉sqlplus的所有输出,包括与数据库连接成功,断开连接,查询结果等.
2、过程包含输出参数status,需要通过select :flag from dual;将查询结果输出到value变量中。
其实,shell变量和sqlplus 变量处于两种不同的环境,无法直接赋值,将sqlplus的所有输出结果都过滤掉,只保留用户需要的字符串返回给shell环境,作为一个字符串赋值给shell变量。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7483882/viewspace-1064671/
,如需转载,请注明出处,否则将追究法律责任。