1 -- Created on 2016/7/20 by ADMIN 
  2 declare
  3   -- Local variables here
  4   i integer;
  5   -- Test statements here
  6   --声明数组变量
  7   --声明N数组 用于存放身份证系数(加权因子)7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
  8   type N is varray(18) of integer;
  9   --声明S数组 用于存放求MOD得的余数'1','0','X','9','8','7','6','5','4','3','2'
 10   type S is varray(11) of varchar2(11);
 11   JQYZ_N       N; --将数组N的值赋予JQYZ_N
 12   YS_S         S; --将数组S的值赋予YS_S
 13   ID_SUM       integer; --身份证号分别乘以加权因子的总和
 14   ID_TMP_15_18 varchar2(18); --存储15位身份证转18位身份证年龄前+19
 15   ID_SUM_MOD   varchar2(2); --存储加权因子总和MOD11取余数,得到身份证最后一位检验位
 16   ID_Number    varchar2(20); --身份证号
 17   ID_Sex       varchar2(10); --存储性别,通过身份证判断性别
 18   ID_BirthDay  varchar2(30); --存储出生时间
 19   ID_Age       number; --存储年龄
 20   ID_NumberEnd varchar2(20); --存储最后得出的身份证号
 21   ID_ErrorCode number; --将错误代码返回,根据错误提示判断错误原因
 22 
 23   --ID_ErrorCode返回1则身份证正确,返回其他负值则不正确
 24   --返回-1,系统错误,一般不会出现;
 25   --返回-2,身份证位数错误;
 26   --返回-3,出生日期错误或者身份证含有不正确的字符;
 27   --返回-4,检验位错误,只有18位身份证才能出现此错误;
 28 
 29   --只有正确的时候,性别和出生日期才能有值
 30 
 31   --ID_NumberEnd是升级ID_Number得到的18位身份证号码,最后x大写
 32 begin
 33   --给ID_Number赋予任意一个身份证号
 34   ID_Number := '110101198906200054';
 35   --给ID_ErrorCode赋予初始值;
 36   ID_ErrorCode := 1;
 37   --给加权因子赋值
 38   JQYZ_N := N(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
 39   --给求MOD余数数组赋值
 40   YS_S := S('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
 41   --初始ID_SUM
 42   ID_SUM := 0;
 43   --开始判断执行
 44   if lengthb(ID_Number) = 15 then
 45     --判断该身份证长度 15位则执行下面转换方法变成18位
 46     begin
 47       ID_TMP_15_18 := substrb(ID_Number, 1, 6) || '19' ||
 48                       substrb(ID_Number, 7); --将15位身份证分割拼接成18位
 49       --循环执行身份证号与加权因子相乘之和
 50       for i in 1 .. 17 loop
 51         ID_SUM := ID_SUM +
 52                   to_number(substrb(ID_TMP_15_18, i, 1)) * JQYZ_N(i);
 53       end loop;
 54       --求加权因子总和MOD11取余数,得到检验位
 55       ID_SUM_MOD := YS_S(mod(ID_SUM, 11) + 1);
 56       --判断该身份证号是男或者女 1男 2女
 57       select decode(mod(to_number(substrb(ID_TMP_15_18, 17, 1)), 2),
 58                     0,
 59                     '女',
 60                     '男')
 61         into ID_Sex
 62         from dual;
 63       --截取出生时间
 64       /*ID_BirthDay := to_date('19'||substrb(ID_Number, 7, 6), 'yyyymmdd');*/
 65       select to_date(substrb(ID_TMP_15_18, 7, 8), 'yyyymmdd')
 66         into ID_BirthDay
 67         from dual;
 68       --存储最后得出的身份证号
 69       ID_NumberEnd := ID_TMP_15_18 || ID_SUM_MOD;
 70       begin
 71         --计算年龄
 72         select trunc(months_between(sysdate, ID_BirthDay) / 12)
 73           into ID_Age
 74           from dual;
 75       exception
 76         when others then
 77           ID_ErrorCode := -3; --出生日期错误或者身份证含有不正确的字符;
 78       end;
 79     exception
 80       when others then
 81         ID_ErrorCode := -3; --出生日期错误或者身份证含有不正确的字符;
 82         return;
 83     end;
 84   elsif lengthb(ID_Number) = 18 then
 85     begin
 86       --循环执行身份证号与加权因子相乘之和
 87       for i in 1 .. 17 loop
 88         ID_SUM := ID_SUM + to_number(substrb(ID_Number, i, 1)) * JQYZ_N(i);
 89       end loop;
 90       --求加权因子总和MOD11取余数,得到检验位
 91       ID_SUM_MOD := YS_S(mod(ID_SUM, 11) + 1);
 92       --判断输入的身份证检验位与计算得到的是否一致
 93       if upper(substrb(ID_Number, -1)) != ID_SUM_MOD then
 94         ID_ErrorCode := -4; --返回-4,检验位错误,只有18位身份证才能出现此错误;
 95         return;
 96       end if;
 97       --判断该身份证号是男或者女 1男 2女
 98       select decode(mod(to_number(substrb(ID_Number, 17, 1)), 2),
 99                     0,
                     '女',
                     '男')
         into ID_Sex
         from dual;
       --截取出生时间
       select to_date(substrb(ID_Number, 7, 8), 'yyyymmdd')
         into ID_BirthDay
         from dual;
       --存储最后得出的身份证号
       ID_NumberEnd := ID_Number;
       --计算年龄
       begin
         select trunc(months_between(sysdate, ID_BirthDay) / 12)
           into ID_Age
           from dual;
       exception
         when others then
           ID_ErrorCode := -3; --出生日期错误或者身份证含有不正确的字符;
       end;
     exception
       when others then
         ID_ErrorCode := -3; --出生日期错误或者身份证含有不正确的字符;
         return;
     end;
   else
     ID_ErrorCode := -2; --身份证位数错误;
     return;
   end if;
 exception
   when others then
     ID_ErrorCode := -1;--系统错误,一般不会出现;
 end;

Oracle 检验身份证是否正确的存储过程的更多相关文章

  1. oracle闪回使用以及删除存储过程恢复

    oracle恢复删除的数据  恢复删除的存储过程 SELECT * FROM dba_source as of timestamp (systimestamp -interval'600'second ...

  2. iOS - 正则表达式判断邮箱、身份证..是否正确:

    iOS - 正则表达式判断邮箱.身份证..是否正确: //邮箱 + (BOOL) validateEmail:(NSString *)email {     NSString *emailRegex ...

  3. oracle根据身份证号码 计算年龄、性别

    一.Oracle根据身份证判断性别: 女生身份证: 431382198103246985 男生身份证: 150921197208173492 SQL语句如下:   select decode(mod ...

  4. oracle 根据身份证号计算出生日期

      1.情景展示 如何根据身份证号推算出出生日期? 2.解决方案 --根据身份证号计算出生日期 SELECT DECODE(LENGTH(ID_CARD), 18, SUBSTR(ID_CARD, 7 ...

  5. oracle split 以及 简单json解析存储过程

    BEGIN; 由于之前工作上需要在oracle中做split功能以及json格分解.然后经过一番google和优化整合,最后整理到一个存储过程包中,易于管理,代码如下: 1.包定义: CREATE O ...

  6. [C#对Oracle操作]C#操作调用Orcale存储过程有参数

    /// <summary> /// 获取ERP固定资产计提数据 /// </summary> /// <param name="strCompanyCode&q ...

  7. Oracle 奇葩的问题:创建存储过程没有反应

    问题描述:需要在oracle 数据库中再创建一个数据库(数据库实例)然后作为临时数据库,一切成功: 现在需要在数据库中新建一个表空间然后创建用户,使用创建的用户登录创建一个存储过程,执行提交刷新一下, ...

  8. Oracle在.sql文件中创建存储过程

    创建存储过程的语法网上到处都有. 可我执行了半天都创建不成功. 最后,发现! 在最后加个 / 就可以了!!! 真坑啊 今天连续被Oracle坑了两次了. 最后,感谢这个人https://blog.cs ...

  9. Oracle完全复制表结构的存储过程

    最近在处理一个分表的问题时,需要为程序创建一个自动分表的存储过程,需要保证所有表结构,约束,索引等等一致,此外视图,存储过程,权限等等问题暂不用考虑. 在Mysql中,创建分表的存储过程,相当简单:c ...

随机推荐

  1. (转载)AS3中的mouseEnabled与mouseChildren

    (转载)http://www.cnblogs.com/gongchen/archive/2013/05/09/3069055.html mouseEnabled与mouseChildren都是用来确定 ...

  2. Linux系统下使用crontab添加计划任务的方法

     在服务器中添加定期执行的任务,在很多情况下是非常必要的.比如,每天清理一次/tmp目录下的文件;没几分钟检查某一守护进程是否正常等等.这样计划任务就显得尤为方便.下面将介绍如何在Linux系统中 ...

  3. MFC DialogBar 按钮灰色不响应

    在MFC单文档加添加DialogBar,然后在DialogBar上添加按钮,会出现如下情况,单击无响应. 解决方案: 在 CSideDialogBar头文件和CPP文件里添加如下函数 afx_msg ...

  4. codeforces Codeforces 650A Watchmen

    题意:两点(x1,y1), (x2,y2)的曼哈顿距离=欧几里得距离 也就是:x1=x2或y1=y2,再删除重合点造成的重复计数即可. #include <stdio.h> #includ ...

  5. [ZETCODE]wxWidgets教程七:对话框

    本教程原文链接:http://zetcode.com/gui/wxwidgets/dialogs/ 翻译:瓶哥 日期:2013年12月9日星期一 邮箱:414236069@qq.com 主页:http ...

  6. Hadoop-Map/Reduce之单表连接的实现

    MapReduce程序就是根据其特性对数据进行一个简单的逻辑处理,其中最为重要的一个特性就是根据key值将value值进行合并,其次就是在shuffle阶段有排序. 遇到一个MR程序就是要巧妙利用合并 ...

  7. [经典] atoi && itoa

    atoi原型:int atoi(const char *nptr) atoi,需要考虑的内容: 1. 第一个字符为"-"时为负,系数为-1:为"+"时为正,系数 ...

  8. wireshark不仅仅是用来抓包分析网络的;

    凡是不找借口,不排弄推诿理由,提高自我,尽量人事; AIX smit(system manager interface tool); formerly alike; derivatives dpkg ...

  9. 七个你必须重视的 Git 使用技巧

    与其他技术相比,Git应该拯救了更多开发人员的饭碗.只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷糊糊犯下的错误. 尽管这么说,Git的命 ...

  10. 查看数据库中有哪些活动的事务,对应的会话id,执行的语句

    select dbt.database_id, DB_NAME(dbt.database_id) '数据库名', dbt.transaction_id, at.name, at.transaction ...