Oracle 检验身份证是否正确的存储过程
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 检验身份证是否正确的存储过程的更多相关文章
- oracle闪回使用以及删除存储过程恢复
oracle恢复删除的数据 恢复删除的存储过程 SELECT * FROM dba_source as of timestamp (systimestamp -interval'600'second ...
- iOS - 正则表达式判断邮箱、身份证..是否正确:
iOS - 正则表达式判断邮箱.身份证..是否正确: //邮箱 + (BOOL) validateEmail:(NSString *)email { NSString *emailRegex ...
- oracle根据身份证号码 计算年龄、性别
一.Oracle根据身份证判断性别: 女生身份证: 431382198103246985 男生身份证: 150921197208173492 SQL语句如下: select decode(mod ...
- oracle 根据身份证号计算出生日期
1.情景展示 如何根据身份证号推算出出生日期? 2.解决方案 --根据身份证号计算出生日期 SELECT DECODE(LENGTH(ID_CARD), 18, SUBSTR(ID_CARD, 7 ...
- oracle split 以及 简单json解析存储过程
BEGIN; 由于之前工作上需要在oracle中做split功能以及json格分解.然后经过一番google和优化整合,最后整理到一个存储过程包中,易于管理,代码如下: 1.包定义: CREATE O ...
- [C#对Oracle操作]C#操作调用Orcale存储过程有参数
/// <summary> /// 获取ERP固定资产计提数据 /// </summary> /// <param name="strCompanyCode&q ...
- Oracle 奇葩的问题:创建存储过程没有反应
问题描述:需要在oracle 数据库中再创建一个数据库(数据库实例)然后作为临时数据库,一切成功: 现在需要在数据库中新建一个表空间然后创建用户,使用创建的用户登录创建一个存储过程,执行提交刷新一下, ...
- Oracle在.sql文件中创建存储过程
创建存储过程的语法网上到处都有. 可我执行了半天都创建不成功. 最后,发现! 在最后加个 / 就可以了!!! 真坑啊 今天连续被Oracle坑了两次了. 最后,感谢这个人https://blog.cs ...
- Oracle完全复制表结构的存储过程
最近在处理一个分表的问题时,需要为程序创建一个自动分表的存储过程,需要保证所有表结构,约束,索引等等一致,此外视图,存储过程,权限等等问题暂不用考虑. 在Mysql中,创建分表的存储过程,相当简单:c ...
随机推荐
- 【Android 复习】:Android五种布局的使用方法
---恢复内容开始--- 在Android布局中,有五种常用的布局,下面我们就来学习一下这几种布局的使用方式 1) 线性布局:LinearLayout 2) 帧布局: FrameLayout 3) ...
- Android 网络通信框架Volley简介(Google IO 2013)
1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient( ...
- [C#]网络编程系列专题二:HTTP协议详解
转自:http://www.cnblogs.com/zhili/archive/2012/08/18/2634475.html 我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网 ...
- Json数据异步绑定到界面的Table并且自动刷新
转自:http://blog.csdn.net/jianxin1009/article/details/8565828‘ 做Winform习惯了,大家都习惯设置datasource这样的写法. 如果想 ...
- Linux Shell脚本中点号和source命令
Linux中一个文件是根据其是否具有执行属性来判断他是否可以直接运行的.就像Windows下的exe一样.如果我们要执行某一个文件,可以先将其权限修改为可执行(必须是所有者或者root才能修改).然后 ...
- Ruby 程序员最要好的朋友
Ruby 是... 一种跨平台.面向对象的动态类型编程语言.Ruby 体现了表达的一致性和简单性, 它不仅是一门编程语言,更是表达想法的一种简练方式. https://www.ruby-lang.or ...
- AudioMixer的脚本控制
AudioMixer是Unity5新特性之一,能很好的实现立体声效果. 这儿先记录一下脚本控制的方法: 1.添加一个Group,然后点击它 2.右侧面板上出现2个参数:pitch(速度)和volume ...
- 在Mac下如何开Wifi
1. 首先打开系统偏好设置,选择共享 2. 把互联网共享给勾上 在里面选择共享来源为以太网,共享方式为Wifi 3. 点开Wifi选项,在里面设置密码(如果需要设置密码的话) 4. 然后看状态栏上的W ...
- 【转】【opencv】仿射变换
仿射变换 目标 在这个教程中你将学习到如何: 使用OpenCV函数 warpAffine 来实现一些简单的重映射. 使用OpenCV函数 getRotationMatrix2D 来获得一个 旋转矩阵 ...
- js模板引擎实现原理
将html模板放入script标签中 // "> // ]]> 使用javascript开始解析模板 // )[^\t]*)'/g,"$1\r"). repl ...