身份证校验码算法
身份证校验码产生方法:
∑(ai×Wi)(mod 11)
身份证校验码产生方法:
∑(ai×Wi)(mod 11)
i: 表示号码字符从由至左包括校验码在内的位置序号;
ai 表示第i位置上的号码字符值;
Wi 第i位置上的加权因子,其数值Wi=mod(power(2,(n-1)),11)
i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
相应的校验码:
∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10
校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2
- create or replace function ID_15to18(idCardNum varchar2) return varchar2 is
- Result varchar2(20);
- i smallint;
- num smallint := 0;
- sNum varchar2(2);
- code char(1);
- temp17 varchar2(20);
- begin
- if length(idCardNum) = 18 or idCardNum is null then
- Result := upper(idCardNum);
- elsif length(idCardNum) = 15 then
- temp17 := substr(idCardNum, 1, 6) || '19' || substr(idCardNum, 7, 9);
- i := 18;
- while i > 1 loop
- num := num + mod(power(2, i - 1), 11) * substr(temp17, 19 - i, 1);
- i := i - 1;
- end loop;
- num := mod(num, 11);
- sNum := num || '';
- if num = 0 then
- code := '1';
- elsif num = 1 then
- code := '0';
- elsif num = 2 then
- code := 'X';
- else
- code := (12 - num) || '';
- end if;
- Result := temp17 || code;
- else
- Result := idCardNum;
- end if;
- return Result;
- exception
- when others then
- dbms_output.put_line('ERROE'||idCardNum);
- end ID_15to18;