Hola SONOFGOD:
No sé si ya resolviste tu problema, pero al leer que estás tratando de tomar excepciones y cuestiones por el estilo creo que te estás complicando la vida. Si aun no das con la función para agregar el mes prueba con esta, creo que funciona, recibe como parámetro una fecha y regresa la fecha con el mes agregado, con los casos especiales que mencionas.
Código:
CREATE OR REPLACE
FUNCTION F_AGREGA_MES (FECHA DATE)
RETURN DATE AS
BEGIN
IF (EXTRACT(MONTH FROM FECHA) = 2) THEN
--Para validar el mes de febrero
IF (EXTRACT(DAY FROM FECHA) < 28) THEN
RETURN ADD_MONTHS(FECHA, 1);
ELSE
IF (EXTRACT(DAY FROM FECHA) = 28) THEN
IF (EXTRACT(DAY FROM LAST_DAY(FECHA)) = 28) THEN
RETURN FECHA + 28;
ELSE
RETURN FECHA + 29;
END IF;
ELSE
RETURN FECHA + 29;
END IF;
END IF;
ELSE
IF (EXTRACT(MONTH FROM FECHA) IN (4, 6, 9, 11)) THEN
--para validar los días que tienen 30 dias
IF (EXTRACT(DAY FROM FECHA) = 30) THEN
RETURN FECHA + 30;
ELSE
RETURN ADD_MONTHS(FECHA, 1);
END IF;
ELSE
--Se agrega un mes sin problemas
RETURN ADD_MONTHS(FECHA, 1);
END IF;
END IF;
RETURN NULL;
END F_AGREGA_MES;
Si tú tienes otra solución a tu problema sería bueno que compartieras con el foro qué fue lo que hiciste, por si le puede servir a alguien más.
Saludos
Leo.