工作中经常遇到身份证要从15位转换到18位的数据,朋友给了一个这样的oracle,pl/sql的函数。测试过,没问题贴出来,备用。
create or replace function f_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(idCardNum); end f_15to18; /