亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

oracle 身份證校驗函數的實例代碼

2020-07-26 13:26:12
字體:
來源:轉載
供稿:網友

1、正則表達式寫法:

CREATE OR REPLACE FUNCTION Func_checkidcard (p_idcard IN VARCHAR2) RETURN INTIS  v_regstr   VARCHAR2 (2000);  v_sum     NUMBER;  v_mod     NUMBER;  v_checkcode  CHAR (11)    := '10X98765432';  v_checkbit  CHAR (1);  v_areacode  VARCHAR2 (2000) := '11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91,';BEGIN  CASE LENGTHB (p_idcard)   WHEN 15   THEN                              -- 15位     IF INSTRB (v_areacode, SUBSTR (p_idcard, 1, 2) || ',') = 0 THEN      RETURN 0;     END IF;     IF MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 2)) + 1900, 400) = 0      OR       (        MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 2)) + 1900, 100) <> 0        AND         MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 2)) + 1900, 4) = 0      )     THEN                             -- 閏年      v_regstr :=        '^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$';     ELSE      v_regstr :=        '^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$';     END IF;     IF REGEXP_LIKE (p_idcard, v_regstr) THEN      RETURN 1;     ELSE      RETURN 0;     END IF;   WHEN 18   THEN                               -- 18位     IF INSTRB (v_areacode, SUBSTRB (p_idcard, 1, 2) || ',') = 0 THEN      RETURN 0;     END IF;         IF MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 4)), 400) = 0      OR       (        MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 4)), 100) <> 0        AND         MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 4)), 4) = 0      )     THEN                             -- 閏年      v_regstr :=        '^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$';     ELSE      v_regstr :=        '^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$';     END IF;     IF REGEXP_LIKE (p_idcard, v_regstr) THEN      v_sum :=          ( TO_NUMBER (SUBSTRB (p_idcard, 1, 1))          + TO_NUMBER (SUBSTRB (p_idcard, 11, 1))          )         * 7        +  ( TO_NUMBER (SUBSTRB (p_idcard, 2, 1))          + TO_NUMBER (SUBSTRB (p_idcard, 12, 1))          )         * 9        +  ( TO_NUMBER (SUBSTRB (p_idcard, 3, 1))          + TO_NUMBER (SUBSTRB (p_idcard, 13, 1))          )         * 10        +  ( TO_NUMBER (SUBSTRB (p_idcard, 4, 1))          + TO_NUMBER (SUBSTRB (p_idcard, 14, 1))          )         * 5        +  ( TO_NUMBER (SUBSTRB (p_idcard, 5, 1))          + TO_NUMBER (SUBSTRB (p_idcard, 15, 1))          )         * 8        +  ( TO_NUMBER (SUBSTRB (p_idcard, 6, 1))          + TO_NUMBER (SUBSTRB (p_idcard, 16, 1))          )         * 4        +  ( TO_NUMBER (SUBSTRB (p_idcard, 7, 1))          + TO_NUMBER (SUBSTRB (p_idcard, 17, 1))          )         * 2        + TO_NUMBER (SUBSTRB (p_idcard, 8, 1)) * 1        + TO_NUMBER (SUBSTRB (p_idcard, 9, 1)) * 6        + TO_NUMBER (SUBSTRB (p_idcard, 10, 1)) * 3;      v_mod := MOD (v_sum, 11);      v_checkbit := SUBSTRB (v_checkcode, v_mod + 1, 1);      IF v_checkbit = upper(substrb(p_idcard,18,1)) THEN        RETURN 1;      ELSE        RETURN 0;      END IF;     ELSE      RETURN 0;     END IF;   ELSE     RETURN 0;  -- 身份證號碼位數不對  END CASE;EXCEPTION  WHEN OTHERS  THEN   RETURN 0;END fn_checkidcard;/Show Err;

2、非正則表達式寫法

