`
wener1999
  • 浏览: 4499 次
  • 性别: Icon_minigender_1
  • 来自: 泰州
文章分类
社区版块
存档分类
最新评论

ORACLE 身份证验证

阅读更多
CREATE OR REPLACE FUNCTION fn_checkidcard (p_idcard IN VARCHAR2)
   RETURN INT
IS
   v_regstr      VARCHAR2 (2000);
   v_sum         NUMBER;
   v_mod         NUMBER;
   v_checkcode   CHAR (11)       := '10X98765432';
   v_checkbit    CHAR (1);
   v_areacode    VARCHAR2 (2000)
      := '11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91,';
BEGIN
   CASE LENGTHB (p_idcard)
      WHEN 15
      THEN                                                            -- 15位
         IF INSTRB (v_areacode, SUBSTR (p_idcard, 1, 2) || ',') = 0
         THEN
            RETURN 0;
         END IF;

         IF    MOD (TO_NUMBER (SUBSTRB (p_idcard, 6, 2)) + 1900, 400) = 0
            OR (    MOD (TO_NUMBER (SUBSTRB (p_idcard, 6, 2)) + 1900, 100) <>
                                                                             0
                AND MOD (TO_NUMBER (SUBSTRB (p_idcard, 6, 2)) + 1900, 4) = 0
               )
         THEN                                                          -- 闰年
            v_regstr :=
               '^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$';
         ELSE
            v_regstr :=
               '^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$';
         END IF;

         IF REGEXP_LIKE (p_idcard, v_regstr)
         THEN
            RETURN 1;
         ELSE
            RETURN 0;
         END IF;
      WHEN 18
      THEN                                                             -- 18位
         IF INSTRB (v_areacode, SUBSTRB (p_idcard, 1, 2) || ',') = 0
         THEN
            RETURN 0;
         END IF;

         IF    MOD (TO_NUMBER (SUBSTRB (p_idcard, 6, 4)), 400) = 0
            OR (    MOD (TO_NUMBER (SUBSTRB (p_idcard, 6, 4)), 100) <> 0
                AND MOD (TO_NUMBER (SUBSTRB (p_idcard, 6, 4)), 4) = 0
               )
         THEN                                                          -- 闰年
            v_regstr :=
               '^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$';
         ELSE
            v_regstr :=
               '^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$';
         END IF;

         IF REGEXP_LIKE (p_idcard, v_regstr)
         THEN
            v_sum :=
                   (  TO_NUMBER (SUBSTRB (p_idcard, 1, 1))
                    + TO_NUMBER (SUBSTRB (p_idcard, 11, 1))
                   )
                 * 7
               +   (  TO_NUMBER (SUBSTRB (p_idcard, 2, 1))
                    + TO_NUMBER (SUBSTRB (p_idcard, 12, 1))
                   )
                 * 9
               +   (  TO_NUMBER (SUBSTRB (p_idcard, 3, 1))
                    + TO_NUMBER (SUBSTRB (p_idcard, 13, 1))
                   )
                 * 10
               +   (  TO_NUMBER (SUBSTRB (p_idcard, 4, 1))
                    + TO_NUMBER (SUBSTRB (p_idcard, 14, 1))
                   )
                 * 5
               +   (  TO_NUMBER (SUBSTRB (p_idcard, 5, 1))
                    + TO_NUMBER (SUBSTRB (p_idcard, 15, 1))
                   )
                 * 8
               +   (  TO_NUMBER (SUBSTRB (p_idcard, 6, 1))
                    + TO_NUMBER (SUBSTRB (p_idcard, 16, 1))
                   )
                 * 4
               +   (  TO_NUMBER (SUBSTRB (p_idcard, 7, 1))
                    + TO_NUMBER (SUBSTRB (p_idcard, 17, 1))
                   )
                 * 2
               + TO_NUMBER (SUBSTRB (p_idcard, 8, 1)) * 1
               + TO_NUMBER (SUBSTRB (p_idcard, 9, 1)) * 6
               + TO_NUMBER (SUBSTRB (p_idcard, 10, 1)) * 3;
            v_mod := MOD (v_sum, 11);
            v_checkbit := SUBSTRB (v_checkcode, v_mod + 1, 1);

            IF v_checkbit = SUBSTRB (p_idcard, 18, 1)
            THEN
               RETURN 1;
            ELSE
               RETURN 0;
            END IF;
         ELSE
            RETURN 0;
         END IF;
      ELSE
         RETURN 0;                                      -- 身份证号码位数不对
   END CASE;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN 0;
END fn_checkidcard;
/
分享到:
评论

相关推荐

    oracle身份证验证函数

    根据提供的Oracle身份证验证函数的信息,我们可以详细探讨一下这个函数的设计逻辑、实现原理以及各个部分的具体功能。 ### Oracle身份证验证函数概述 此Oracle函数名为`Func_checkIdcard`,其主要功能是验证输入的...

    oracle 身份证号码校验函数

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

    oracle 身份证号检查函数

    oracle 身份证号检查函数; select fn_checkidcard(‘身份证号’) as result from dual; 如果返回1,表示身份证号合法;如果为0,表示非法;

    Oracle检查身份证合法性函数.txt

    该函数是支持Oracle环境下的对身份照进行校验的函数,它是按照身份照计算算法去校验的,能够精准的判断出身份照是否合法,通过返回值为1:表示为正确的身份证,返回值为0表示为错误的身份证

    Oracle实现身份证校验功能

    根据提供的信息,我们可以详细解析如何在Oracle数据库中实现身份证号码的有效性验证功能。身份证号码在中国大陆通常由18位数字组成,其中包括了出生日期、性别等个人信息,并通过一个复杂的算法来确保最后一位校验码...

    Oracle按身份证号得到省市、性别、年龄的示例代码

    在实际应用中,为了提高效率和准确性,可能还需要考虑身份证号码的有效性验证以及异常情况的处理,例如非法字符、长度不正确等。同时,对于大量数据的处理,可能还需要优化查询性能,如创建索引等。

    身份证前6位原户籍识别

    这种表格方便非技术人员查看和理解,也可以用于数据验证或批量处理。 了解身份证前6位的含义,有助于进行人口统计分析、市场研究、客户定位等多种业务场景。例如,在营销活动中,企业可以通过分析用户身份证前6位来...

    身份证号校验 V2018.rar

    身份证号校验器是一个可以用来验证身份证号码是否有效的验证工具。 特点: 1、支持批量输入验证 2、支持从数据库读取验证 3、支持SQL SERVER 4、支持ORACLE 根据〖中华人民共和国国家标准 GB 11643-1999〗中有关...

    最新oracle验证统一社会信用代码的函数

    在Oracle数据库系统中,"统一社会信用代码"(Unified Social Credit Code,USCC)是一种用于企业和组织的独特标识,类似于个人的身份证号码。它由18位数字组成,包含丰富的信息,如行政区划代码、机构类型、登记序号...

    oracle验证题非常不错的

    在上述的部分内容中提到的"姓名照片姓名拼音身份证号",可能是在描述一种身份验证方法,通常在创建用户时,这些信息可能会被用作验证用户身份的依据。 性能优化是Oracle数据库管理的重要部分。通过分析SQL语句的...

    用PB和ORACLE方法实现身份证号升位.pdf

    4. 校验码(1位):根据前17位数字,通过ISO 7064:1983.MOD 11—2校验码算法计算得出,用于验证身份证号的正确性。 【实现身份证号升位的方法】 实现身份证号升位通常涉及前后台两个方面的操作,这里以PB(Power...

    公民身份证提取出生日期和性别函数

    - **第18位**:校验码,用于验证身份证号码的有效性。 ### 函数解析 接下来,我们详细分析给出的SQL函数`get_date_sex`,该函数用于从身份证号码中提取出生日期或性别。 #### SQL函数定义 ```sql CREATE ...

    远程桌面发生身份验证错误

    加密 Oracle 修正是为了防止中间人攻击而引入的一项安全措施,但这项措施可能导致某些旧版本的 RDP 客户端出现身份验证失败的问题。 #### 二、原因分析 此问题的发生主要是因为客户端和服务器之间的 CredSSP 协议...

    windows远程桌面连接时,显示发生身份验证错误,给函数提供的身份无效.docx

    ### Windows远程桌面连接身份验证错误解析与解决方案 #### 一、问题概述 在尝试通过远程桌面连接Windows Server 2008 R2时,遇到了身份验证错误提示:“给函数提供的身份无效”。这个问题主要源于Microsoft的凭据...

    身份证号解析系统

    在实际应用中,这样的系统可能广泛应用于各种场景,如银行、医疗机构、教育机构等,用于验证用户身份、进行数据录入或提供个性化服务。同时,由于涉及到个人隐私,系统必须严格遵循数据保护法规,确保信息安全,防止...

    身份证识别仪B/s结构软件例子

    在这个例子中,我们聚焦于华视电子的身份证识别仪,它是一个专为读取、处理和验证身份证信息而设计的设备。 B/S结构的核心特点是用户通过浏览器进行交互,服务器负责处理业务逻辑和数据存储。在身份证识别仪的B/S...

    身份证号码转化(Swing、JDBC、异常)原创

    身份证号码转化可能涉及的步骤包括验证号码的格式,检查其合法性,以及根据需要进行转换。例如,可能需要将15位的老版身份证号码升级到18位,或者从纯数字格式转化为包含校验码的完整格式。这通常需要对身份证号码的...

Global site tag (gtag.js) - Google Analytics