GB 11714-1997 全國組織機構程式碼編制規則 DB2函式

wangkxxe發表於2009-06-17

具體規範詳見GB 11714-1997 全國組織機構程式碼編制規則.pdf

驗證ORGCODE是否合法,合法返回1,不合法返回0

形如'66195133X' 或是 '66195133-X'

組織機構程式碼是每一個機關、社會團體、企事業單位在全國範圍內唯一的、始終不變的法定程式碼標識。
最新使用的組織機構程式碼在1997年頒佈實施,由8位數字(或大寫拉丁字母)本體程式碼和1位數字(或大寫拉丁字母)校驗碼組成。本體程式碼採用系列(即分割槽段)順序編碼方法。校驗碼按下列公式計算:
8
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
當MOD函式值為1(即 C9 = 10)時,校驗碼用字母X表示。

DROP FUNCTION DWPROC.FUN_ORGCODE_CHK;
CREATE FUNCTION DWPROC.FUN_ORGCODE_CHK
 (I_ORGCODE VARCHAR(32)
 )
  RETURNS INTEGER
  LANGUAGE SQL
  NOT DETERMINISTIC
  READS SQL DATA
  STATIC DISPATCH
  CALLED ON NULL INPUT
  EXTERNAL ACTION
  INHERIT SPECIAL REGISTERS
  BEGIN ATOMIC
    DECLARE v_orgcode VARCHAR(32);
    DECLARE v_i INTEGER DEFAULT 1;
    DECLARE v_total_01 INTEGER DEFAULT 0;
    DECLARE v_total_02 INTEGER DEFAULT 0;
    DECLARE v_total_03 INTEGER DEFAULT 0;
    DECLARE v_total_04 INTEGER DEFAULT 0;
   
    SET v_orgcode = LTRIM(RTRIM(I_ORGCODE));
   
    IF LENGTH(v_orgcode) = 9 THEN
      WHILE v_i <= 8 DO
        SET v_total_01 = MOD(Power(2, ((10 - v_i) - 1)), 11);
        IF ASCII(SUBSTR(v_orgcode,v_i,1)) BETWEEN 48 AND 57 THEN
          SET v_total_02 = ASCII(SUBSTR(v_orgcode,v_i,1)) - 48;
        ELSEIF ASCII(SUBSTR(v_orgcode,v_i,1)) BETWEEN 65 AND 90 THEN
          SET v_total_02 = ASCII(SUBSTR(v_orgcode,v_i,1)) - 55;
        ELSE RETURN 0;
        END IF;
        SET v_total_03 = v_total_03 + v_total_01 * v_total_02;
        SET v_i = v_i + 1 ;
      END WHILE;
      SET v_total_04 = 11 - MOD(v_total_03,11);
      IF v_total_04 = 10 THEN
        IF SUBSTR(v_orgcode,9,1) = 'X' THEN
          RETURN 1;
        ELSE RETURN 0;
        END IF;
      ELSEIF v_total_04 BETWEEN 0 AND 9 THEN
        IF ASCII(SUBSTR(v_orgcode,9,1)) BETWEEN 48 AND 57 THEN
          IF v_total_04 = ASCII(SUBSTR(v_orgcode,9,1)) - 48 THEN
            RETURN 1;
          ELSE RETURN 0;
          END IF;
        ELSE RETURN 0;
        END IF;
      ELSE RETURN 0;
      END IF;

   
    ELSEIF LENGTH(v_orgcode) = 10 AND SUBSTR(v_orgcode,9,1) = '-' THEN
      WHILE v_i <= 8 DO
        SET v_total_01 = MOD(Power(2, ((10 - v_i) - 1)), 11);
        IF ASCII(SUBSTR(v_orgcode,v_i,1)) BETWEEN 48 AND 57 THEN
          --CONCAT
          SET v_total_02 = ASCII(SUBSTR(v_orgcode,v_i,1)) - 48;
        ELSEIF ASCII(SUBSTR(v_orgcode,v_i,1)) BETWEEN 65 AND 90 THEN
          SET v_total_02 = ASCII(SUBSTR(v_orgcode,v_i,1)) - 55;
        ELSE RETURN 0;
        END IF;
        SET v_total_03 = v_total_03 + v_total_01 * v_total_02;
        SET v_i = v_i + 1 ;
      END WHILE;
      SET v_total_04 = 11 - MOD(v_total_03,11);
      IF v_total_04 = 10 THEN
        IF SUBSTR(v_orgcode,10,1) = 'X' THEN
          RETURN 1;
        ELSE RETURN 0;
        END IF;
      ELSEIF v_total_04 BETWEEN 0 AND 9 THEN
        IF ASCII(SUBSTR(v_orgcode,10,1)) BETWEEN 48 AND 57 THEN
          IF v_total_04 = ASCII(SUBSTR(v_orgcode,10,1)) - 48 THEN
            RETURN 1;
          ELSE RETURN 0;
          END IF;
        ELSE RETURN 0;
        END IF;
      ELSE RETURN 0;
      END IF;
    ELSE RETURN 0;
    END IF;
  END;

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12801008/viewspace-606596/,如需轉載,請註明出處,否則將追究法律責任。

相關文章