Mira este ejemplo en bloque anonimo.
Lo puedes llevar a una función y traer los datos que requieres.
Código SQL:
Ver originalSQL> DECLARE
contador_sabados NUMBER := 0;
contador_domingos NUMBER :=0;
ano VARCHAR2(4) := '&valorano';
mes VARCHAR2(2) := '&valormes';
fecha_inicio DATE;
fecha_fin DATE;
BEGIN
fecha_inicio := to_date(ano||mes||'01','YYYYMMDD');
fecha_fin := last_day(to_date(ano||mes||'01','YYYYMMDD'));
WHILE fecha_inicio <= fecha_fin LOOP
IF TRIM(to_char(fecha_inicio,'DAY', 'NLS_DATE_LANGUAGE=SPANISH')) = 'SÁBADO' THEN
contador_sabados := contador_sabados + 1;
END IF;
IF TRIM(to_char(fecha_inicio,'DAY', 'NLS_DATE_LANGUAGE=SPANISH')) = 'DOMINGO' THEN
contador_domingos := contador_domingos + 1;
END IF;
fecha_inicio := fecha_inicio + 1;
END LOOP;
dbms_output.put_line('hay '||contador_sabados||' sabados y '||contador_domingos||' domingos. Para un total de: '||(contador_sabados+contador_domingos));
END;
/
hay 4 sabados y 5 domingos. Para un total de: 9
PL/SQL PROCEDURE successfully completed