您的位置:首页 > 数据库 > Oracle

oracle 身份证 校验位 判断字符串是否为数字函数

2014-08-27 15:32 483 查看
通过输入的前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位的验证位******/ASlast_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 THENRAISE NotEnoughLengthInput ;end if ;--初始化求和变量sum_num := 0 ;--判断位长是否达到身份证的要求IF LENGTH(Identity_code) = 18 OR length(Identity_code) = 17 THENFOR i IN 1..17 LOOPsum_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 THENlast_code := last_code||',您输入的最后一位验证位不正确!' ;END IF ;ELSERAISE NotEnoughLengthInput ;END if ;RETURN '最后一位验证位为:'||last_code ;--异常捕获EXCEPTIONWHEN NotEnoughLengthInput THENlast_code := '请输入17位或18位数字进行验证!' ;RETURN last_code ;END getCheckCode ;
判断输入的前17位字符串是否为数字的函数:
CREATE OR REPLACE FUNCTION isnumeric(str IN VARCHAR2)RETURN NUMBERIS------------return 0 非数字或者为空   return 1 数字-------------v_str NUMBER;BEGINIF str IS NULLTHENRETURN 0;ELSEBEGINSELECT TO_NUMBER(str)INTO v_strFROM DUAL;EXCEPTIONWHEN INVALID_NUMBERTHENRETURN 0;END;RETURN 1;END IF;END isnumeric;
效果图:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: