Oracle 关于身份证校验规则详细说明(附有代码复制可执行)
身份證號碼組成
15位身份證號組成:
省份(2位)市(2位)區[縣](2位)年(2位)月(2位)日(2位)+3位序列號 [奇數給男性/偶數給女性]
18位身份證號組成:
省份(2位)市(2位)區[縣](2位)年(4位)月(2位)日(2位)+2位序列號+1位性別[奇數給男性/偶數給女性]+1位校驗碼
注意:
1)(身份證號碼第七位到第十四位)表示編碼對象出生的年、月、日,其中年份用四位數字表示,年、月、日之間不用分隔符。
2)(身份證號碼第十五位到十七位)地址碼所標識的區域范圍內,對同年、月、日出生的人員編定的順序號。其中第十七位奇數分給男性,偶數分給女性。
3)(身份證號碼最后一位)是根據前面十七位數字碼,按照ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼。作為尾號的校驗碼,主要是為了校驗計算機輸入公民身份證號碼的前17位數字是否正確,是由號碼編制單位按統一的公式計算出來的,如果某人的尾號是0-9,都不會出現X,但如果尾號是10,那么就得用X來代替,因為如果用10做尾號,那么此人的身份證就變成了19位,而19位的號碼違反了國家標準,并且中國的計算機用用系統也不承認19位的身份證號碼。Ⅹ是羅馬數字的10,用X來代替10,可以保證公民的身份證符合國家標準。
三、校驗碼的計算方法
1、將前面的身份證號碼17位數分別乘以不同的系數。從第一位到第十七位的系數分別為: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。
5、通過上面得知如果余數是2,身份證的最后一位號碼就是羅馬數字x。如果余數是10,就會在身份證的第18位數字上出現的是2。
例如:某男性的身份證號碼 我們要看看這個身份證是不是合法的身份證。45010119890620001X(僅測試使用)
首先我們得出前17位的乘積和是244,然后用244除以11得出的結果是17+2/11,也就是說其余數是2。最后通過對應規則就可以知道余數2對應的是羅馬數字X。可以判定這是一個合格的身份證號碼。
  1 CREATE OR REPLACE PROCEDURE PRC_身份證校驗(ID_NUMBER     IN VARCHAR2, --身份證號的輸入
  2                                       ID_SEX        OUT VARCHAR2, --性別
  3                                       ID_AGE        OUT NUMBER, --年齡
  4                                       ID_BRITHDAY   OUT DATE, --出生時間
  5                                       ID_NUMBER_END OUT VARCHAR2, --最后校驗的身份證
  6                                       ID_CODE       OUT NUMBER,
  7                                       ID_ERROR      OUT VARCHAR2) IS
  8 
  9   --15位身份證號組成:
 10   --省份(2位)市(2位)區[縣](2位)年(2位)月(2位)日(2位)+3位序列號 [奇數給男性/偶數給女性]
 11 
 12   --18位身份證號組成:
 13   --省份(2位)市(2位)區[縣](2位)年(4位)月(2位)日(2位)+2位序列號+1位性別[奇數男/偶數女]+1位校驗碼 
 14 
 15   --ID_CODE返回值分別為1、-1、-2、-3、-4五類信息,負值表示身份證信息有誤
 16   --返回1:表示身份證正確。
 17   --返回-1:表示系統錯誤,一般不會出現這個值。
 18   --返回-2:表示身份證位數有誤。
 19   --返回-3:表示出生日期有誤或者身份證含有不正確的信息。
 20   --返回-4:表示身份證最后一位校驗位有誤。
 21 
 22   --聲明數組變量
 23   --聲明N數組 用于存放身份證系數(加權因子)7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
 24   TYPE N IS VARRAY(18) OF INTEGER;
 25   --聲明S數組 用于存放求MOD得的余數'1','0','X','9','8','7','6','5','4','3','2'
 26   TYPE S IS VARRAY(11) OF VARCHAR2(11);
 27   I            INTEGER;
 28   ID_MONTH     NUMBER; --記錄身份證上的月份
 29   ID_DAY       NUMBER; --記錄身份證上的日期
 30   JQYZ_N       N; --將數組N的值賦予JQYZ_N(校驗因子)
 31   YS_S         S; --將數組S的值賦予YS_S(校驗余數)   
 32   ID_SUM       INTEGER; --身份證號分別乘以加權因子的總和
 33   ID_TMP_15_18 VARCHAR2(18); --存儲15位身份證轉18位身份證年齡前+19
 34   ID_SUM_MOD   VARCHAR2(2); --存儲加權因子總和MOD11取余數,得到身份證最后一位檢驗位
 35 BEGIN
 36   ID_CODE  := 1;
 37   ID_ERROR := NULL;
 38   ID_DAY   := 0;
 39   ID_MONTH := 0;
 40   JQYZ_N   := N(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
 41   YS_S     := S('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
 42   ID_SUM   := 0;
 43   IF LENGTHB(ID_NUMBER) = 15 THEN
 44     BEGIN
 45       ID_TMP_15_18 := SUBSTRB(ID_NUMBER, 0, 6) || '19' ||
 46                       SUBSTRB(ID_NUMBER, 7); --得到18位身份證
 47       --循環計算身份證前17位和權加因子的相乘得到的總合
 48       FOR I IN 1 .. 17 LOOP
 49         ID_SUM := ID_SUM +
 50                   TO_NUMBER(SUBSTRB(ID_TMP_15_18, I, 1)) * JQYZ_N(I);
 51       END LOOP;
 52       --將得到的總合除以11得到一個余數,余數對應相應值
 53       ID_SUM_MOD := YS_S(MOD(ID_SUM, 11) + 1);
 54       --性別取值
 55       SELECT DECODE(MOD(TO_NUMBER(SUBSTRB(ID_NUMBER, 15, 1)), 2),
 56                     0,
 57                     '女',
 58                     '男')
 59         INTO ID_SEX
 60         FROM DUAL;
 61       --出生時間取值
 62       ID_MONTH := TO_NUMBER(SUBSTRB(ID_TMP_15_18, 11, 2));
 63       ID_DAY   := TO_NUMBER(SUBSTRB(ID_TMP_15_18, 13, 2));
 64       IF (ID_MONTH > 0) AND (ID_MONTH < 13) THEN
 65         IF (ID_DAY > 0) AND (ID_DAY <= 31) THEN
 66           BEGIN
 67             ID_BRITHDAY := TO_DATE(SUBSTRB(ID_TMP_15_18, 7, 8), 'YYYYMMDD');
 68           EXCEPTION
 69             WHEN OTHERS THEN
 70               ID_CODE  := -1;
 71               ID_ERROR := '出生時間格式有誤,請核實。';
 72           END;
 73         ELSE
 74           ID_CODE  := -3;
 75           ID_ERROR := '您輸入日(' || ID_DAY || ')格式不符合要求(1-31號)';
 76         END IF;
 77       ELSE
 78         ID_CODE  := -3;
 79         ID_ERROR := '您輸入月(' || ID_MONTH || ')格式不符合要求(1-12月份)';
 80       END IF;
 81       --計算年齡
 82       ID_AGE := TRUNC(MONTHS_BETWEEN(SYSDATE, ID_BRITHDAY) / 12);
 83       --得出最后身份證號
 84       ID_NUMBER_END := ID_TMP_15_18 || UPPER(ID_SUM_MOD);
 85     END;
 86   ELSIF LENGTHB(ID_NUMBER) = 18 THEN
 87     BEGIN
 88       --循環計算身份證前17位和權加因子的相乘得到的總合
 89       FOR I IN 1 .. 17 LOOP
 90         ID_SUM := ID_SUM + TO_NUMBER(SUBSTRB(ID_NUMBER, I, 1)) * JQYZ_N(I);
 91       END LOOP;
 92       --將得到的總合除以11得到一個余數,余數對應相應值
 93       ID_SUM_MOD := YS_S(MOD(ID_SUM, 11) + 1);
 94       IF UPPER(SUBSTRB(ID_NUMBER, 18, 1)) != upper(ID_SUM_MOD) THEN
 95         ID_CODE  := -4;
 96         ID_ERROR := '身份證最后一位校驗位有誤,應為(' || ID_SUM_MOD || ')';
 97       END IF;
 98       --性別取值
 99       SELECT DECODE(MOD(TO_NUMBER(SUBSTRB(ID_NUMBER, 17, 1)), 2),
100                     0,
101                     '女',
102                     '男')
103         INTO ID_SEX
104         FROM DUAL;
105       --出生時間取值
106       ID_MONTH := TO_NUMBER(SUBSTRB(ID_NUMBER, 11, 2));
107       ID_DAY   := TO_NUMBER(SUBSTRB(ID_NUMBER, 13, 2));
108       IF (ID_MONTH > 0) AND (ID_MONTH < 13) THEN
109         IF (ID_DAY > 0) AND (ID_DAY <= 31) THEN
110           BEGIN
111             ID_BRITHDAY := TO_DATE(SUBSTRB(ID_NUMBER, 7, 8), 'YYYYMMDD');
112           EXCEPTION
113             WHEN OTHERS THEN
114               ID_CODE  := -1;
115               ID_ERROR := '出生時間格式有誤,請核實。';
116           END;
117         ELSE
118           ID_CODE  := -3;
119           ID_ERROR := '您輸入日(' || ID_DAY || ')格式不符合要求(1-31號)';
120         END IF;
121       ELSE
122         ID_CODE  := -3;
123         ID_ERROR := '您輸入月(' || ID_MONTH || ')格式不符合要求(1-12月份)';
124       END IF;
125       --計算年齡
126       ID_AGE := TRUNC(MONTHS_BETWEEN(SYSDATE, ID_BRITHDAY) / 12);
127       --得出最后身份證號
128       ID_NUMBER_END := substrb(ID_NUMBER, 1, 17) || upper(ID_SUM_MOD);
129     END;
130   ELSE
131     ID_CODE  := -2;
132     ID_ERROR := '該身份證號:' || ID_NUMBER || ' 不符合要求';
133   END IF;
134 EXCEPTION
135   WHEN OTHERS THEN
136     ID_CODE  := -1;
137     ID_ERROR := '系統發生未知錯誤'; --一般不會發生該錯誤
138 END PRC_身份證校驗;
                            總結
以上是生活随笔為你收集整理的Oracle 关于身份证校验规则详细说明(附有代码复制可执行)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: MathType如何插入竖直线
- 下一篇: enmo_day_02
