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