Oracle 组织机构代码校验函数

Oracle 组织机构代码校验函数

CREATE OR REPLACE FUNCTION CHECKORGCODE(organizationCode VARCHAR2)
/*
    功能:验证组织机构代码,成功返回1,失败返回0
    organizationCode:要验证的组织机构代码
  */
 RETURN NUMBER AS
  codeSum NUMBER(10) := 0;
  code    VARCHAR(100);
  code_9  varchar(1);
  C9      NUMBER(2);
  /*字符与字符的值,每个字符后两位为该字符的字符数值*/
  Ci CHAR(250) := '000101202303404505606707808909A10B11C12D13E14F15G16H17I18J19K20L21M22N23O24P25Q26R27S28T29U30V31W32X33Y34Z35';
  /*前8位字符的加权因子*/
  type v_ar is varray(10) of number;
  Wi v_ar := v_ar(3, 7, 9, 10, 5, 8, 4, 2);
BEGIN
  /*判断是否为null*/
  IF (organizationCode is NULL) THEN
    BEGIN
      RETURN 0;
    END;
  END IF;

  code := RTRIM(LTRIM(REPLACE(organizationCode, '-', ''))); /*把-,前后空格去掉*/

  /*验证长度是否正确*/
  /*验证机构代码是由数字和大写字母组成*/
  IF (LENGTH(code) != 9 or NOT REGEXP_LIKE(code, '^[A-Z0-9]+$')) THEN
    BEGIN
      RETURN 0;
    END;
  END IF;

  /*前8位字符的字符数值分别乘于该位的加权因子,然后求和*/
  for i in 1 .. Wi.count loop
    codeSum := codeSum +
               to_Number(substr(Ci, INSTR(Ci, substr(code, i, 1)) + 1, 2)) *
               Wi(i);
  end loop;

  /* 计算校验码C9*/
  C9     := 11 - (codeSum MOD 11);
  code_9 := substr(code, 9, 1);

  /*验证校验码C9*/
  /*当C9的值为10时,校验码应是拉丁字母X */
  /*当C9的值为11时校验码应是0*/
  /*验证第9位是否等于计算出的校验结果*/
  IF ((C9 = 10 and code_9 = 'X') or (C9 = 11 and code_9 = '0') or
     (code_9 = to_char(C9))) THEN
    BEGIN
      return 1;
    END;
  END IF;

  RETURN 0;
EXCEPTION
  WHEN OTHERS THEN
    raise;
END;

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个 Oracle 营业执照代码校验函数的示例: ```sql CREATE OR REPLACE FUNCTION check_license_code(p_license_code IN VARCHAR2) RETURN VARCHAR2 IS v_license_code VARCHAR2(15) := UPPER(p_license_code); v_check_code CHAR(1); v_weight_array CONSTANT VARCHAR2(10) := '123456789ABCDEFGHJKLMNPQRTUWXY'; v_weight_num_array CONSTANT VARCHAR2(10) := '31791065432'; BEGIN -- 校验长度和字符合法性 IF LENGTH(v_license_code) <> 15 OR REGEXP_LIKE(v_license_code, '[^0-9A-Z]') THEN RETURN 'INVALID_LICENSE_CODE'; END IF; -- 计算校验码 v_check_code := v_weight_array(MOD(SUM(DECODE(SUBSTR(v_license_code, LEVEL, 1), v_weight_array, INSTR(v_weight_array, SUBSTR(v_license_code, LEVEL, 1)), NULL) * TO_NUMBER(SUBSTR(v_weight_num_array, LEVEL, 1))), 31) + 1); -- 检查校验码 IF SUBSTR(v_license_code, 15, 1) <> v_check_code THEN RETURN 'INVALID_CHECK_CODE'; ELSE RETURN 'VALID_LICENSE_CODE'; END IF; END; / ``` 该函数接收一个营业执照代码作为参数,返回一个字符串,表示校验结果。如果营业执照代码不符合规则,则返回 "INVALID_LICENSE_CODE",如果校验码不正确,则返回 "INVALID_CHECK_CODE",否则返回 "VALID_LICENSE_CODE"。使用该函数时,只需要传入营业执照代码即可。例如: ```sql SELECT check_license_code('123456789012345') FROM DUAL; -- 返回 'INVALID_LICENSE_CODE' SELECT check_license_code('1234567890123456') FROM DUAL; -- 返回 'INVALID_LICENSE_CODE' SELECT check_license_code('1234567890123456A') FROM DUAL; -- 返回 'VALID_LICENSE_CODE' SELECT check_license_code('1234567890123456B') FROM DUAL; -- 返回 'INVALID_CHECK_CODE' ``` 注意,在实际应用中,可能需要根据具体要求对该函数进行调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值