【Oracle】安装配置数据库体系架构PL/SQL备份与恢复性能调优Oracle开发

您现在的位置:首页 > 网络学院 > 数据库 > Oracle > Oracle开发 > 用正则表达式函数验证身份证号码合法性

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

来源: 作者: 日期:2007-07-01

【聚杰网Oracle开发】用正则表达式函数验证身份证号码合法性

身份证号码验证函数:


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 :=
               
'^[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, 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 :=
               
'^[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, 
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;
/

以下相关文章您是否也应该阅读一下 无相关信息
评论   点击查看全部评论
您的评论参与,将为聚杰带来更大的动力!请不要吝啬!
快速回复
请使用文明语言让我们维护健康绿色网络环境!

匿名发表   验证码: