经过定位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="尊敬的客户您好,感谢您参与联通公司体验活动!我们在细致整理您的问卷时,特别希望您能在一周内完善部分内容,让我们更了解您的体验感受。您的问卷十分重要,我们和流量大奖等着您,问卷修改请登录http://nps.10010.com:3335/nps/zc/actor/index?sign=9AA&nbr=123456123584,感谢您的理解与支持。【河南联通】";#要填充的短信内容
- 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;