Create Or Replace Function Func_checkIdcard (p_idcard in varchar2) Return NumberIs  v_sum     Number;  v_mod     Number;  v_length   Number;  v_date    Varchar2(10);  v_isDate   Boolean;  v_isNumber  Boolean;  v_isNumber_17 Boolean;  v_checkbit  CHAR (1);  v_checkcode  CHAR (11)    := '10X98765432';  v_areacode  VARCHAR2 (2000) := '11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91,';     --[isNumber]--  Function isNumber (p_string in varchar2) Return Boolean  Is    i      number;    k      number;    flag    boolean;    v_length  number;  Begin    /*    算法:      通過ASCII碼判斷是否數字,介于[48, 57]之間。      select ascii('0'),ascii('1'),ascii('2'),ascii('3'),ascii('4'),ascii('5'),ascii('6'),ascii('7'),ascii('8'),ascii('9') from dual;    */         flag := True;    select length(p_string) into v_length from dual;         for i in 1..v_length loop      k := ascii(substr(p_string,i,1));      if k < 48 or k > 57 then        flag := False;        Exit;      end if;    end loop;         Return flag;  End isNumber;     --[isDate]--  Function isDate (p_date in varchar2) Return Boolean  Is    v_flag     boolean;    v_year     number;    v_month     number;    v_day      number;    v_isLeapYear  boolean;  Begin    --[初始化]--    v_flag := True;         --[獲取信息]--    v_year := to_number(substr(p_date,1,4));    v_month := to_number(substr(p_date,5,2));    v_day  := to_number(substr(p_date,7,2));         --[判斷是否為閏年]--    if (mod(v_year,400) = 0) Or (mod(v_year,100) <> 0 And mod(v_year,4) = 0) then      v_isLeapYear := True;    else      v_isLeapYear := False;    end if;         --[判斷月份]--    if v_month < 1 Or v_month > 12 then      v_flag := False;      Return v_flag;    end if;         --[判斷日期]--    if v_month in (1,3,5,7,8,10,12) and (v_day < 1 or v_day > 31) then      v_flag := False;    end if;    if v_month in (4,6,9,11) and (v_day < 1 or v_day > 30) then      v_flag := False;    end if;    if v_month in (2) then      if (v_isLeapYear) then        --[閏年]--        if (v_day < 1 or v_day > 29) then          v_flag := False;        end if;      else        --[非閏年]--        if (v_day < 1 or v_day > 28) then          v_flag := False;        end if;      end if;    end if;         --[返回結果]--    Return v_flag;  End isDate;Begin  /*  返回值說明:    -1   身份證號碼位數不對    -2   身份證號碼出生日期超出范圍    -3   身份證號碼含有非法字符    -4   身份證號碼校驗碼錯誤    -5   身份證號碼地區碼非法   身份證號碼通過校驗  */  --[長度校驗]--  if p_idcard is null then   return -1;  end if ;  select lengthb(p_idcard) into v_length from dual;  if v_length not in (15,18) then    return -1;  end if;     --[區位碼校驗]--  if instrb(v_areacode, substr(p_idcard, 1, 2)||',') = 0 then    return -5;  end if;     --[格式化校驗]--  if v_length = 15 then    v_isNumber := isNumber (p_idcard);    if not (v_isNumber) then      return -3;    end if;  elsif v_length = 18 then    v_isNumber  := isNumber (p_idcard);    v_isNumber_17 := isNumber (substr(p_idcard,1,17));    if not ((v_isNumber) or (v_isNumber_17 and upper(substr(p_idcard,18,1)) = 'X')) then      return -3;    end if;  end if;     --[出生日期校驗]--  if v_length = 15 then    select '19'||substr(p_idcard,7,6) into v_date from dual;  elsif v_length = 18 then    select substr(p_idcard,7,8) into v_date from dual;  end if;  v_isDate := isDate (v_date);  if not (v_isDate) then    return -2;  end if;     --[校驗碼校驗]--  if v_length = 18 then    v_sum :=        ( TO_NUMBER (SUBSTRB (p_idcard, 1, 1))        + TO_NUMBER (SUBSTRB (p_idcard, 11, 1))        )       * 7      +  ( TO_NUMBER (SUBSTRB (p_idcard, 2, 1))        + TO_NUMBER (SUBSTRB (p_idcard, 12, 1))        )       * 9      +  ( TO_NUMBER (SUBSTRB (p_idcard, 3, 1))        + TO_NUMBER (SUBSTRB (p_idcard, 13, 1))        )       * 10      +  ( TO_NUMBER (SUBSTRB (p_idcard, 4, 1))        + TO_NUMBER (SUBSTRB (p_idcard, 14, 1))        )       * 5      +  ( TO_NUMBER (SUBSTRB (p_idcard, 5, 1))        + TO_NUMBER (SUBSTRB (p_idcard, 15, 1))        )       * 8      +  ( TO_NUMBER (SUBSTRB (p_idcard, 6, 1))        + TO_NUMBER (SUBSTRB (p_idcard, 16, 1))        )       * 4      +  ( TO_NUMBER (SUBSTRB (p_idcard, 7, 1))        + TO_NUMBER (SUBSTRB (p_idcard, 17, 1))        )       * 2      + TO_NUMBER (SUBSTRB (p_idcard, 8, 1)) * 1      + TO_NUMBER (SUBSTRB (p_idcard, 9, 1)) * 6      + TO_NUMBER (SUBSTRB (p_idcard, 10, 1)) * 3;    v_mod := MOD (v_sum, 11);    v_checkbit := SUBSTRB (v_checkcode, v_mod + 1, 1);         if v_checkbit = upper(substrb(p_idcard,18,1)) then      return 1;    else      return -4;    end if;  else    return 1;  end if;End Func_checkIdcard;/Show Err;

總結

