Em Oracle por função e seção:
DECLARE
V_Registros Int := 0;
DATAINI DATE;
DATAFIM DATE;
ANO VARCHAR(4) := '2011';
TYPE TVETOR IS VARRAY(12) OF VARCHAR2(2); --DEFINE O TIPO DE VETOR
VMES TVETOR; --DECLARA O VETOR;
MES VARCHAR(2);
PROX INTEGER :=0;
--INICIA O VETOR
BEGIN
--LIMPA A TABELA
Select
COUNT(*) INTO V_Registros
from
user_tables
where
table_name like '%T_QUADROPESSOAL%';
/* Condição Para exclusão da Tabela */
IF
V_Registros > 0
THEN
EXECUTE IMMEDIATE 'DELETE FROM T_QUADROPESSOAL';
END IF;
VMES:=TVETOR('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'); -- VETOR RECEBE O VALOR
--INICIA LEITURA
FOR PROX IN 1 .. 12 LOOP
MES:=VMES(PROX);
DATAINI := ANO||'-'||MES||'-01';
DECLARE CURSOR CQUADRO IS SELECT
S.CODFILIAL,
G.NOMEFANTASIA FILIAL,
S.CODIGO CODSECAO,
S.DESCRICAO SECAO,
C.CODIGO CODFUNCAO,
MES,
ANO,
C.NOME FUNCAO,
COUNT(F.CHAPA) TOTAL
FROM
PSECAO S
INNER JOIN
GFILIAL G
ON
S.CODCOLIGADA=G.CODCOLIGADA AND S.CODFILIAL=G.CODFILIAL
INNER JOIN
(SELECT
HS.CODCOLIGADA,
HS.CHAPA,
HS.CODSECAO,
HS.DTMUDANCA INICIO,
((SELECT MIN(X.DTMUDANCA) FROM PFHSTSEC X WHERE X.CODCOLIGADA=HS.CODCOLIGADA AND X.CHAPA=HS.CHAPA AND X.DTMUDANCA>HS.DTMUDANCA) - 1) FIM
FROM
PFHSTSEC HS) HS
ON
S.CODCOLIGADA=HS.CODCOLIGADA AND S.CODIGO=HS.CODSECAO
INNER JOIN
PFUNCAO C
ON
S.CODCOLIGADA=C.CODCOLIGADA
INNER JOIN
(SELECT
HC.CODCOLIGADA,
HC.CHAPA,
HC.CODFUNCAO,
HC.DTMUDANCA INICIO,
((SELECT MIN(X.DTMUDANCA) FROM PFHSTFCO X WHERE X.CODCOLIGADA=HC.CODCOLIGADA AND X.CHAPA=HC.CHAPA AND X.DTMUDANCA>HC.DTMUDANCA) - 1) FIM
FROM
PFHSTFCO HC) HC
ON
S.CODCOLIGADA=HC.CODCOLIGADA AND C.CODIGO=HC.CODFUNCAO
INNER JOIN
PFUNC F
ON
HS.CODCOLIGADA=F.CODCOLIGADA AND HS.CHAPA=F.CHAPA AND HC.CHAPA=F.CHAPA
WHERE
F.DATAADMISSAO<Last_Day(DATAINI) AND (F.CODSITUACAO<>'D' OR F.DATADEMISSAO>DATAINI)
AND HS.INICIO<=DATAINI AND ( HS.FIM>=DATAINI OR HS.FIM IS NULL)
AND HC.INICIO<=DATAINI AND ( HC.FIM>=DATAINI OR HC.FIM IS NULL)
GROUP BY
S.CODFILIAL,
S.CODIGO,
G.NOMEFANTASIA,
S.DESCRICAO,
C.CODIGO,
C.NOME;
TABQUADRO CQUADRO%ROWTYPE;
BEGIN
OPEN CQUADRO;
LOOP
FETCH CQUADRO INTO TABQUADRO;
exit WHEN CQUADRO%NOTFOUND;
INSERT INTO T_QUADROPESSOAL(CODFILIAL, FILIAL, CODSECAO, SECAO, CODFUNCAO, ANO, MES, FUNCAO, TOTAL) VALUES
(TABQUADRO.CODFILIAL, TABQUADRO.FILIAL, TABQUADRO.CODSECAO, TABQUADRO.SECAO, TABQUADRO.CODFUNCAO, TABQUADRO.ANO, TABQUADRO.MES, TABQUADRO.FUNCAO, TABQUADRO.TOTAL);
END LOOP;
CLOSE CQUADRO;
END LOOP;
END LOOP;
END;