oracle驗證組織機構代碼有效性

     CREATE OR REPLACE FUNCTION CHECK_ORGCODE(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;
-------------------------------------------------------------------------------------------------------------------------------------------
由9位數字或字母組成,第9位是校驗碼,其計算規則如下:
C[9] = 11 – ( ∑( C[i] * W[i] ) mod 11 )。
其中,C[i]表示從左至右第i個位置上的數字或字母的ASC碼;
W[i]表示第i個位置上的加權因子,其值如下:
i 1 2 3 4 5 6 7 8
W[i] 3 7 9 10 5 8 4 2
 當C[9]=10時,校驗碼用X表示;
當C[9]=11時,校驗碼用0表示;
當C[9]介於0至9之間時,校驗碼即用C[9]表示。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章