`
wy_716
  • 浏览: 29123 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

身份证号校验

SQL 
阅读更多
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 身份证号码校验函数

    Oracle身份证号码校验函数,可以将15位身份号码升为18位,检验出生年月等信息

    Java居民身份证号校验规则

    Java居民身份证号校验规则!Java居民身份证号校验规则!Java居民身份证号校验规则!Java居民身份证号校验规则!Java居民身份证号校验规则!

    JAVA身份证号码校验类

    针对身份证号码的校验,以及能自动将身份证从15位升级为18位

    JAVA验证身份证号码校验码是否正确.zip

    身份证号码是中国公民重要的个人身份标识,它包含了个人的出生日期和地区的编码信息,并且通过一个校验码来确保号码的准确性。在Java编程中,验证身份证号码的校验码是否正确是一项常见的任务,特别是在处理个人信息...

    C++身份证号码校验

    根据给定的信息,我们可以深入探讨有关“C++身份证号码校验”的知识点,包括身份证号码的结构、校验方法以及如何使用C++语言实现这一过程。 ### 一、身份证号码的基本结构 身份证号码由18位数字组成,按照以下规则...

    java写的身份证号码校验类

    ### Java实现的身份证号码校验类详解 #### 一、引言 身份证号码是中国公民的唯一标识符,具有很高的安全性和唯一性。在中国大陆地区,身份证号码由18位数字组成,其中最后一位用于校验整个身份证号码的有效性。...

    C#实现身份证号码校验

    在IT行业中,身份证号码校验是一项常见的需求,尤其是在涉及到个人信息处理的应用中。本文将深入探讨如何使用C#语言实现这一功能。C#是一种强大的、面向对象的编程语言,广泛应用于Windows平台上的应用程序开发,...

    身份证号校验-Delphi源码

    在这个"身份证号校验-Delphi源码"项目中,我们可以学习到如何使用Delphi处理字符串,进行数学运算以及验证身份证号码的有效性。 首先,身份证号码的校验主要依据国家制定的算法,该算法包括两个部分:数字校验和...

    身份证号码校验程序.exe

    可以校验15位和18位的身份证号码。 如果输入的18位身份证号码有错,将自动改为正确的号码。

    CCMI身份证号校验v1.0

    《CCMI身份证号校验v1.0:深入解析C#身份证验证技术》 在信息技术领域,数据验证是确保信息准确无误的关键步骤,尤其是在处理个人敏感信息时,如身份证号码。本文将深入探讨由CCMI开发的身份证号校验程序,基于C#...

    身份证号码校验(PB源码)

    `f_get_sfzvalid.srf` 和 `f_get_sfz_validbh.srf` 这两个文件很可能就是包含身份证校验功能的SRF文件,其中`f_get_sfzvalid`和`f_get_sfz_validbh`可能是函数的名字,分别对应不同的校验逻辑。 身份证校验通常涉及...

    身份证号码校验+解析源码

    在这个话题中,我们将深入探讨身份证号码的结构、校验原理以及如何进行有效性校验。 身份证号码通常由18位数字组成,分为以下几个部分: 1. 地区代码(6位):前6位表示持证人的户籍所在地,按照国家标准《GB/T ...

    身份证号校验 V2018.rar

    中国居民身份证校验码算法: 将身份证号码前面的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=身份证号`...

    Excel 身份证号码校验 年龄 性别提取 银行卡数字校验

    身份证和银行卡号码的最后一位都是用前面的数字计算而来的校验码,所以可以在一定程度上减少误输入的可能。 此文件包含身份证、19位银行卡号码校验,年龄提取,性别提取的公式。 使用方式,非常简单,打开此文件,...

    身份证号校验、升位程序及源码

    这个“身份证号校验、升位程序及源码”提供了这样的功能,能够对15位或17位的身份证号码进行校验,并能将其升位到18位,同时计算出相关的个人信息。 首先,身份证号码的校验主要基于校验码的计算。中国的身份证号码...

    IDCard身份证号校验

    以下是一个简单的PHP身份证校验函数示例: ```php function validateIdCard($idCard) { if (strlen($idCard) != 18 || !ctype_digit(str_replace('X', '', $idCard))) { return false; } $idCard = strtoupper...

    Java校验身份证号码工具类 ---运行几年了,很靠谱。包含15位身份证校验

    Java校验身份证号码工具类 ---运行几年了,很靠谱。包含15位身份证校验Java校验身份证号码工具类 ---运行几年了,很靠谱。包含15位身份证校验

Global site tag (gtag.js) - Google Analytics