大陸身份證校驗 Oracle版本

2021-08-21 09:29:26 字數 3286 閱讀 6946

以oracle的function為例

create

orreplace function pid15to18(p_old_pid varchar2) return varchar2 is

v_result varchar2(20);

v_sum number;

begin

if length(p_old_pid) = 15

then

--檢查月份合理性

if substr(p_old_pid, 9, 2) = '00'

or substr(p_old_pid, 9, 2) > '12'

then

return p_old_pid;

endif;

--檢查日合理性

if substr(p_old_pid, 11, 2) = '00' or substr(p_old_pid, 11, 2) > '31' then

return p_old_pid;

endif;--補充出生年19

v_result := substr(p_old_pid, 1, 6) || '19' || substr(p_old_pid, 7);

--根據各位權重,計算校驗位

for i in 1 .. 17 loop

--7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

if i = 1 then

v_sum := to_number(substr(v_result, i, 1)) * 7;

elsif i = 2 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 9;

elsif i = 3 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 10;

elsif i = 4 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 5;

elsif i = 5 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 8;

elsif i = 6 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 4;

elsif i = 7 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 2;

elsif i = 8 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 1;

elsif i = 9 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 6;

elsif i = 10 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 3;

elsif i = 11 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 7;

elsif i = 12 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 9;

elsif i = 13 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 10;

elsif i = 14 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 5;

elsif i = 15 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 8;

elsif i = 16 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 4;

elsif i = 17 then

v_sum := v_sum + to_number(substr(v_result, i, 1)) * 2;

endif;end loop;

v_sum := v_sum mod 11;

if v_sum = 0 then

v_result := v_result || '1';

elsif v_sum = 1 then

v_result := v_result || '0';

elsif v_sum = 2 then

v_result := v_result || 'x';

elsif v_sum = 3 then

v_result := v_result || '9';

elsif v_sum = 4 then

v_result := v_result || '8';

elsif v_sum = 5 then

v_result := v_result || '7';

elsif v_sum = 6 then

v_result := v_result || '6';

elsif v_sum = 7 then

v_result := v_result || '5';

elsif v_sum = 8 then

v_result := v_result || '4';

elsif v_sum = 9 then

v_result := v_result || '3';

elsif v_sum = 10 then

v_result := v_result || '2';

endif; else

v_result := p_old_pid;

endif; return(v_result);

exception

when others then

return p_old_pid;

end pid15to18;

上面的函式,實現了身份證15位轉18位的校驗

可以用於

1. 15位轉18位身份證

2. 18位身份證的校驗

去掉年份的19和校驗位,18位身份證就變成15位了,通過函式轉回18位與原18位判斷即可

身份證校驗

int isright string card cout 9 wi sum 11 if p 17 x p 17 x 最後一位為 x 或 x else if id wi p 17 判斷計算出的身份證校驗碼與輸入是否相符 return error 判斷身份證號碼中的年月日是否正確 bool birthd...

身份證校驗

const regexutils else 手機號碼格式驗證 checkmobile mobile string boolean return regex.test mobile.trim else 郵箱格式驗證 checkemail email string boolean result rege...

js校驗身份證

begin 校驗身份證 function checkidcard formname,inputname,itemname var area alert area parseint idcard.substr 0,2 var y,jym var s,m var idcard array new arr...