身份證號碼驗證系統

xypincle發表於2017-02-19

  1. CREATE OR REPLACE Function zl_sfzhy_wdj
  2. (
  3.   ID_IN 病人資訊.身份證號%Type,
  4.   出生日期_In 病人資訊.出生日期%type,
  5.   性別_In 病人資訊.性別%type
  6. ) Return Varchar2 Is
  7. --功能:對寫入的身份證號進行核驗,核驗透過返回身份證號,核驗失敗返回空值 王冬建 2015-12-11

  8. --身份證校驗碼的計算方法
  9. --1、將前面的身份證號碼17位數分別乘以不同的係數。從第一位到第十七位的係數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
  10. --2、將這17位數字和係數相乘的結果相加。
  11. --3、用加出來和除以11,看餘數是多少?
  12. --4、餘數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字。其分別對應的最後一位身份證的號碼為1-0-X -9-8-7-6-5-4-3-2。
  13. --5、透過上面得知如果餘數是3,就會在身份證的第18位數字上出現的是9。如果對應的數字是10,身份證的最後一位號碼就是羅馬數字x。
  14. --例如:某男性的身份證號碼為【53010219200508011x】, 我們看看這個身份證是不是合法的身份證。
  15. --首先我們得出前17位的乘積和【(5*7)+(3*9)+(0*10)+(1*5)+(0*8)+(2*4)+(1*2)+(9*1)+(2*6)+(0*3)+(0*7)+(5*9)+(0*10)+(8*5)+(0*8)+(1*4)+(1*2)】是189,然後用189除以11
  16. --得出的結果是189/11=17----2,也就是說其餘數是2。最後透過對應規則就可以知道餘數2對應的檢驗碼是X。所以,可以判定這是一個正確的身份證號碼。

  17.   v_xs Varchar2(17) := '79058421637905842'; --身份證相乘係數
  18.   v_zhyw Varchar2(11) := '10X98765432'; --身份證最後一位

  19.   n_sfzh Number := 0; --相應位置的身份證號號碼
  20.   n_xcxs Number := 0; --對應位置的相乘係數數字
  21.   n_xsh Number := 0; --身份證乘以係數相加的和
  22.   n_ys Number := 0; --餘數
  23.   
  24.   v_jy Varchar2(1); --校驗位
  25.   v_sfzh Varchar2(1); --防止身份證號最後一位是字元
  26. Begin
  27.   --第一步,判斷身份證位數是否正確
  28.   If length(id_in) <> 18 Then
  29.     Return '';
  30.   End If;

  31.   --第二步,將身份證號與係數相乘,得到和
  32.   begin
  33.     For n In 1 .. 17
  34.     Loop
  35.       --獲取相應位置的身份證號號碼以及相乘係數,如果身份證號號碼為'X',則替換為0
  36.       n_sfzh := to_number(substr(id_in,n,1));
  37.       n_xcxs := Replace(to_number(substr(v_xs,n,1)),0,10);
  38.   
  39.       --獲取相乘後的係數和
  40.       n_xsh := n_xsh + n_sfzh * n_xcxs;
  41.     End Loop;
  42.   Exception
  43.     When Others Then
  44.       Return '';
  45.   End;

  46.   --獲取餘數
  47.   n_ys := Mod(n_xsh,11);
  48.   
  49.   --對身份證進行最後一位數字進行核驗
  50.   v_sfzh := upper(substr(id_in,18,1));
  51.   v_jy := substr(v_zhyw,n_ys + 1,1);
  52.   If v_sfzh = v_jy Then
  53.     
  54.     --判斷出生日期是否正確
  55.     if to_char(出生日期_in,'yyyymmdd') = substr(id_in,7,8) then
  56.       --判斷性別是否正確
  57.       if 性別_In = '男' then
  58.         if mod(substr(id_in,17,1),2) = 1 then
  59.           return id_in;
  60.         end if;
  61.       else
  62.         if mod(substr(id_in,17,1),2) = 0 then
  63.           return id_in;
  64.         end if;
  65.       end if;
  66.       return '';
  67.     Else
  68.       return '';
  69.     end if;
  70.   Else
  71.     Return '';
  72.   End If;

  73. Exception
  74.   When Others Then
  75.     Zl_Errorcenter(Sqlcode, Sqlerrm);
  76. End zl_sfzhy_wdj;
  77. /

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

相關文章