自己写的一个身份证号码判断的过程包,运行环境为plsql
2015-05-27 16:33
323 查看
create or replace package sp_id_card is
/********************************************************************
#function:身份证信息查询
#version:1.00
#author:qcf
#createdate:2015-5-26
#input: card_id VARCHAR2 身份证号码
#output:out_msg VARCHAR2 身份证信息
#modifyexplain:
********************************************************************/
function is_number(str varchar2) return integer; --判断输入的身份证是否为数字
function is_date(in_date varchar2) return integer; --判断输入的是否是身份证号码
function is_idcard(card_id varchar2) return integer; --判断输入的是否是身份证号码
function is_areacode(card_id varchar2) return integer; --判断前6位是否为地区号
function get_age(card_id in varchar2) return varchar2; --获取年龄
function get_sex(card_id varchar2) return varchar2; --获取性别
function get_area(card_id varchar2) return varchar2; --获取地区信息
function get_day(card_id varchar2) return varchar2; --获取出生日期
function get_card_info(card_id varchar2) return varchar2;--身份信息简介
procedure id_card_info(card_id varchar2, out_msg out varchar); --身份信息简介
end sp_id_card;
/
create or replace package body sp_id_card is
/********************************************************************
#function:身份证信息查询
#version:1.00
#author:qcf
#createdate:2015-5-26
#input: card_id VARCHAR2 身份证号码
#output:out_msg VARCHAR2 身份证信息
#modifyexplain:
********************************************************************/
--判断输入的身份证是否为数字
function is_number(str varchar2) return integer is
begin
if (length(trim(translate(str, '0123456789', ' '))) is null) then
return 1;
else
return 0;
end if;
end is_number;
function is_date(in_date varchar2) return integer is
val date;
begin
val := to_date(nvl(in_date, 'a'), 'yyyy-mm-dd hh24:mi:ss');
return 1;
exception
when others then
return 0;
end;
--判断输入的是否是身份证号码
function is_idcard(card_id varchar2) return integer is
idcardlen integer default 0;
begin
idcardlen := length(card_id);
if (idcardlen = 18 and is_number(card_id) = 1 and
is_date(substr(card_id, 7, 8)) = 1) and is_areacode(card_id) = 1 or
(idcardlen = 18 and
is_number(substr(card_id, 1, idcardlen - 1)) = 1 and
substr(card_id, -1, 1) = 'X' and
is_date(substr(card_id, 7, 8)) = 1) and is_areacode(card_id) = 1 then
return 1;
else
return 0;
end if;
end is_idcard;
--判断前6位是否为地区号
function is_areacode(card_id varchar2) return integer is
v_areacode varchar2(6);
begin
select a.area_no
into v_areacode
from idcard_area a
where a.area_no = substr(card_id, 1, 6);
return 1;
exception
when no_data_found then
return 0;
end is_areacode;
--获取年龄
function get_age(card_id in varchar2) return varchar2 is
agevalue varchar2(10);
begin
if is_idcard(card_id) = 0 then
return '身份证号码错误,请核查!';
end if;
if (length(trim(card_id)) = 18) then
select (to_char(sysdate, 'yyyy') -
to_char(substr(card_id, 7, 4)))
into agevalue
from dual;
else
if (length(trim(card_id)) = 15) then
select (to_char(sysdate, 'yyyy') -
to_char('19' || substr(card_id, 7, 2)))
into agevalue
from dual;
else
agevalue := '0';
end if;
end if;
return agevalue;
end get_age;
--获取性别
function get_sex(card_id varchar2) return varchar2 is
idcardlen integer;
begin
idcardlen := length(card_id);
if is_idcard(card_id) = 0 then
return '身份证号码错误,请核查!';
end if;
if idcardlen = 18 and substr(card_id, 17, 1) in (2, 4, 6, 8, 0) then
return('女');
end if;
if idcardlen = 18 and substr(card_id, 17, 1) in (1, 3, 5, 7, 9) then
return('男');
end if;
if idcardlen = 15 and substr(card_id, 15, 1) in (1, 3, 5, 7, 9) then
return('男');
end if;
if idcardlen = 15 and substr(card_id, 15, 1) in (2, 4, 6, 8, 0) then
return('女');
end if;
end get_sex;
--获取地区信息
function get_area(card_id varchar2) return varchar2 is
-- IDCardLen integer;
v_area_name varchar2(100);
begin
-- IDCardLen := length(card_id);
if is_idcard(card_id) = 0 then
return '身份证号码错误,请核查!';
end if;
select a.area_name
into v_area_name
from idcard_area a
where a.area_no = substr(card_id, 1, 6);
return v_area_name;
end get_area;
--获取出生日期
function get_day(card_id varchar2) return varchar2 is
v_year varchar2(100);
v_mounth varchar2(100);
v_day varchar2(100);
begin
if is_idcard(card_id) = 0 then
return '身份证号码错误,请核查!';
end if;
select substr(card_id, 7, 4) into v_year from dual;
select substr(card_id, 11, 2) into v_mounth from dual;
select substr(card_id, 13, 2) into v_day from dual;
return v_year || '年' || v_mounth || '月' || v_day || '日';
end get_day;
----身份信息简介
function get_card_info(card_id varchar2) return varchar2 is
-- v_name varchar2(200) ;--姓名
v_age varchar2(200); --年龄
v_sex varchar2(200); --性别
v_area varchar2(200); --地区
v_day varchar2(200); --出生日期
begin
if is_idcard(card_id) = 0 then
return '身份证号码错误,请核查!';
end if;
if is_idcard(card_id) = 1 then
v_age := get_age(card_id);
v_sex := get_sex(card_id);
v_area := get_area(card_id);
v_day := get_day(card_id);
return '年龄:' || v_age || ',性别:' || v_sex || ',地区:' ||
v_area || ',出生年月:' || v_day;
end if;
end get_card_info;
--身份信息简介
procedure id_card_info(card_id varchar2, out_msg out varchar) is
-- v_name varchar2(200) ;--姓名
v_age varchar2(200); --年龄
v_sex varchar2(200); --性别
v_area varchar2(200); --地区
v_day varchar2(200); --出生日期
begin
if is_idcard(card_id) = 0 then
out_msg := '身份证号码错误,请核查!';
end if;
if is_idcard(card_id) = 1 then
v_age := get_age(card_id);
v_sex := get_sex(card_id);
v_area := get_area(card_id);
v_day := get_day(card_id);
out_msg := '年龄:' || v_age || ',性别:' || v_sex || ',地区:' ||
v_area || ',出生年月:' || v_day;
dbms_output.put_line('年龄:' || v_age || ',性别:' || v_sex ||
',地区:' || v_area || ',出生年月:' || v_day);
end if;
end;
end sp_id_card;
/
/********************************************************************
#function:身份证信息查询
#version:1.00
#author:qcf
#createdate:2015-5-26
#input: card_id VARCHAR2 身份证号码
#output:out_msg VARCHAR2 身份证信息
#modifyexplain:
********************************************************************/
function is_number(str varchar2) return integer; --判断输入的身份证是否为数字
function is_date(in_date varchar2) return integer; --判断输入的是否是身份证号码
function is_idcard(card_id varchar2) return integer; --判断输入的是否是身份证号码
function is_areacode(card_id varchar2) return integer; --判断前6位是否为地区号
function get_age(card_id in varchar2) return varchar2; --获取年龄
function get_sex(card_id varchar2) return varchar2; --获取性别
function get_area(card_id varchar2) return varchar2; --获取地区信息
function get_day(card_id varchar2) return varchar2; --获取出生日期
function get_card_info(card_id varchar2) return varchar2;--身份信息简介
procedure id_card_info(card_id varchar2, out_msg out varchar); --身份信息简介
end sp_id_card;
/
create or replace package body sp_id_card is
/********************************************************************
#function:身份证信息查询
#version:1.00
#author:qcf
#createdate:2015-5-26
#input: card_id VARCHAR2 身份证号码
#output:out_msg VARCHAR2 身份证信息
#modifyexplain:
********************************************************************/
--判断输入的身份证是否为数字
function is_number(str varchar2) return integer is
begin
if (length(trim(translate(str, '0123456789', ' '))) is null) then
return 1;
else
return 0;
end if;
end is_number;
function is_date(in_date varchar2) return integer is
val date;
begin
val := to_date(nvl(in_date, 'a'), 'yyyy-mm-dd hh24:mi:ss');
return 1;
exception
when others then
return 0;
end;
--判断输入的是否是身份证号码
function is_idcard(card_id varchar2) return integer is
idcardlen integer default 0;
begin
idcardlen := length(card_id);
if (idcardlen = 18 and is_number(card_id) = 1 and
is_date(substr(card_id, 7, 8)) = 1) and is_areacode(card_id) = 1 or
(idcardlen = 18 and
is_number(substr(card_id, 1, idcardlen - 1)) = 1 and
substr(card_id, -1, 1) = 'X' and
is_date(substr(card_id, 7, 8)) = 1) and is_areacode(card_id) = 1 then
return 1;
else
return 0;
end if;
end is_idcard;
--判断前6位是否为地区号
function is_areacode(card_id varchar2) return integer is
v_areacode varchar2(6);
begin
select a.area_no
into v_areacode
from idcard_area a
where a.area_no = substr(card_id, 1, 6);
return 1;
exception
when no_data_found then
return 0;
end is_areacode;
--获取年龄
function get_age(card_id in varchar2) return varchar2 is
agevalue varchar2(10);
begin
if is_idcard(card_id) = 0 then
return '身份证号码错误,请核查!';
end if;
if (length(trim(card_id)) = 18) then
select (to_char(sysdate, 'yyyy') -
to_char(substr(card_id, 7, 4)))
into agevalue
from dual;
else
if (length(trim(card_id)) = 15) then
select (to_char(sysdate, 'yyyy') -
to_char('19' || substr(card_id, 7, 2)))
into agevalue
from dual;
else
agevalue := '0';
end if;
end if;
return agevalue;
end get_age;
--获取性别
function get_sex(card_id varchar2) return varchar2 is
idcardlen integer;
begin
idcardlen := length(card_id);
if is_idcard(card_id) = 0 then
return '身份证号码错误,请核查!';
end if;
if idcardlen = 18 and substr(card_id, 17, 1) in (2, 4, 6, 8, 0) then
return('女');
end if;
if idcardlen = 18 and substr(card_id, 17, 1) in (1, 3, 5, 7, 9) then
return('男');
end if;
if idcardlen = 15 and substr(card_id, 15, 1) in (1, 3, 5, 7, 9) then
return('男');
end if;
if idcardlen = 15 and substr(card_id, 15, 1) in (2, 4, 6, 8, 0) then
return('女');
end if;
end get_sex;
--获取地区信息
function get_area(card_id varchar2) return varchar2 is
-- IDCardLen integer;
v_area_name varchar2(100);
begin
-- IDCardLen := length(card_id);
if is_idcard(card_id) = 0 then
return '身份证号码错误,请核查!';
end if;
select a.area_name
into v_area_name
from idcard_area a
where a.area_no = substr(card_id, 1, 6);
return v_area_name;
end get_area;
--获取出生日期
function get_day(card_id varchar2) return varchar2 is
v_year varchar2(100);
v_mounth varchar2(100);
v_day varchar2(100);
begin
if is_idcard(card_id) = 0 then
return '身份证号码错误,请核查!';
end if;
select substr(card_id, 7, 4) into v_year from dual;
select substr(card_id, 11, 2) into v_mounth from dual;
select substr(card_id, 13, 2) into v_day from dual;
return v_year || '年' || v_mounth || '月' || v_day || '日';
end get_day;
----身份信息简介
function get_card_info(card_id varchar2) return varchar2 is
-- v_name varchar2(200) ;--姓名
v_age varchar2(200); --年龄
v_sex varchar2(200); --性别
v_area varchar2(200); --地区
v_day varchar2(200); --出生日期
begin
if is_idcard(card_id) = 0 then
return '身份证号码错误,请核查!';
end if;
if is_idcard(card_id) = 1 then
v_age := get_age(card_id);
v_sex := get_sex(card_id);
v_area := get_area(card_id);
v_day := get_day(card_id);
return '年龄:' || v_age || ',性别:' || v_sex || ',地区:' ||
v_area || ',出生年月:' || v_day;
end if;
end get_card_info;
--身份信息简介
procedure id_card_info(card_id varchar2, out_msg out varchar) is
-- v_name varchar2(200) ;--姓名
v_age varchar2(200); --年龄
v_sex varchar2(200); --性别
v_area varchar2(200); --地区
v_day varchar2(200); --出生日期
begin
if is_idcard(card_id) = 0 then
out_msg := '身份证号码错误,请核查!';
end if;
if is_idcard(card_id) = 1 then
v_age := get_age(card_id);
v_sex := get_sex(card_id);
v_area := get_area(card_id);
v_day := get_day(card_id);
out_msg := '年龄:' || v_age || ',性别:' || v_sex || ',地区:' ||
v_area || ',出生年月:' || v_day;
dbms_output.put_line('年龄:' || v_age || ',性别:' || v_sex ||
',地区:' || v_area || ',出生年月:' || v_day);
end if;
end;
end sp_id_card;
/
相关文章推荐
- (1)任务描述 编写一个程序:输入一个身份证号,判断该号码对应的人是否是18至25岁女孩,是则输出”yes”,否则输出”no” (2)功能要求 ①输入一行给出正整数N(<= 100)是输入的身份证号码
- 编写一个程序:输入一个身份证号,判断该号码对应的人是否是18至25岁,是则输出”yes”,否则输出”no”。
- 编写一个程序:输入一个身份证号,判断该号码对应的人是否是18至25岁女孩,是则输出”yes”,否则输出”no”
- Oracle技术之如何监测一个PLSQL过程的运行情况(一)
- 如何监测一个PLSQL过程的运行情况(三)
- (迟到的博客,始终是一个过程)Linux/Unix环境下计算C程序运行时间
- 分享一个自己应用中判断应用运行状态是前台还是后台
- Oracle技术之如何监测一个PLSQL过程的运行情况(二)
- 编写一个程序:输入一个身份证号,判断该号码对应的人是多少岁,是男是女
- 一个通用的分页存储过程实现-SqlServer(附上sql源码,一键执行即刻搭建运行环境)
- Oracle技术之如何监测一个PLSQL过程的运行情况(三)
- 如何监测一个PLSQL过程的运行情况(二)
- jsp运行环境的入门设置过程
- 一个最小可运行环境:一个简单脚本
- Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析
- 一个身份证号码验证接口[1]
- 判断自己的应用是否在前台运行
- 做完一个小网站的一点经验总结(2): asp.net+access程序运行环境的配置
- 在ubuntu下自己配置LAMP环境的过程摘录
- C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码