create or replace function fn_id(p_id varchar2)
return boolean
is
--身份证校验码的计算方法
-- 1、将前面的身份证号码17位数分别乘以不同的系数。
-- 第i位对应的数为[2^(18-i)]mod11。从第一位到
-- 第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2;
-- 2、将这17位数字和系数相乘的结果相加;
-- 3、用加出来和除以11,看余数是多少?;
-- 4、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。
-- 其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;
l_res number;
begin
if length(p_id) <> 18 then
raise_application_error(-20001,'ID card error!');
else
with t as ( select level rn, mod(power(2,18-level),11) coefficient
from dual
connect by level <= 17)
select mod(sum(substr(p_id,rn,1)*coefficient),11) -
case substr(p_id,-1,1)
when '0' then 1
when '1' then 0
when 'X' then 2
else 12 - substr(p_id,-1,1)
end
as res
into l_res
from t;
end if;
return case when l_res = 0 then true else false end;
end;
/
--转自