Oracle 组织机构代码校验函数实现
组织机构代码是中国大陆用于标识企业、机关、事业单位等组织的唯一标识码,由8位数字(或大写字母)和1位校验码组成。以下是Oracle数据库中实现组织机构代码校验的函数示例。
校验规则
组织机构代码的校验码计算规则如下:
- 前8位为本体代码,最后1位为校验码。
- 每位字符对应的权重因子为:3, 7, 9, 10, 5, 8, 4, 2。
- 计算加权和:S = Sum(Ci × Wi),其中Ci为字符对应数值,Wi为权重因子。
- 计算校验码:Mod = 11 - (S % 11),若Mod为10则校验码为X,若Mod为11则校验码为0,否则校验码为Mod。
Oracle函数实现
CREATE OR REPLACE FUNCTION VALIDATE_ORG_CODE(p_code IN VARCHAR2) RETURN VARCHAR2 IS
v_code VARCHAR2(9);
v_weights CONSTANT NUMBER_ARRAY := NUMBER_ARRAY(3, 7, 9, 10, 5, 8, 4, 2);
v_sum NUMBER := 0;
v_mod NUMBER;
v_check_code CHAR;
BEGIN
-- 检查输入长度是否为9
IF LENGTH(p_code) <> 9 THEN
RETURN 'N';
END IF;
-- 转换为大写并检查前8位是否为字母或数字
v_code := UPPER(p_code);
FOR i IN 1..8 LOOP
IF NOT REGEXP_LIKE(SUBSTR(v_code, i, 1), '^[A-Z0-9]$') THEN
RETURN 'N';
END IF;
END LOOP;
-- 计算加权和
FOR i IN 1..8 LOOP
DECLARE
v_char CHAR := SUBSTR(v_code, i, 1);
v_val NUMBER;
BEGIN
IF v_char BETWEEN '0' AND '9' THEN
v_val := TO_NUMBER(v_char);
ELSE -- A-Z转换为10-35
v_val := ASCII(v_char) - ASCII('A') + 10;
END IF;
v_sum := v_sum + v_val * v_weights(i);
END;
END LOOP;
-- 计算校验码
v_mod := 11 - MOD(v_sum, 11);
IF v_mod = 10 THEN
v_check_code := 'X';
ELSIF v_mod = 11 THEN
v_check_code := '0';
ELSE
v_check_code := TO_CHAR(v_mod);
END IF;
-- 验证校验码
IF SUBSTR(v_code, 9, 1) = v_check_code THEN
RETURN 'Y';
ELSE
RETURN 'N';
END IF;
END VALIDATE_ORG_CODE;
/
使用示例
-- 验证有效的组织机构代码
SELECT VALIDATE_ORG_CODE('12345678X') FROM dual; -- 返回 'Y'
-- 验证无效的组织机构代码
SELECT VALIDATE_ORG_CODE('123456789') FROM dual; -- 返回 'N'
注意事项
- 该函数返回’Y’表示校验通过,'N’表示校验失败。
- 函数对输入代码进行自动大写转换,确保字母校验正确。
- 函数检查输入长度是否为9位,并验证前8位是否为合法字符(数字或大写字母)。
- 实际应用中可能还需要检查组织机构代码是否符合其他业务规则。Oracle 组织机构代码校验函数