create or replace function my_add_months(p_date_string varchar2,
p_months number)
return varchar2
AS
C INT := p_date_string;
H INT := 100;
Y INT := C/H/H;
M INT := C/H - Y * H;
D INT := C MOD H;
Z INT := Y * 12 + M + p_months;
BEGIN
LOOP
C := 28 + BITAND((62648012+0 ** (Y MOD (4 + 12 * 0 ** (Y MOD H))) * 16) / 4 ** M - .5, 3);
EXIT WHEN Z < 2;
Y := (Z - 7) / 12;
M := Z - Y * 12;
Z := D/C/2;
END LOOP;
RETURN Y * H * H + M * H + LEAST(C, Z || D);
END;
/