正则表达式写法

CREATE OR REPLACE FUNCTION Func_check_id_card(p_idCard IN VARCHAR2) RETURN INT ISv_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,';
BEGINCASE LENGTHB(p_idCard)WHEN 15 THEN -- 15位IF INSTRB(v_areaCode, SUBSTR(p_idCard, 1, 2) || ',') = 0THEN 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}$';ELSEv_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) || ',') = 0THEN 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]$';ELSEv_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)THENv_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;
EXCEPTIONWHEN OTHERS THEN RETURN 0;
END Func_check_id_card;
/

非正则表达式写法

Create Or Replace Function Func_checkIdcard(p_idcard in varchar2) Return Number Isv_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 Isi        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 loopk := ascii(substr(p_string, i, 1));if k < 48 or k > 57thenflag := False;Exit;end if;end loop;Return flag;End isNumber;--[isDate]--Function isDate(p_date in varchar2) Return Boolean Isv_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 > 12thenv_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)thenif (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, '身份证号码地区码非法',1, '身份证号码通过校验'*/--[长度校验]--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 = 15thenv_isNumber := isNumber(p_idcard);if not (v_isNumber) then return -3; end if;elsif v_length = 18thenv_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 = 15thenselect '19' || substr(p_idcard, 7, 6) into v_date from dual;elsif v_length = 18thenselect 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 = 18thenv_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;
/

oracle_身份证有效性校验相关推荐

  1. python3实现身份证有效性校验

    python3 实现身份证有效性校验 直接上代码 # --coding:utf-8-- W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ...

  2. vue+element 身份证号码以及有效性校验 适用 15位 或18位

    data () {let idCardValidity = (rule, code, callback) => {var city = { 11: "北京", 12: &qu ...

  3. 【转载】 身份证号码校验(15位和18位都可以)

    转载自: 开源中国社区    面向对象的15位.18位中国大陆身份证号码解析.验证工具 import java.text.ParseException; import java.text.Simple ...

  4. 用python实现身份证号校验系统

    使用Tkinter作为GUI模块以及python基础,开发一款身份证号码校验的系统. 功能概览: 用户输入身份证号码 从身份证号码得到该用户的地区信息.出生日期.以及身份证号码是否合法 Tkinter ...

  5. vueCli3 身份证正则校验

    js /** @Description:身份证校验规则.*/ //校验身份证号 export function isIdentityId(identityId) {var patrn = /(^\d{ ...

  6. js身份证号校验方法(转载我的请注明哈哈)

    //时间变成两位数 function toTwo(n) {return +n < 10 ? '0' + n : n + ''; }; function Type(obj) {var arr = ...

  7. 在java中如何做身份证号码校验

    https://blog.csdn.net/persistencegoing/article/details/84376427 直接上代码,里面有测试类 /*** 身份证前6位[ABCDEF]为行政区 ...

  8. 身份证合法性校验规则

    身份证构成说明: 身份证号构成(从左到右): 第1-6位数是行政区域编码 第7到第14位是出生日期 第15-17位是同一天出生的顺序号(男的用奇数数,女的用偶数) 第18位是校验码,根据ISO7064 ...

  9. JS身份证号码校验大全史上最全号称公安局安全监测

    身份证号码校验 function testid(id) {// 1 "验证通过!", 0 //校验不通过 // id为身份证号码var format = /^(([1][1-5]) ...

  10. C语言基础入门48篇_26_身份证号校验程序(以身份证的校验方式是实例加深对数组及函数封装的理解、字符-‘0‘得到字符对应的int类型数字)

    本篇根据以二代身份证的校验方式是实例加深对数组及函数封装的理解 1. 第二代身份证号的组成 第二代身份证号为18位,各位数字对应了不同的信息(以下顺序从左往右): AABBCCYYYYMMDDXXXV ...

最新文章

  1. java多线程系列_Java多线程实战系列
  2. php yield 导出文件,PHP yield 读取大文件
  3. OpenCV cv::CascadeClassifier人脸检测的实例(附完整代码)
  4. Apache Flink 读取本地文件,处理数据,导入ES
  5. leetcode 476. Number Complement | 476. 数字的补数(位运算)
  6. spring mysql 读写分离_如何利用Spring实现数据库读写分离?
  7. cursor用法java,Cursor的基本使用方法
  8. ssh免密码登陆(三个节点master slave1 slave2)详细带命令版
  9. word的使用(二)
  10. Spring--事务处理编程
  11. MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
  12. linux命令(43):awk的使用技巧
  13. [转]Magento2开发教程 - 如何向数据库添加新表
  14. warning C4996 sprintf This function or variable may be unsafe
  15. 百战程序员python900集资源_尚学堂百战程序员:盘点那些实用的Python代码
  16. php微信 api,PHP微信API接口类
  17. 安卓ui xml_创建声明性XML UI语言
  18. 电子邮件发送服务器怎么看钱,验证电子邮件的验证码是发到哪里
  19. 中兴通讯2015笔试应用题
  20. python爬虫——爬取拉勾上的职位信息

热门文章

  1. 【制作脑图】万彩脑图大师教程 | 概括主题
  2. 洛谷p3376 网络流最大流模板题
  3. java keystore php,KeyStoreSpi
  4. access查找出生日期年份_Access时间日期比较查询的方法总结
  5. 为什么手机打电话的时候不能同时上网?
  6. 通过精读一本英文技术书籍搞定英语
  7. 学计算机的管理层,毕业很吃香、高薪岗位多的4个专业,计算机科学上榜,你的专业呢...
  8. ubuntu 下的限速软件 wondershaper 以及 命令行测试网速
  9. 如何注册gmail邮箱
  10. 绝对值线性化的两种方式