oracle校验统一社会信用代码函数

  • Post author:
  • Post category:其他


create or replace  FUNCTION CREDIT_CODES_CHECK(organizationCode VARCHAR2) 
     /*
    organizationCode:要验证的统一社会信用代码
  */
 RETURN VARCHAR2 IS
  codeSum NUMBER(10) := 0;
  code    VARCHAR(100);
  n_Length NUMBER(2);
  code_jy  varchar(1);
  code_end  varchar(1);
  jycode      NUMBER(2);
  /*字符与字符的值,每个字符后两位为该字符的字符数值*/
  Ci CHAR(35) := '0123456789ABCDEFGHJKLMNPQRTUWXY';
  /*字符的加权因子*/
  --后面没用,加权因子通过算式算出来了
  type v_ar is varray(18) of number;
  Wi v_ar := v_ar(1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28);
BEGIN
  /*判断是否为null*/
  IF (organizationCode is NULL) THEN
    BEGIN
      RETURN '为空!';
    END;
  END IF;
  code := RTRIM(LTRIM(REPLACE(organizationCode, '-', ''))); /*把-,前后空格去掉*/
  n_Length := Lengthb(code);
  /*验证长度是否正确*/
  /*验证机构代码是由数字和大写字母组成*/
  IF NOT Regexp_Like(code,  '^[1-9A-GY]{1}[1239]{1}[1-5]{1}[0-9]{5}[0-9A-Z]{10}$') THEN
         RETURN '长度不正确或格式不对';
      END IF;
  /*字符的字符数值分别乘于该位的加权因子,然后求和*/
  for i in 1 .. (n_Length-1) loop
    codeSum := codeSum + MOD(Power(3, (i - 1)), 31) * (to_Number(INSTR(Ci, Substr(code, i, 1)))-1);
  end loop;
  /* 计算校验码jycode*/
  jycode := 31 - MOD(codeSum, 31);
  if (jycode=31) then 
    jycode := 0;
  end if;
  code_jy := Substr(Ci,To_Number(jycode+1), 1);
  --获取最后一位校验码
  code_end := substr(code,-1);
  /*验证校验码code_end*/
  /*验证计算出的校验结果*/
  if (code_jy <> to_char(code_end)) then 
        return '校验合法性失败';
  end if;
  RETURN 'true';
EXCEPTION
  WHEN OTHERS THEN
    raise;
END CREDIT_CODES_CHECK;



版权声明:本文为qq_23146763原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。