以上所述是小編給大家介紹的oracle 身份證校驗函數,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
26uuu亚洲伊人春色| 亚洲第一精品电影| 欧美福利视频网站| 久久精品成人欧美大片古装| 精品久久久久久久久久久| 国产日韩换脸av一区在线观看| 久久久久久91| 91理论片午午论夜理片久久| 中文国产成人精品| 欧美韩日一区二区| 成人性生交大片免费看视频直播| 国产精品视频最多的网站| 国产精品aaa| 亚洲亚裔videos黑人hd| 日韩www在线| 久久亚洲精品视频| 一区二区av在线| 欧美午夜女人视频在线| 日本久久久久久久久久久| 日韩中文字幕精品视频| 亚洲国产女人aaa毛片在线| 日韩欧美在线一区| 亚洲国产一区二区三区四区| 精品成人69xx.xyz| 日韩美女av在线| 91丝袜美腿美女视频网站| 亚洲欧美三级伦理| 亚洲视频在线观看视频| 91综合免费在线| 欧美日韩中文字幕在线视频| 欧美日韩国产123| 中文字幕久久久av一区| 亚洲国产天堂久久综合| 夜夜嗨av一区二区三区免费区| 亚洲精品国产精品久久清纯直播| 国产成一区二区| 中文字幕在线观看日韩| 亚洲天堂av在线免费| 国产亚洲精品综合一区91| 国产精品户外野外| 国产亚洲一区精品| 成人精品视频在线| 久久久久国产精品免费网站| 国产成人在线亚洲欧美| 一区二区亚洲精品国产| 7m第一福利500精品视频| 日韩精品在线视频美女| 欧美最猛性xxxxx亚洲精品| 欧美亚洲国产成人精品| 欧美一级视频一区二区| 欧美一区二区三区图| 精品国产一区av| 国产欧美一区二区白浆黑人| 色噜噜狠狠狠综合曰曰曰| 亚洲成av人片在线观看香蕉| 中文字幕亚洲一区二区三区五十路| 国产ts人妖一区二区三区| 成人福利网站在线观看11| 亚洲品质视频自拍网| 中国china体内裑精亚洲片| 欧美一级淫片videoshd| 亚洲自拍偷拍网址| 欧美xxxx14xxxxx性爽| 91av免费观看91av精品在线| 日本免费一区二区三区视频观看| 欧美性69xxxx肥| 91产国在线观看动作片喷水| 国产精品久在线观看| 欧美日韩性视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲精品国产综合区久久久久久久| 亚洲女人被黑人巨大进入| 懂色av中文一区二区三区天美| 日韩在线观看视频免费| 成人综合国产精品| 亚洲一区二区三区四区视频| 色噜噜久久综合伊人一本| 国产成人av在线播放| 国产精品免费福利| 欧美亚洲日本网站| 久久久久免费视频| 午夜精品视频网站| 精品成人久久av| 日本中文字幕不卡免费| 国产精品丝袜视频| 国产91对白在线播放| 国产91精品网站| 国产精品久久久久久久久| 欧美黑人xxx| 亚洲精品日韩av| 欧洲成人免费aa| 国产精品av网站| 久久久爽爽爽美女图片| 日本韩国欧美精品大片卡二| 国产精品免费视频久久久| 色婷婷成人综合| 国产欧美精品日韩精品| 欧美中文字幕视频在线观看| 亚洲综合色激情五月| 最近2019年中文视频免费在线观看| 国产精品视频一| 日韩在线播放一区| 91地址最新发布| 久久97久久97精品免视看| 国产精品久久久久7777婷婷| 日韩美女在线观看| 91久久精品国产91久久性色| 国产精品亚洲网站| 国产精品高清网站| 97久久超碰福利国产精品…| 精品露脸国产偷人在视频| 久热精品视频在线免费观看| 亚洲深夜福利在线| 久久综合88中文色鬼| 国产精品久久久久久久天堂| 亚洲色图av在线| 日本伊人精品一区二区三区介绍| 九九九久久久久久| 国产欧美韩国高清| 色综合天天狠天天透天天伊人| 欧美性高潮在线| 俺也去精品视频在线观看| 国产一区二区日韩| 欧美丝袜第一区| 97久久精品国产| 久久精品国产成人精品| 日本国产一区二区三区| 亚洲国语精品自产拍在线观看| 韩国欧美亚洲国产| www.欧美精品| 中文字幕一精品亚洲无线一区| 国产精品视频内| 久久香蕉精品香蕉| 亚洲精品一区久久久久久| 国产69精品99久久久久久宅男| 亚洲电影中文字幕| 欧美激情2020午夜免费观看| 日韩在线播放av| 国内精品国产三级国产在线专| 精品久久久一区二区| 欧美性生活大片免费观看网址| 日韩欧美一区二区三区| 一级做a爰片久久毛片美女图片| 中文字幕无线精品亚洲乱码一区| 日本免费久久高清视频| 欧美专区国产专区| 一区二区亚洲精品国产| 国产精品美乳在线观看| 欧美日韩国产精品一区二区不卡中文| 国产精品自在线| 国内外成人免费激情在线视频网站| 91精品国产自产在线老师啪| 亚洲午夜国产成人av电影男同| 欧美日韩福利电影| 欧美黄色片视频| 性色av一区二区咪爱| 久久影院模特热| 人妖精品videosex性欧美| 精品国内产的精品视频在线观看| 欧美日韩激情美女| 国产香蕉97碰碰久久人人| 欧美日韩电影在线观看| 97色在线观看免费视频| 成人网中文字幕|