Precisei montar uma função para saber se determinado dia é feriado, sempre se tem o problema das festas móveis, achei uma função em outra linguagem que adaptei para PLSQL.   declare a number; b number; c number; d number; e number; f number; g number; h number; i number; k number; l number; m number; p number; q number; ano number := 2002; dt_pascoa date; dt_carnaval_segunda date; dt_carnaval_terca date; dt_carnaval_quarta date; dt_sextasanta date; dt_corpusc date; begin while ano <= 2015 loop a := mod(ano , 19); b := trunc(ano / 100); c := mod(ano, 100); d := trunc(b / 4); e := (b mod 4); f := trunc((b + 8) / 25); g := trunc((b - f + 1) / 3) ; h := mod((19 * a + b - d - g + 15) , 30); i := trunc(c / 4); k := mod(c , 4); l := mod((32 + 2 * e + 2 * i - h - k), 7); m := trunc((a + 11 * h + 22 * l) / 451); p := trunc((h + l - 7 * m + 114) / 31); q := mod((h + l - 7 * m + 114) , 31); dt_pascoa := to_date (((q + 1) || '/' || p || '/' || ano),'dd/mm/yyyy'); dt_carnaval_segunda := (dt_pascoa-48); dt_carnaval_terca := (dt_pascoa-47); dt_carnaval_quarta := (dt_pascoa-46); dt_sextasanta := (dt_pascoa-2); dt_corpusc := (dt_pascoa+60); dbms_output.put_line(quotedstr(to_char(dt_carnaval_segunda,'dd/mm/yyyy'))||' /*carnaval_segunda*/,'|| quotedstr(to_char(dt_carnaval_terca,'dd/mm/yyyy'))||' /*carnaval_terca*/,'|| quotedstr(to_char(dt_carnaval_quarta,'dd/mm/yyyy'))||' /*carnaval_quarta*/,'|| quotedstr(to_char(dt_sextasanta,'dd/mm/yyyy'))||' /*sextasanta*/,'|| quotedstr(to_char(dt_corpusc,'dd/mm/yyyy'))||' /*corpuschristie*/,'); ano := ano + 1; end loop; /* baseado em http://www.vbweb.com.br/dicas_visual.asp?codigo=2033 */ end;