CREATE OR REPLACE FUNCTION check_certificate_id(IN_certificate_ID in varchar2,
IN_LENGTH in integer)
return integer is
--========================================================================================================================
--模块名称: 身份证号校验
--模块编号:
--模块描述:
-- 根据“GB11643-1999《公民身份号码》”校验18位身份证号
-- 检查15位身份证号中出生日期部分
--=======================================================================================================================
-- 定义业务变量
-- =======================================================================================================================
TYPE value_array IS TABLE OF varchar2(20) INDEX BY BINARY_INTEGER;
TYPE number_array IS TABLE OF number INDEX BY BINARY_INTEGER;
v_year char(4);
v_month char(2);
v_date char(2);
v_return number default 1;
v_mod integer default 11;
check_value_ary value_array;
modulus_ary number_array;
i integer default 0;
v_last char(1);
v_temp varchar2(17);
v_sum integer;
v_num integer;
begin
if in_length = 15 then
v_year := '19' || substrb(in_certificate_id, 7, 2);
v_month := substrb(in_certificate_id, 9, 2);
v_date := substrb(in_certificate_id, 11, 2);
if v_month in ('01', '03', '05', '07', '08', '10', '12') and
to_number(v_date) between 1 and 31 then
v_return := 1;
elsif v_month in ('04', '06', '09', '11') and
to_number(v_date) between 1 and 30 then
v_return := 1;
elsif v_month in ('02') and
(to_number(v_date) between 1 and 28 or
((mod(v_year, 400) = 0 or
(mod(v_year, 4) = 0 and mod(v_year, 100) <> 0)) and
to_number(v_date) between 1 and 29)) then
v_return := 1;
else
v_return := 0;
end if;
elsif in_length = 18 then
-- 校验码
check_value_ary(1) := '1';
check_value_ary(2) := '0';
check_value_ary(3) := 'x';
check_value_ary(4) := '9';
check_value_ary(5) := '8';
check_value_ary(6) := '7';
check_value_ary(7) := '6';
check_value_ary(8) := '5';
check_value_ary(9) := '4';
check_value_ary(10) := '3';
check_value_ary(11) := '2';
--系数
modulus_ary(1) := 7;
modulus_ary(2) := 9;
modulus_ary(3) := 10;
modulus_ary(4) := 5;
modulus_ary(5) := 8;
modulus_ary(6) := 4;
modulus_ary(7) := 2;
modulus_ary(8) := 1;
modulus_ary(9) := 6;
modulus_ary(10) := 3;
modulus_ary(11) := 7;
modulus_ary(12) := 9;
modulus_ary(13) := 10;
modulus_ary(14) := 5;
modulus_ary(15) := 8;
modulus_ary(16) := 4;
modulus_ary(17) := 2;
v_temp := substr(IN_certificate_ID, 1, 17);
v_last := substr(IN_certificate_ID, 18, 1);
begin
if TO_NUMBER(v_temp) > 0 then
-- 求和 S = Sum(Ai * Wi), i = 0, ... , 16
v_sum := 0;
for i in 1 .. 17 loop
v_sum := v_sum + to_number(substr(v_temp, i, 1)) * modulus_ary(i);
end loop;
v_num := mod(v_sum, v_mod);
v_num := v_num + 1;
if v_last = check_value_ary(v_num) then
v_return := 1;
else
v_return := 0;
end if;
else
v_return := 0;
end if;
exception
when others then
v_return := 0;
end;
else
v_return := 0;
end if;
return v_return;
end;
分享到:
相关推荐
Oracle身份证号码校验函数,可以将15位身份号码升为18位,检验出生年月等信息
Java居民身份证号校验规则!Java居民身份证号校验规则!Java居民身份证号校验规则!Java居民身份证号校验规则!Java居民身份证号校验规则!
针对身份证号码的校验,以及能自动将身份证从15位升级为18位
身份证号码是中国公民重要的个人身份标识,它包含了个人的出生日期和地区的编码信息,并且通过一个校验码来确保号码的准确性。在Java编程中,验证身份证号码的校验码是否正确是一项常见的任务,特别是在处理个人信息...
根据给定的信息,我们可以深入探讨有关“C++身份证号码校验”的知识点,包括身份证号码的结构、校验方法以及如何使用C++语言实现这一过程。 ### 一、身份证号码的基本结构 身份证号码由18位数字组成,按照以下规则...
### Java实现的身份证号码校验类详解 #### 一、引言 身份证号码是中国公民的唯一标识符,具有很高的安全性和唯一性。在中国大陆地区,身份证号码由18位数字组成,其中最后一位用于校验整个身份证号码的有效性。...
在IT行业中,身份证号码校验是一项常见的需求,尤其是在涉及到个人信息处理的应用中。本文将深入探讨如何使用C#语言实现这一功能。C#是一种强大的、面向对象的编程语言,广泛应用于Windows平台上的应用程序开发,...
在这个"身份证号校验-Delphi源码"项目中,我们可以学习到如何使用Delphi处理字符串,进行数学运算以及验证身份证号码的有效性。 首先,身份证号码的校验主要依据国家制定的算法,该算法包括两个部分:数字校验和...
可以校验15位和18位的身份证号码。 如果输入的18位身份证号码有错,将自动改为正确的号码。
《CCMI身份证号校验v1.0:深入解析C#身份证验证技术》 在信息技术领域,数据验证是确保信息准确无误的关键步骤,尤其是在处理个人敏感信息时,如身份证号码。本文将深入探讨由CCMI开发的身份证号校验程序,基于C#...
`f_get_sfzvalid.srf` 和 `f_get_sfz_validbh.srf` 这两个文件很可能就是包含身份证校验功能的SRF文件,其中`f_get_sfzvalid`和`f_get_sfz_validbh`可能是函数的名字,分别对应不同的校验逻辑。 身份证校验通常涉及...
在这个话题中,我们将深入探讨身份证号码的结构、校验原理以及如何进行有效性校验。 身份证号码通常由18位数字组成,分为以下几个部分: 1. 地区代码(6位):前6位表示持证人的户籍所在地,按照国家标准《GB/T ...
中国居民身份证校验码算法: 将身份证号码前面的17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。 将这17位数字和系数相乘的结果相加。 用加...
身份证号码由18位数字组成,前17位分别代表出生年月日、性别、出生顺序号和区域代码。第18位是校验位,用于验证前17位的正确性。校验位的计算遵循以下步骤: 1. **赋权**: 对前17位数字分别乘以不同的权重因子,从...
### 知识点一:身份证校验接口的基本概念 身份证校验接口是一种专门用于验证身份证号码真实性的网络服务。在本案例中,该接口通过发送HTTP请求至特定URL(如`https://shenfen.supfree.net/search.asp?id=身份证号`...
身份证和银行卡号码的最后一位都是用前面的数字计算而来的校验码,所以可以在一定程度上减少误输入的可能。 此文件包含身份证、19位银行卡号码校验,年龄提取,性别提取的公式。 使用方式,非常简单,打开此文件,...
这个“身份证号校验、升位程序及源码”提供了这样的功能,能够对15位或17位的身份证号码进行校验,并能将其升位到18位,同时计算出相关的个人信息。 首先,身份证号码的校验主要基于校验码的计算。中国的身份证号码...
以下是一个简单的PHP身份证校验函数示例: ```php function validateIdCard($idCard) { if (strlen($idCard) != 18 || !ctype_digit(str_replace('X', '', $idCard))) { return false; } $idCard = strtoupper...
Java校验身份证号码工具类 ---运行几年了,很靠谱。包含15位身份证校验Java校验身份证号码工具类 ---运行几年了,很靠谱。包含15位身份证校验