package UDF_test;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class ID15to18 extends UDF {
	public Text evaluate(final Text str) {
		if(str.getLength()==15 && str.toString().matches("^[0-9]*$")) {
			// 转为String类型
			String id = str.toString();
			// 得到17位数字
			String newId = id.substring(0,6) + "19"+ id.substring(6,id.length());
			// 系数因子
			int[] factorArr = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
			// 校验最后一位
			String[] checkArr = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
			//计算最后一位
			int sum = 0;
			
			for (int i=0;i<17;i++) {
				sum += (newId.toCharArray()[i] - '0') * factorArr[i];
			}
			// 返回18位身份证号
			return new Text(newId + checkArr[sum % 11]);
		}else {
			return str;
		}
		
	}
}

FUNCTION ID_NO_15TO18(ID_NO VARCHAR2) RETURN VARCHAR2 IS
    TYPE TIARRAY IS TABLE OF INTEGER;
    TYPE TCARRAY IS TABLE OF CHAR(1);
    RESULTS VARCHAR2(18);
    W       TIARRAY; --数字数组
    A       TCARRAY; --字符数组
    S       INTEGER;
BEGIN
    IF ID_NO IS NULL THEN
        RETURN '';
    END IF;
    IF LENGTH(ID_NO) <> 15 THEN
        RETURN ID_NO;
    END IF;
    W       := TIARRAY(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
    A       := TCARRAY('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
    RESULTS := SUBSTR(ID_NO, 1, 6) || '19' || SUBSTR(ID_NO, 7, 9);
    S       := 0;
    BEGIN
        FOR I IN 1 .. 17 LOOP
            S := S + TO_NUMBER(SUBSTR(RESULTS, I, 1)) * W(I);
        END LOOP;
    EXCEPTION
        WHEN OTHERS THEN
            RETURN '';
    END;
    S       := S MOD 11;
    RESULTS := RESULTS || A(S + 1);
    RETURN(RESULTS);
END ID_NO_15TO18;