日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

今天写了个自定义函数验证身份证号是否符合规则

發布時間:2024/3/13 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 今天写了个自定义函数验证身份证号是否符合规则 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大家好,我是老王.今天調了半天,報了各種錯誤,終于寫好了這個驗證身份證號的自定義函數,規則可以參考身份證號碼的編排規則

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]{5}[0-9]{2}((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]{3}$';
? ? ? ELSE
? ? ? ? V_REGSTR := '^[1-9][0-9]{5}[0-9]{2}((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]{3}$';
? ? ? 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]{5}19[0-9]{2}((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]{3}[0-9XX]$';
? ? ? ELSE
? ? ? ? V_REGSTR := '^[1-9][0-9]{5}19[0-9]{2}((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]{3}[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{5}(18|19|([23]\D))\D{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\D{3}[0-9XX]$';

/*\\d{6} --6位地區碼
?? ??? ?(18|19|([23]\D))\D{2} --年YYYY
?? ??? ?((0[1-9])|(10|11|12)) --月MM
?? ??? ?(([0-2][1-9])|10|20|30|31) --日DD
?? ??? ?\D{3} --3位順序碼
?? ??? ?[0-9XX] --校驗碼
?? ??? ?--這是我自己查的,有問題強各位幫忙指出,在這里表示感謝
?? ??? ?*/
? ? IF REGEXP_LIKE(P_IDCARD, V_REGSTR) THEN
? ? ? RESULT1 := 1;
? ? END IF;
??
? ? V_REGSTR := '^[1-9][0-9]{5}[0-9]{2}((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]{3}$';
? ? IF REGEXP_LIKE(P_IDCARD, V_REGSTR) THEN
? ? ? RESULT1 := 1;
? ? END IF;
? END IF;
? RETURN RESULT1;
END;

總結

以上是生活随笔為你收集整理的今天写了个自定义函数验证身份证号是否符合规则的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。