加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle中验证身份证是否合法的函数脚本

发布时间:2020-12-12 13:22:26 所属栏目:百科 来源:网络整理
导读:--创建函数 入参是身份证? ?返回1 合法 0不合法 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)

--创建函数 入参是身份证? ?返回1 合法 0不合法

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 p_idcard =‘222222222222222‘ THEN
RETURN 0;
END IF;
IF MOD (TO_NUMBER (SUBSTRB (p_idcard,7,2)) + 1900,400) = 0
OR
(
MOD (TO_NUMBER (SUBSTRB (p_idcard,100) <> 0
AND
MOD (TO_NUMBER (SUBSTRB (p_idcard,4) = 0
)
THEN -- 闰年
v_regstr :=
‘^[1-8][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-8][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 not REGEXP_LIKE (p_idcard,‘^1[12345]|^2[123]|^3[1234567]|^4[123456]|^5[01234]|^6[12345]|^71|^8[12]‘) THEN --增加行政区划的条件
RETURN 0;
END IF;

IF INSTRB (v_areacode,SUBSTRB (p_idcard,‘) = 0 THEN
RETURN 0;
END IF;

IF MOD (TO_NUMBER (SUBSTRB (p_idcard,4)),4) = 0
)
THEN -- 闰年
v_regstr :=
‘^[1-8][0-9]{5}(19|20)[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-8][0-9]{5}(19|20)[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))
+ TO_NUMBER (SUBSTRB (p_idcard,11,1))
)
* 7
+ ( TO_NUMBER (SUBSTRB (p_idcard,2,1))
)
* 9
+ ( TO_NUMBER (SUBSTRB (p_idcard,3,1))
)
* 10
+ ( TO_NUMBER (SUBSTRB (p_idcard,4,1))
)
* 5
+ ( TO_NUMBER (SUBSTRB (p_idcard,5,1))
)
* 8
+ ( TO_NUMBER (SUBSTRB (p_idcard,6,16,1))
)
* 4
+ ( 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 = upper(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;/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读