在工作中,通过shell脚本调用oracle存储过程,进行数据的处理。今日在工作中发现,在加载短信内容时,如果短信内容中含有'&'字符串时,在插入的数据中,和原始内容不同。
经过定位oracle数据库,在外部调用时如果内容中含有'&'会被转义。经过尝试采用在调用存储过程时,不采用shell传到参数到oracle存储过程入参。变更为将短信内容内容,进行转义后。做成一个被oracle的sqlplus调用的文件去调用,即可修复此bug. shell脚本如下:
-
#!/bin/sh
-
-
SMS_HOME=/ngbss/mddms/mysms; #程序主目录
-
-
#加载短信内容(对于短信内容中,含有'&',进行特殊处理,用转义符替换,做成文件,再执行文件,避免产生bug)
-
function execLoadSmsData2
-
{
-
dbconfig_file=$SMS_HOME/DB_INFO.txt; #配置文件相关信息文件路径
-
exec_key="MDDMS"; #查询的键值
-
exec_proc_name="P_SMS_LoadData_test"; #调用存储过程名称
-
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名称
-
v_sms_content="尊敬的客户您好,感谢您参与联通公司体验活动!我们在细致整理您的问卷时,特别希望您能在一周内完善部分内容,让我们更了解您的体验感受。您的问卷十分重要,我们和流量大奖等着您,问卷修改请登录,感谢您的理解与支持。【河南联通】";#要填充的短信内容
-
-
str_target_file="/ngbss/mddms/mysms/sms_proce.sql"; #调用存储过程的路径
-
build_SmsProc_SqlFile "$v_sms_content" "$str_target_file"; #构建文件
-
-
. ~/.peng_profile; #加载操作系统的proifle
-
cmd=`sqlplus -s $username/$password@$tns <
-
@$str_target_file;
-
EOF`;
-
-
result=`echo "$cmd" | awk '{{printf"%s",$0}}'`; #去除回车换行空行
-
echo "$result";
-
}
-
-
#构建执行短信加载数据,调用存储过程,所需的sql文件
-
#参数1:短信内容
-
#参数2:生产文件路径
-
function build_SmsProc_SqlFile
-
{
-
var_sms_content="$1";
-
var_save_path="$2";
-
#因oracle数据库对'&'会进行特殊转义,因此使用chr(38)进行替换 程晓鹏 2016.09.05 update
-
var_new_content=`echo "$var_sms_content" | sed "s/'/''/g" | sed "s/&/'||chr(38)||'/g" | sed "s/^/'/g" | sed "s/$/'/g" `;
-
echo "
-
set heading off;
-
set echo off;
-
set feedback off;
-
set linesize 5000;
-
-
--执行存储过程,进行数据处理
-
var on_returntext varchar2(2000);
-
var on_return number;
-
exec uop_itf1.P_SMS_LoadData_test(${var_new_content}, :on_returntext, :on_return);
-
commit;
-
select :on_returntext from dual;
-
exit;
-
" > $var_save_path;
-
}
-
-
execLoadSmsData2;
阅读(4389) | 评论(0) | 转发(0) |