DB2 15位身份证号转18位函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SET CURRENT SCHEMA = DB2INST1;
CREATE OR REPLACE FUNCTION BDATA.F_N_SFZ (OLD_NO VARCHAR (18))
RETURNS VARCHAR (18)
LANGUAGE SQL
BEGIN ATOMIC
/*定义变量部分*/
DECLARE v_sfz VARCHAR (20);---转换后身份证号
DECLARE v_no VARCHAR (15);---传入15位身份证号
declare i integer default 1;---递增变量
declare v_res integer default 0;---逻辑处理变量
DECLARE V_jym CHARACTER(1);---校验码
/*逻辑处理部分*/
/*1、6位日期转换为8位日期*/
SET v_no = OLD_NO;
SET v_sfz = substr (v_no, 1, 6)||'19'||substr (v_no, 7, 9);
/*2、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。*/
while i<18 do
set v_res =v_res + (substr(v_sfz,i,1)*decode(i,1,7,2,9,3,10,4,5,5,8,6,4,7,2,8,1,9,6,10,3,11,7,12,9,13,10,14,5,15,8,16,4 ,17,2));
set i =i + 1;
end while;
CALL dbms_output.put_line (i||','||v_res);
/*3、相加的和除以11,取余数,余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。*/
setv_res=MOD(v_res,11);
set V_jym = decode(v_res,0,'1',1,'0',2,'X',3,'9',4,'8',5,'7',6,'6',7,'5',8,'4',9,'3',10,'2');
setv_sfz = CONCAT(v_sfz,V_jym);
/*返回结果部分*/
RETURN v_sfz;
END;