Create Or Replace
Function f_Is_身份证(v_Input Varchar2) Return Number
As
----------------------------------------------------------------
--功能:检查本输入数据是否为身份证件
--参数:如下
--返回:如果位身份证返回 1,非身份证返回
-1
--修改:
-----------------------------------------------------------------
v_省份码
Varchar2(900) :=
'11,42,12,43,13,44,14,45,15,46,21,50,22,51,23,52,31,53,32,54,33,61,34,62,35,63,36,64,37,65,41';
n_Is_格式
Number(2) := -1;
n_Length
Number(2) := -1;
n_Sum
Number(5)
:= 0;
v_Finput
Varchar2(100) :=
Replace(To_Single_Byte(Upper(v_Input)), ' ', '');
v_Full_Input
Varchar2(20);
n_Mod
Number(2);
n_Sign_Mod
Number(1); --//是否在取值Mod 中
n_End_Card
Varchar2(1); --//最后一位身份证
Begin
-----------------------------------------------------------------
--算法说明
-----------------------------------------------------------------
--判断身份证的长度
Select Lengthb(v_Finput) Into n_Length
From Dual;
If n_Length = 15 Or n_Length = 18
Then
Select Count(*) Into
n_Is_格式 From Dual Where Regexp_Like(Rtrim(v_Finput, 'X'),
'^[[:digit:]]+$');
If n_Is_格式 <>
1 Then
Return - 1;
Else
--15位的身份证补齐
If n_Length = 15 Then
Select Substr(v_Finput, 1, 6) || '19' ||
Substr(v_Finput, 7, 6) || Substr(v_Finput, 13, 3) Into v_Full_Input
From Dual;
Else
v_Full_Input := v_Finput;
End If;
If To_Number(Substr(v_Full_Input, 7, 8)) > 1900 And
To_Number(Substr(v_Full_Input, 7, 8)) <=
To_Number(To_Char(Sysdate, 'YYYYMMDD')) Then
--判断15位身份证//Begin
If Lengthb(v_Full_Input) = 17
Then
If Instr(v_省份码,
Substr(v_Full_Input, 1, 2)) = 0 Then
Return
1;
End If;
End If;
--//判断15位身份证//End
If Lengthb(v_Full_Input) = 18
Then
--//系数:7 9 10 5 8 4 2 1 6 3 7
9 10 5 8 4 2
n_Sum := Substr(v_Full_Input,
1, 1) * 7 + Substr(v_Full_Input, 2, 1) * 9 + Substr(v_Full_Input,
3, 1) * 10 + Substr(v_Full_Input, 4, 1) * 5 +
Substr(v_Full_Input, 5, 1) * 8 +
Substr(v_Full_Input, 6, 1) * 4 + Substr(v_Full_Input, 7, 1) * 2 +
Substr(v_Full_Input, 8, 1) * 1 +
Substr(v_Full_Input, 9, 1) * 6 +
Substr(v_Full_Input, 10, 1) * 3 + Substr(v_Full_Input, 11, 1) * 7
+
Substr(v_Full_Input, 12, 1) * 9 +
Substr(v_Full_Input, 13, 1) * 10 + Substr(v_Full_Input, 14, 1) * 5
+
Substr(v_Full_Input, 15, 1) * 8 +
Substr(v_Full_Input, 16, 1) * 4 + Substr(v_Full_Input, 17, 1) *
2;
n_Mod := Mod(n_Sum,
11);
--//余数只可能有0 1 2 3 4 5 6 7 8 9
10这11个数字
Select Count(*) Into
n_Sign_Mod From Dual Where n_Mod In (0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10);
If n_Sign_Mod = 0
Then
Return -
1;
Else
Select
Substr(v_Full_Input, 18, 1) Into n_End_Card From
Dual;
--//取Mod
正常(进行对照)
If (n_Mod
= 0 And n_End_Card = '1') Or (n_Mod = 1 And n_End_Card = '0') Or
(n_Mod = 2 And n_End_Card = 'X') Or
(n_Mod = 3 And n_End_Card =
'9') Or (n_Mod = 4 And n_End_Card = '8') Or (n_Mod = 5 And
n_End_Card = '7') Or
(n_Mod = 6 And n_End_Card =
'6') Or (n_Mod = 7 And n_End_Card = '5') Or (n_Mod = 8 And
n_End_Card = '4') Or
(n_Mod = 9 And n_End_Card =
'3') Or (n_Mod = 10 And n_End_Card = '2') Then
Return 1;
Else
Return - 1;
End
If;
End If;
End If;
End If;
End
If;
Else
Return -
1;
End If;
Exception
When Others Then
Return -
1;
End
f_Is_身份证;
/