CREATE OR REPLACE FUNCTION FUN_GET_18CODE(p_15code IN VARCHAR2)
RETURN VARCHAR2 IS
p_18code VARCHAR2(20);
p_15temp VARCHAR2(20);
p_18temp VARCHAR2(20);
BEGIN
p_18code := p_15code;
IF lengthb(p_15code) = 15 THEN
SELECT substr(p_15code, 1, 6) || '19' || substr(p_15code, 7, 9) ||
decode(MOD(substr(p_15code, 1, 1) * 7 +
substr(p_15code, 2, 1) * 9 +
substr(p_15code, 3, 1) * 10 +
substr(p_15code, 4, 1) * 5 +
substr(p_15code, 5, 1) * 8 +
substr(p_15code, 6, 1) * 4 + 1 * 2 + 9 * 1 +
substr(p_15code, 7, 1) * 6 +
substr(p_15code, 8, 1) * 3 +
substr(p_15code, 9, 1) * 7 +
substr(p_15code, 10, 1) * 9 +
substr(p_15code, 11, 1) * 10 +
substr(p_15code, 12, 1) * 5 +
substr(p_15code, 13, 1) * 8 +
substr(p_15code, 14, 1) * 4 +
substr(p_15code, 15, 1) * 2,
11),
0,
'1',
1,
'0',
2,
'X',
3,
'9',
4,
'8',
5,
'7',
6,
'6',
7,
'5',
8,
'4',
9,
'3',
10,
'2')
INTO p_18code
FROM dual;
ELSE
p_18code := p_15code;
END IF;
RETURN p_18code;
EXCEPTION
WHEN OTHERS THEN
p_18code := p_15code;
RETURN p_18code;
END fun_get_18code;