今天寫了個自定義函式驗證身份證號是否符合規則

2021-09-25 18:26:35 字數 4373 閱讀 2120

create or replace function laowang_checkidcard2(p_idcard varchar2)

return number is

v_regstr    varchar2(2000);

v_sum       number;

v_mod       number;

v_checkcode char(11) := '10x98765432';

v_checkbit  char(1);

v_areacode  varchar2(2000) := '11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91,';

begin

case lengthb(p_idcard)

when 15 then

-- 驗證15位身份證

if instrb(v_areacode, substr(p_idcard, 1, 2) || ',') = 0 then

return 0;

end if;

if mod(to_number(substr(p_idcard, 7, 2)) + 1900, 400) = 0 or

(mod(to_number(substr(p_idcard, 7, 2)) + 1900, 100) <> 0 and

mod(to_number(substr(p_idcard, 7, 2)) + 1900, 4) = 0) then

-- 閏年

v_regstr := '^[1-9][0-9][0-9]((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]$';

else

v_regstr := '^[1-9][0-9][0-9]((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]$';

end if;

if regexp_like(p_idcard, v_regstr) then

return 1;

else

return 0;

end if;

when 18 then

--驗證 18位身份證

if instrb(v_areacode, substr(p_idcard, 1, 2) || ',') = 0 then

return 0;

end if;

if mod(to_number(substr(p_idcard, 7, 4)), 400) = 0 or

(mod(to_number(substr(p_idcard, 7, 4)), 100) <> 0 and

mod(to_number(substr(p_idcard, 7, 4)), 4) = 0) then

-- 閏年

v_regstr := '^[1-9][0-9]19[0-9]((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9][0-9xx]$';

else

v_regstr := '^[1-9][0-9]19[0-9]((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9][0-9xx]$';

end if;

if regexp_like(p_idcard, v_regstr) then

v_sum      := (to_number(substrb(p_idcard, 1, 1)) +

to_number(substrb(p_idcard, 11, 1))) * 7 +

(to_number(substrb(p_idcard, 2, 1)) +

to_number(substrb(p_idcard, 12, 1))) * 9 +

(to_number(substrb(p_idcard, 3, 1)) +

to_number(substrb(p_idcard, 13, 1))) * 10 +

(to_number(substrb(p_idcard, 4, 1)) +

to_number(substrb(p_idcard, 14, 1))) * 5 +

(to_number(substrb(p_idcard, 5, 1)) +

to_number(substrb(p_idcard, 15, 1))) * 8 +

(to_number(substrb(p_idcard, 6, 1)) +

to_number(substrb(p_idcard, 16, 1))) * 4 +

(to_number(substrb(p_idcard, 7, 1)) +

to_number(substrb(p_idcard, 17, 1))) * 2 +

to_number(substrb(p_idcard, 8, 1)) * 1 +

to_number(substrb(p_idcard, 9, 1)) * 6 +

to_number(substrb(p_idcard, 10, 1)) * 3;

v_mod      := mod(v_sum, 11);

v_checkbit := substrb(v_checkcode, v_mod + 1, 1);

if v_checkbit = substrb(p_idcard, 18, 1) then

return 1;

else

return 0;

end if;

else

return 0;

end if;

else

return 0; -- 身份證號碼位數不對

end case;

exception

when others then

return 0;

end laowang_checkidcard2;

隨後呼叫了一下:

declare

a integer;

begin

a := laowang_checkidcard('123451234512345123');

dbms_output.put_line(a);

end;

下面這是在網上看到的寫法,不知道是否符合身份證號碼規則,請大佬幫忙看一下

函式二:

create or replace function laowang_checkidcard(p_idcard in varchar2)

return number as

v_regstr varchar2(2000);

result1  varchar2(2000);

begin

result1 := 0;

if (length(p_idcard) = 15 or length(p_idcard) = 18) then

v_regstr := '^[1-9]\d(18|19|([23]\d))\d((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d[0-9xx]$';

/*\\d --6位地區碼

(18|19|([23]\d))\d --年yyyy

((0[1-9])|(10|11|12)) --月mm

(([0-2][1-9])|10|20|30|31) --日dd

\d --3位順序碼

[0-9xx] --校驗碼

--這是我自己查的,有問題強各位幫忙指出,在這裡表示感謝

*/if regexp_like(p_idcard, v_regstr) then

result1 := 1;

end if;

v_regstr := '^[1-9][0-9][0-9]((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]$';

if regexp_like(p_idcard, v_regstr) then

result1 := 1;

end if;

end if;

return result1;

end;

統一身份證自定義協議 2

簡單的來講,統一身份認證應該分為兩塊,一是身份認證,一是統一認證 可以理解為sso 如果要整合多協議,比如saml cas,是在統一認證進行整合,而不是身份認證。圖1 結構上,自定義協議還是包括sp idp server和idp engine三部分。這時候我們需要建立乙個信任體系,我們認為idp s...

PHP 驗證身份證是否合法的函式

話不多說,請看 function is idcard id d 0 9 x 程式設計客棧 ar程式設計客棧r split array if preg match regx,id if 15 strlen id 檢查15位 www.cppcns.com d d d d preg match regx,...

oracle 自定義身份證15位轉18位 函式

oracle 函式15位身份證號轉18位身份證號,同時可以參考此 編寫身份證校驗函式 15位身份證轉18位 function get newcert oldcert in varchar2 return varchar2 isnew cert varchar2 20 old cert varchar...