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;