|
推荐
楼主 |
发表于 2008-4-27 15:51:46
|
只看该作者
根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为 34052419800101001X。
程序代码:
CREATE OR REPLACE FUNCTION f_Id_Verify(Pid VARCHAR2) RETURN VARCHAR2 IS
RESULT VARCHAR2(58);
TYPE Char_Tabletype IS TABLE OF VARCHAR2(1) NOT NULL INDEX BY BINARY_INTEGER;
TYPE Num_Tabletype IS TABLE OF NUMBER NOT NULL INDEX BY BINARY_INTEGER;
Tab_a Char_Tabletype;
Tab_w Num_Tabletype;
Tab_i Char_Tabletype;
i NUMBER(2) := 0;
Len NUMBER(2) := Length(Rtrim(Ltrim(Pid)));
Sigma NUMBER(4) := 0;
BEGIN
Tab_i(0) := '1';
Tab_i(1) := '0';
Tab_i(2) := 'X';
Tab_i(3) := '9';
Tab_i(4) := '8';
Tab_i(5) := '7';
Tab_i(6) := '6';
Tab_i(7) := '5';
Tab_i(8) := '4';
Tab_i(9) := '3';
Tab_i(10) := '2';
--Pid := TRIM(Pid);
IF Len = 18 THEN
FOR i IN 1 .. 17 LOOP
Tab_w(i) := MOD(Power(2, ((19 - i) - 1)), 11);
Tab_a(i) := Substr(Pid, i, 1);
Sigma := Sigma + Tab_w(i) * Tab_a(i);
END LOOP;
RESULT := Substr(Pid, 1, 17) || Tab_i(MOD(Sigma, 11));
END IF;
IF RESULT = Pid THEN
RETURN('正确');
ELSE
RETURN('错误,应该是:' || RESULT);
END IF;
EXCEPTION
WHEN OTHERS THEN
BEGIN
RETURN('错误');
Dbms_Output.Put_Line('发生了异常的错误');
END;
END f_Id_Verify;
/
组织机构代码是每一个机关、社会团体、企事业单位在全国范围内唯一的、始终不变的法定代码标识。
最新使用的组织机构代码在1997年颁布实施,由8位数字(或大写拉丁字母)本体代码和1位数字(或大写拉丁字母)校验码组成。本体代码采用系列(即分区段)顺序编码方法。校验码按下列公式计算:
8
C9 = 11 - MOD ( ∑Ci * Wi ,11) … (2)
i=1
其中:MOD —— 表示求余函数;
i —— 表示代码字符从左到右位置序号;
Ci —— 表示第i位置上的代码字符的值,采用附录A“代码字符集”所列字符;
C9 —— 表示校验码;
Wi —— 表示第i位置上的加权因子,其数值如下表:
i 1 2 3 4 5 6 7 8
Wi 3 7 9 10 5 8 4 2
当MOD函数值为1(即 C9 = 10)时,校验码用字母X表示。
程序代码:
CREATE OR REPLACE FUNCTION Jgid_Verify(Pid VARCHAR2) RETURN VARCHAR2 IS
RESULT VARCHAR2(58);
TYPE Char_Tabletype IS TABLE OF VARCHAR2(1) NOT NULL INDEX BY BINARY_INTEGER;
TYPE Num_Tabletype IS TABLE OF NUMBER NOT NULL INDEX BY BINARY_INTEGER;
Tab_a Char_Tabletype;
Tab_w Num_Tabletype;
Tab_i Char_Tabletype;
i NUMBER(2) := 0;
Len NUMBER(2) := Length(Rtrim(Ltrim(Pid)));
Sigma NUMBER(4) := 0;
BEGIN
IF Len = 9 THEN
-- C9 = 11 - MOD ( ∑Ci * Wi ,11) … (2)
FOR i IN 1 .. 8 LOOP
Tab_w(i) := MOD(Power(2, ((10 - i) - 1)), 11);
--Tab_w(i) := MOD(Power(2, ((10 - i) - 1)), 11); 就是加权算法值
Tab_a(i) := Substr(Pid, i, 1);
Sigma := Sigma + Tab_w(i) * Tab_a(i);
END LOOP;
IF MOD(Sigma, 11) = 1 THEN
RESULT := Substr(Pid, 1, 8) || 'X';
ELSE
RESULT := Substr(Pid, 1, 8) || To_Char(11 - MOD(Sigma, 11));
END IF;
END IF;
IF RESULT = Pid THEN
RETURN('正确');
ELSE
RETURN('错误,应该是:' || RESULT);
END IF;
EXCEPTION
WHEN OTHERS THEN
BEGIN
RETURN('错误');
Dbms_Output.Put_Line('发生了异常的错误');
END;
END Jgid_Verify;
/ |
|