RSS
热门关键字:  linux  Java  服务器  安全  互联网
当前位置 :| linux库>Oracle>开发技术>

用正则表达式函数验证身份证号码合法性

来源:linux库 作者:linuxku.com.cn 时间:2007-07-15 Tag: 点击:

身份证号码验证函数:


CREATE OR REPLACE FUNCTION fn_checkidcard (p_idcard IN VARCHAR2)
   
RETURN INT
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, 12|| ','= 0
         
THEN
            
RETURN 0;
         
END IF;

         
IF    MOD (TO_NUMBER (SUBSTRB (p_idcard, 62)) + 1900400= 0
            
OR (    MOD (TO_NUMBER (SUBSTRB (p_idcard, 62)) + 1900100<>
                                                                             
0
                
AND MOD (TO_NUMBER (SUBSTRB (p_idcard, 62)) + 19004= 0
               )
         
THEN                                                          -- 闰年
            v_regstr :=
               
'^{5}{2}((01|03|05|07|08|10|12)(0||3)|(04|06|09|11)(0||30)|02(0|)){3}$';
         
ELSE
            v_regstr :
=
               
'^{5}{2}((01|03|05|07|08|10|12)(0||3)|(04|06|09|11)(0||30)|02(0|1|2)){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, SUBSTRB (p_idcard, 12|| ','= 0
         
THEN
            
RETURN 0;
         
END IF;

         
IF    MOD (TO_NUMBER (SUBSTRB (p_idcard, 64)), 400= 0
            
OR (    MOD (TO_NUMBER (SUBSTRB (p_idcard, 64)), 100<> 0
                
AND MOD (TO_NUMBER (SUBSTRB (p_idcard, 64)), 4= 0
               )
         
THEN                                                          -- 闰年
            v_regstr :=
               
'^{5}19{2}((01|03|05|07|08|10|12)(0||3)|(04|06|09|11)(0||30)|02(0|)){3}$';
         
ELSE
            v_regstr :
=
               
'^{5}19{2}((01|03|05|07|08|10|12)(0||3)|(04|06|09|11)(0||30)|02(0|1|2)){3}$';
         
END IF;

         
IF REGEXP_LIKE (p_idcard, v_regstr)
         
THEN
            v_sum :
=
                   (  TO_NUMBER (SUBSTRB (p_idcard, 
11))
                    
+ TO_NUMBER (SUBSTRB (p_idcard, 111))
                   )
                 
* 7
               
+   (  TO_NUMBER (SUBSTRB (p_idcard, 21))
                    
+ TO_NUMBER (SUBSTRB (p_idcard, 121))
                   )
                 
* 9
               
+   (  TO_NUMBER (SUBSTRB (p_idcard, 31))
                    
+ TO_NUMBER (SUBSTRB (p_idcard, 131))
                   )
                 
* 10
               
+   (  TO_NUMBER (SUBSTRB (p_idcard, 41))
                    
+ TO_NUMBER (SUBSTRB (p_idcard, 141))
                   )
                 
* 5
               
+   (  TO_NUMBER (SUBSTRB (p_idcard, 51))
                    
+ TO_NUMBER (SUBSTRB (p_idcard, 151))
                   )
                 
* 8
               
+   (  TO_NUMBER (SUBSTRB (p_idcard, 61))
                    
+ TO_NUMBER (SUBSTRB (p_idcard, 161))
                   )
                 
* 4
               
+   (  TO_NUMBER (SUBSTRB (p_idcard, 71))
                    
+ TO_NUMBER (SUBSTRB (p_idcard, 171))
                   )
                 
* 2
               
+ TO_NUMBER (SUBSTRB (p_idcard, 81)) * 1
               
+ TO_NUMBER (SUBSTRB (p_idcard, 91)) * 6
               
+ TO_NUMBER (SUBSTRB (p_idcard, 101)) * 3;
            v_mod :
= MOD (v_sum, 11);
            v_checkbit :
= SUBSTRB (v_checkcode, v_mod + 11);

            
IF v_checkbit = SUBSTRB (p_idcard, 181)
            
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 fn_checkidcard;
/
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册