在工作中,经常进行需要使用shell调用oracle数据库的存储过程,并将存储过程的结果数据返回到shell。或者将shell的数据,通过入参传递给sqlplus。经过自己的摸索,找到了里面的诀窍,写到blog,供大家参考使用。
比如利用shell调用oracle数据库的存储过程。shell代码如下:
-
#!/bin/sh
-
-
#程序描述:分域分批,进行短信发送程序
-
#作者: 程晓鹏
-
#日期: 2014.9.17
-
-
SMS_HOME=/your/path; #shell程序主目录
-
SMS_DEAL_NUM=4000; #统计库一次处理的数据量
-
-
#执行统计一库,存储过程,进行数据的处理,并将数据,根据地市编码
-
#将数据存放在不同用户下的不同表中,方便进行下一步的处理
-
function execProcedure
-
{
-
dbconfig_file=$SMS_HOME/DB_INFO.txt; #配置文件相关信息文件路径
-
exec_key=MDDMS; #查询的键值
-
username=`awk -F "\t" '$1==CRM {print $3}' CRM=$exec_key $dbconfig_file`; #用户名
-
password=`awk -F "\t" '$1==CRM {print $4}' CRM=$exec_key $dbconfig_file`; #密码
-
tns=`awk -F "\t" '$1==CRM {print $5}' CRM=$exec_key $dbconfig_file`; #TNS名称
-
-
. ~/.peng_profile; #加载自定义的proifle(因系统中用户默认的.profile,在登陆时会自动加上[YOU HAVE NEW MAIL],因此加载自定义的profile,将其输出的[YOU HAVE NEW MAIL]去掉)
-
cmd=`sqlplus -s $username/$password@$tns <<EOF
-
set heading off;
-
set echo off;
-
set feedback off;
-
set linesize 5000;
-
-
--执行存储过程,进行数据处理
-
var on_returntext varchar2(2000);
-
var on_return number;
-
exec $username.P_SMS_INFO($SMS_DEAL_NUM, :on_returntext, :on_return);
-
commit;
-
select :on_return||:on_returntext from dual;
-
exit;
-
EOF`;
-
-
result=`echo "$cmd" | awk '{{printf"%s",$0}}'`; #去除回车换行空行
-
echo "$result";
-
}
存储过程代码如下:
-
create or replace procedure P_SMS_INFO(deal_number in number,
-
on_returntext out varchar2,
-
on_return out number) is
-
begin
-
--存储过程代码
-
end P_SMS_INFO;
阅读(4317) | 评论(0) | 转发(0) |