• oracle组织机构代码验证函数


    组织机构代码:

    长度与号码组成规则

     组织机构代码应有9位, 其中8位为本体代码,1位为校验代码。9位代码由数字(0-9)或拉丁字母组成。即需要验证:组织机构代码的位数长度,和每一位是否由(0-9)数字或者拉丁字母组成。

    最后一位校验码

    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   

    当C9的值为10时,校验码应用大写的拉丁字母X表示;当C9的值为11时校验码用0表示。

    详细介绍

    代码如下

    CREATE OR REPLACE FUNCTION CHECKORGCODE(organizationCode VARCHAR2)
    /*
        功能:验证组织机构代码,成功返回1,失败返回0
        organizationCode:要验证的组织机构代码
        相关资料:
        http://baike.baidu.com/view/238601.htm
      */
     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;

     调用方式:

    select checkorgcode('xxxxxxxx-y') from dual;
    
    select 'ok' from dual where checkorgcode('xxxxxxxx-y')=1

    下载

  • 相关阅读:
    BZOJ 1070 修车
    BZOJ 1927 SDOI2010 星际竞速 最小费用最大流
    LOJ 2321 清华集训2017 无限之环 拆点+最小费用最大流
    EZOJ 宝石迷阵 建图+网络流匹配
    BZOJ 1711 吃饭dining/Luogu P1402 酒店之王 拆点+最大流流匹配
    POJ 1637 Sightseeing tour 建图+网络流
    POJ 1149 PIGS 建图,最大流
    【2018 1月集训 Day1】二分的代价
    【2019 1月集训 Day1】回文的后缀
    20181228 模拟赛 T3 字符串游戏 strGame 博弈论 字符串
  • 原文地址:https://www.cnblogs.com/junjieok/p/3126556.html
Copyright © 2020-2023  润新知