概述

有个朋友说能不能用函数来实现对身份证的校验,所以这里用Oracle的函数来实现,其他数据库异曲同工..


身份证校验函数

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;

觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

sql判断邮箱是否合法_分享一个oracle身份证校验函数,判断你的身份证是否合法...相关推荐

  1. mysql数据库新建一个递增的_分享一个mysql实验—基于数据库事务隔离级别RR及RC的测试...

    概述 今天主要分享一个最近做的实验,主要是测试mysql数据库在RR和RC不同事务隔离级别下的表现. MySQL使用可重复读来作为默认隔离级别的主要原因是语句级的Binlog.RR能提供SQL语句的写 ...

  2. php微信_分享一个完整的微信开发php代码

    这篇文章主要为大家分享一个完整的微信开发php代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了微信开发php代码,供大家参考,具体内容如下 //封装成一个微信接口类 cla ...

  3. vc++6.0获取磁盘基本信息_分享一个实用脚本--一键获取linux内存、cpu、磁盘IO等信息...

    概述 今天主要分享一个shell脚本,用来获取linux系统CPU.内存.磁盘IO等信息. 脚本 #!/bin/bash # 获取要监控的本地服务器IP地址 IP=`ifconfig | grep i ...

  4. 编写一个弹出式菜单的shell程序_分享一个有趣的shell脚本--实现抓阄程序

    概述 今天主要分享一个有趣的shell脚本,用来实现抓阄,平时就不用剪刀石头布了. 需求 使用shell编写一个抓阄的程序: 1.执行脚本后,输入英文名字全拼,产生随机数01-99之间的数字,数字越大 ...

  5. mac redis 客户端_分享一个免费好用的Redis桌面客户端

    今天波波为做开发的朋友们分享一个免费好用的Redis桌面客户端.这个工具纯属机缘巧合下发现的,前几天波波在开发一个物联网平台,硬件通信部分用了Workman Gateway来负责通信和消息推送,结果因 ...

  6. 2个表 遍历 组合_分享一个python脚本--数字随机组合有多少

    概述 今天主要分享一个python实例,大家有兴趣也可以做一下~ 需求 有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 方法一:遍历全部可能,把有重复的剃掉. tot ...

  7. python脚本视频_分享一个Python下载视频脚本

    分享一个Python下载视频脚本(通过flvcd.com代理的) 代码如下: #!/usr/local/bin/python #test for command line parameter(s) # ...

  8. python 公众号文章发布_分享一个牛逼的Python项目:公众号文章爬虫

    我订阅了近 100 个公众号,有时候想再找之前读过的文章,发现搜索起来特别困难,如果忘了收藏,估计得找半小时,更让人无语的是,文章已经发布者删除,或者文章因违规被删除.那么有没有这样的爬虫,可以将公众 ...

  9. emwin 仪表_分享一个emWin软键盘控件

    分享一个emWin软键盘控件 [复制链接] 本帖最后由 glcd 于 2016-6-27 16:30 编辑 花了两天时间做了个emWin软键盘控件,并命名为ButtonSKB控件: image001. ...

最新文章

  1. MaxCompute studio与权限那些事儿
  2. 大写的服,看完这篇你还不懂RocketMQ算我输
  3. python中的mysql数据库like模糊查询
  4. Exception in thread AWT-EventQueue-0 java.lang.IllegalThreadStateException
  5. arm linux rsync文件同步
  6. 【BZOJ3630】[JLOI2014]镜面通道 几何+最小割
  7. 一文搞懂C语言回调函数
  8. matplotlib 柱状图 分组_Python数据分析与可视化之matplotlib可视化(三)
  9. 操作系统知识点整理【均来自于网络】
  10. C#【Thread】Interlocked 轻量级锁
  11. HCIA-Cloud Computing华为云计算IA认证笔记
  12. PHP语言之表单基础——educoder答案
  13. python任务栏都隐藏了_如何隐藏PyQt4 Python应用程序的任务栏图标?
  14. 进程系列(一)-进程基本概念
  15. 图像处理之高斯混合模型
  16. STM32之USART-串口通信(含串口实验详细解析)
  17. 计算机网络基础课内实验报告答案,计算机网络基础课内实验报告-20210418131414.docx-原创力文档...
  18. 【每日早报】20200113
  19. [玩转UE4/UE5动画系统>Control Rig篇] 之 使用Control Rig实现目标偏移(Aim Offset)(附项目代码)
  20. 【小5聊】jQuery基础之获取指定时间月份的最后一天

热门文章

  1. WEB前端 从原生JavaScript到MVVM
  2. react ajax 分页,React实现分页效果
  3. 关于生活与工作的一些反思
  4. nodeJS的管道流和链式流
  5. mwArray与C++接口
  6. php memcache可存,php使用memcache共享存储session(二)
  7. MySQL:简单insert 一秒原因排查
  8. BZOJ1565:[NOI2009]植物大战僵尸——题解
  9. 你真的在正确地使用WLAN控制器吗?
  10. 转 Python爬虫入门一之综述