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;