巧取簡訊中的回覆程式碼

lnwxzyp發表於2014-03-19
這兩天接到這樣一個需求,要從簡訊內容中找出簡訊的業務程式碼和名稱:例如如下的一條簡訊
尊敬的使用者,您的話機,本月消費總額:96.91元.當前餘額:16.89元.親!請回復序號獲取更多服務:
61.當月生效流量包辦理
103.查詢本月消費明細
104.繳費記錄查詢
105.查詢賬戶積分
108.查詢套餐使用量
112.3G流量卡查詢
1131.查詢上月賬單情況
0000.查詢本機增值業務
但存在的問題是,簡訊的種類很多,好在有欄位可以大致區分出來類似的回覆簡訊,但是即便如此,還是存在很多沒有業務程式碼的簡訊,查詢了很多簡訊記錄總算是總結出來一條規律就是包含業務程式碼的簡訊總是>=3行的,當然也存在=3行但是沒有回覆程式碼的簡訊,由於實在是缺乏剔除的規律性因此決定在取出後再做二次剔除,於是就編寫了下面這段程式碼,後來發現取出來的還是不準確,原來還存在程式碼和名稱用空格的方式
2/2溫馨提醒,使用簡訊營業廳查詢業務、充值交費、積分兌換優惠業務包,方便快捷、省時省心。回程式碼體驗:
111 銀聯卡交費
518 數字競猜獎30元話費活動介紹
50321 確認100積分兌換15條簡訊

實際上,只需要將空格替換成小數點就解決了。 最終的程式碼如下:
SQL> set serveroutput on
SQL> declare n number;
  2  n1 number;
  3  v_id varchar2(200);
  4  v_content varchar2(4000);
  5  begin
  6  --1.先判斷回車的數量 從而確定需要迴圈的次數
  7  select (length(replace(smscontent_ys,' ','.'))-length(replace(replace(smscontent_ys,' ','.')||chr(10),chr(10),null))) into n
     /* 首先計算長度減掉將回車符替換為空的長度,從而得出存在的回車數量 */
     /*replace(smscontent_ys,' ','.') 將可能為空格的替換為小數點, 因為最後一行沒有空格,因此需要給簡訊內容新增一個回車符,這樣便於一次性迴圈取出所有的程式碼 */
  8    from TMP_SMSRESULT_1403_108_D where sessionid='SMS201403010000060071';
  9  --2.找出第一個回車前還有幾個非有效的小數點
 10  select length(substrreplace(smscontent_ys,' ','.')||chr(10),1,instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,1)))-
 11       length(replace(substr(replace(smscontent_ys,' ','.')||chr(10),1,instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,1)),'.',null)) into n1
 12    from TMP_SMSRESULT_1403_108_D where sessionid='SMS201403010000060071';
 13  for i in 1..n loop --迴圈之前確定的次數
 14    select substr(replace(smscontent_ys,' ','.')||chr(10),instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,i),instr(replace(smscontent_ys,' ','.')||chr(10),'.',1,n1+i)-instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,i)),
 15    substr(replace(smscontent_ys,' ','.')||chr(10),instr(replace(smscontent_ys,' ','.')||chr(10),'.',1,n1+i)+1,instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,1+i)-instr(replace(smscontent_ys,' ','.')||chr(10),'.',1,n1+i)) into v_id,v_content--獲取id和內容
 16    from TMP_SMSRESULT_1403_108_D where sessionid='SMS201403010000060071';
 17  dbms_output.put_line(v_id||':'||v_content); --將收集到的程式碼和內容列印出來以便檢視是否有效。
 18  end loop;
 19  end;
 20  /

61:當月生效流量包辦理

103:查詢本月消費明細

104:繳費記錄查詢

105:查詢賬戶積分

108:查詢套餐使用量

112:3G流量卡查詢

1131:查詢上月賬單情況

0000:查詢本機增值業務


PL/SQL procedure successfully completed

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12216142/viewspace-1125387/,如需轉載,請註明出處,否則將追究法律責任。

相關文章