通过输入的前17位身份证号码获取最后一位身份证校验码的函数,输出为校验码的值。
create or replace function getCheckCode(Identity_code VARCHAR2)
RETURN VARCHAR2
/*****author :Mr_wu
******version :1.0.0.1
******function:通过输入的17位或18位数字计算最后一位验证位
******param :input
****** Identity_code 17位或者18位的验证位
******/
AS
last_code VARCHAR2(255);--返回字符串
sum_num number ; --位权与相应位值的乘积的和
flag NUMBER(1) ;
NotEnoughLengthInput EXCEPTION ;--异常处理,输入参数是否符合要求
BEGIN
--判断是否是数字
SELECT isnumeric(substr(Identity_code,1,17)) INTO flag FROM dual ;
IF flag = 0 THEN
RAISE NotEnoughLengthInput ;
end if ;
--初始化求和变量
sum_num := 0 ;
--判断位长是否达到身份证的要求
IF LENGTH(Identity_code) = 18 OR length(Identity_code) = 17 THEN
FOR i IN 1..17 LOOP
sum_num := sum_num + substr(Identity_code,i,1)*mod(POWER(2,(18-i)),11) ;
END LOOP ;
--根据计算的和在求模运算找到对应验证码
SELECT decode(MOD(sum_num,11),0,'1',
1,'0',
2,'X',
3,'9',
4,'8',
5,'7',
6,'6',
7,'5',
8,'4',
9,'3',
10,'2') INTO last_code FROM dual ;
IF LENGTH(Identity_code) = 18 AND substr(Identity_code,18,1) <> last_code THEN
last_code := last_code||',您输入的最后一位验证位不正确!' ;
END IF ;
ELSE
RAISE NotEnoughLengthInput ;
END if ;
RETURN '最后一位验证位为:'||last_code ;
--异常捕获
EXCEPTION
WHEN NotEnoughLengthInput THEN
last_code := '请输入17位或18位数字进行验证!' ;
RETURN last_code ;
END getCheckCode ;
判断输入的前17位字符串是否为数字的函数:
CREATE OR REPLACE FUNCTION isnumeric(str IN VARCHAR2)
RETURN NUMBER
IS
------------return 0 非数字或者为空 return 1 数字-------------
v_str NUMBER;
BEGIN
IF str IS NULL
THEN
RETURN 0;
ELSE
BEGIN
SELECT TO_NUMBER(str)
INTO v_str
FROM DUAL;
EXCEPTION
WHEN INVALID_NUMBER
THEN
RETURN 0;
END;
RETURN 1;
END IF;
END isnumeric;
效果图: