一、统一社会信用代码编码规则
统一代码由十八位的阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)组成,包括第1位登记管理 部门代码、第2位机构类别代码、第3位第8位登记管理机关行政区划码、第9位第17位主体标识 码(组织机构代码)、第18位校验码五个部分。
代码及说明
第1位:登记管理部门代码
登记管理部门代码使用阿拉伯数字或大写英文字母表示,登记管理部门代码标识如下表:
第2位:机构类别代码
机构类别代码使用阿拉伯数字表示,如下表:
第3位~第8位:登记管理机关行政区划码
登记管理机关行政区划码使用阿拉伯数字表示
第9位~第17位:主体标识码(组织机构代码)
主体标识码使用阿拉伯数字或大写英文字母表示
第18位:校验码
校验码使用阿拉伯数字或大写英文字母表示,校验码按下列公式计算:
MOD(n,m)———整数求余函数,例如:函数 MOD(31,31)的值为0; i ———代码字符从左到右的位置序号; Ci ———第i位置上的代码字符的值,'0123456789ABCDEFGHJKLMNPQRTUWXY’字符对应的值 对应数字0-30; C18 ———校验码; Wi ———第i位上的加权因子,加权因子见下表。
当 MOD函数值为1(即C18=30)时,校验码应用符号 Y 表示;当 MOD函数值为0(即C18=31)时,校验码用0表示。
二、校验函数编码
CREATE OR REPLACE FUNCTION FN_UNISCID_CHECK(in_uniscid VARCHAR2)
RETURN VARCHAR2 IS
v_uniscid VARCHAR2(100);
v_length NUMBER;
v_regstr VARCHAR2(2000);
v_sum NUMBER := 0;
v_jy VARCHAR2(1);
v_ci CHAR(35) := '0123456789ABCDEFGHJKLMNPQRTUWXY';
TYPE v_number IS TABLE OF NUMBER;
v_wi v_number := v_number(1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28);
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
v_uniscid := UPPER(RTRIM(LTRIM(REPLACE(in_uniscid, '-', ''))));
IF (v_uniscid IS NULL) THEN
BEGIN
RETURN '统一社会信用代码为空!';
END;
END IF;
v_length := LENGTHB(v_uniscid);
IF v_length <> 18 THEN
RETURN '统一社会信用代码长度错误!';
END IF;
IF INSTRB(v_areacode, SUBSTR(v_uniscid, 3, 2) || ',') = 0 THEN
RETURN '统一社会信用代码省份代码错误!';
END IF;
v_regstr := '^[159Y][1239][1-9][0-9]{5}[0-9A-Z]{10}$';
IF NOT REGEXP_LIKE(v_uniscid, v_regstr) THEN
RETURN '统一社会信用代码格式错误!';
END IF;
FOR i IN 1 .. (v_length - 1) LOOP
v_sum := v_sum +
(INSTR(v_ci, SUBSTR(v_uniscid, I, 1), 1, 1) - 1) * v_wi(i);
END LOOP;
v_jy := 31 - MOD(v_sum, 31);
IF (v_jy = 31) THEN
v_jy := 0;
END IF;
IF (SUBSTR(v_ci, v_jy + 1, 1) <> SUBSTR(v_uniscid, -1)) THEN
RETURN '统一社会信用代码校验位错误';
ELSE
RETURN '校验通过!';
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN '校验程序异常!';
END FN_UNISCID_CHECK;
|