create or replace function GetSFZJYM(SFZHM varchar2) return varchar2 is Result varchar2(1); --type Tjqyz is array(18) of integer; Type Tjqyz is Table Of Number Index by Binary_Integer; vjqyz Tjqyz; jymzf varchar2(11); wadd integer; i integer; j integer; vsfzhm varchar2(18); begin vsfzhm := sfzhm; if length(vsfzhm)=15 then vsfzhm :=substr(vsfzhm,1,6)||'19'||substr(vsfzhm,7,9); end if; vjqyz(1):=7; vjqyz(2):=9; vjqyz(3):=10; vjqyz(4):=5; vjqyz(5):=8; vjqyz(6):=4; vjqyz(7):=2; vjqyz(8):=1; vjqyz(9):=6; vjqyz(10):=3; vjqyz(11):=7; vjqyz(12):=9; vjqyz(13):=10; vjqyz(14):=5; vjqyz(15):=8; vjqyz(16):=4; vjqyz(17):=2; vjqyz(18):=1;
jymzf := '10X98765432'; wadd := 0; for i in 1..17 loop wadd := wadd + vjqyz(i)*to_number(substr(vsfzhm,i,1)); end loop; j := (wadd mod 11) + 1; if wadd<>0 then if j=3 then result := 'X'; else result := substr(jymzf,j,1); end if; end if;
你取出数据后在前台判断下好了;根据算法;写个函数不就完了么
i----表示号码字符从由至左包括校验码在内的位置序号;
ai----表示第i位置上的号码字符值;
Wi----示第i位置上的加权因子,其数值依据公式Wi=2(n-1)(mod 11)计算得出。 i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 ai 3 4 0 5 2 4 1 9 8 0 0 1 0 1 0 0 1 a1 Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1 ai×Wi 21 36 0 25 16 16 2 9 48 0 0 9 0 5 0 0 2 a1 根据公式(1)进行计算: ∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189 189 ÷ 11 = 17 + 2/11 ∑(ai×Wi)(mod 11) = 2 然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10: ∑(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
根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为 34052419800101001X。
你可以用function GetSFZJYM(SFZHM varchar2),函数返回值为18位身份证号码的最后1位,然后将18位身份证号码进行比较即可!
--For Oracle 版
create or replace function GetSFZJYM(SFZHM varchar2) return varchar2 is
Result varchar2(1);
--type Tjqyz is array(18) of integer;
Type Tjqyz is Table Of Number Index by Binary_Integer;
vjqyz Tjqyz;
jymzf varchar2(11);
wadd integer;
i integer;
j integer;
vsfzhm varchar2(18);
begin
vsfzhm := sfzhm;
if length(vsfzhm)=15 then
vsfzhm :=substr(vsfzhm,1,6)||'19'||substr(vsfzhm,7,9);
end if;
vjqyz(1):=7;
vjqyz(2):=9;
vjqyz(3):=10;
vjqyz(4):=5;
vjqyz(5):=8;
vjqyz(6):=4;
vjqyz(7):=2;
vjqyz(8):=1;
vjqyz(9):=6;
vjqyz(10):=3;
vjqyz(11):=7;
vjqyz(12):=9;
vjqyz(13):=10;
vjqyz(14):=5;
vjqyz(15):=8;
vjqyz(16):=4;
vjqyz(17):=2;
vjqyz(18):=1;
jymzf := '10X98765432';
wadd := 0;
for i in 1..17 loop
wadd := wadd + vjqyz(i)*to_number(substr(vsfzhm,i,1));
end loop;
j := (wadd mod 11) + 1;
if wadd<>0 then
if j=3 then
result := 'X';
else
result := substr(jymzf,j,1);
end if;
end if;
return(Result);
end GetSFZJYM;