oracle手机号码检验字数_oracle根据检验规则获取正确身份证号

CREATE OR REPLACE FUNCTION FN_GETIDBYCHECK(IDS VARCHAR2)

RETURN VARCHAR2

/**

20140321根据身份证号获取经过校验的身份证号

*/

AS

J VARCHAR2(100) := '7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2'; --校验时身份证号各位对应的乘数

N1 VARCHAR2(100); --返回值

M NUMBER; --身份证号各位数字

S NUMBER := 0; --求和

Y VARCHAR2(20) := 'F'; --校验位

JYM VARCHAR2(20) := '10X98765432'; --校验码

CHARNUM NUMBER := 0; --是否包含字符,默认0

BEGIN

--判断身份证号是否为空或长度不足18位

IF IDS IS NULL OR LENGTH(IDS)!= 18 THEN

RETURN '';

END IF;

--判断身份证号前17位是否包含字母

SELECT COUNT(1) INTO CHARNUM FROM DUAL WHERE REGEXP_LIKE(SUBSTR(IDS, 1, 17),'[A-Z]', 'i');

IF CHARNUM = 1 THEN

RETURN '';

END IF;

--长度为18位且全部为数字,计算校验码

--求和

FOR I IN 1..17 LOOP

SELECT REGEXP_SUBSTR(J,'[^,]+',1,I) INTO M FROM DUAL;

S := S + SUBSTR(IDS, I, 1) * M;

END LOOP;

--求余

Y := MOD(S, 11);

--拼接正确的身份证号

N1 := SUBSTR(IDS, 1, 17) || SUBSTR(JYM, Y+1, 1);

--返回

RETURN N1;

EXCEPTION

WHEN NO_DATA_FOUND THEN

RETURN '';

END;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值