terça-feira, 28 de junho de 2011

Stored Procedure para saber os aniversariantes por dia/mês


Administrador Essa procedure lhe retorna todos os aniversariantes de um determinado período de dia e mês. Foi feita originalmente para Firebird, mas pode ser facilmente adaptada para qualquer outro banco que suporte Stored Procedures

Observação: este artigo é uma alternativa ao material enviado pelo amigo cruzeirense, pois em sua dica, exige-se que o ano de nascimento também seja informado como parâmetro da procedure. Seu material pode ser visto neste link:

No exemplo, utilizarei uma tabela chamada FUNCIONARIO, conforme pode ser visto abaixo:

/* Estrutura da tabela FUNCIONARIO
CREATE TABLE FUNCIONARIO (
    ID               INTEGER,
    NOME             VARCHAR(50),
    SALARIO          NUMERIC(15,2),
    DATA_NASCIMENTO  TIMESTAMP
);
*/

SET TERM ^ ;

CREATE PROCEDURE ANIVERSARIANTES (
    strdta_ini varchar(5),
    strdta_fim varchar(5))
returns (
    nome varchar(50),
    salario numeric(15,2),
    dta_nasc timestamp)
as
declare variable dta_ini timestamp;
declare variable dta_fim timestamp;
BEGIN
    SELECT CAST(:STRDTA_INI||'.'||CAST(EXTRACT(YEAR FROM
        MAX(DATA_NASCIMENTO)) AS VARCHAR(10)) AS TIMESTAMP) AS B
        FROM FUNCIONARIO INTO DTA_INI;
    SELECT CAST(:STRDTA_FIM||'.'||CAST(EXTRACT(YEAR FROM
        MAX(DATA_NASCIMENTO)) AS VARCHAR(10)) AS TIMESTAMP) AS B
        FROM FUNCIONARIO INTO DTA_FIM;
    WHILE (DTA_INI <= DTA_FIM) DO
    BEGIN
        FOR SELECT NOME, SALARIO, DATA_NASCIMENTO FROM FUNCIONARIO WHERE
        EXTRACT(DAY FROM DATA_NASCIMENTO) = EXTRACT(DAY FROM :DTA_INI) AND
        EXTRACT(MONTH FROM DATA_NASCIMENTO) = EXTRACT(MONTH FROM :DTA_INI)
        ORDER BY NOME, DATA_NASCIMENTO INTO :NOME, :SALARIO, :DTA_NASC DO
            SUSPEND;
        DTA_INI = DTA_INI + 1;
    END
END^

SET TERM ; ^

Agora é só fazer um select como o abaixo e pronto! ;-)

SELECT * FROM ANIVERSARIANTES('01/01', '31/01');

Nenhum comentário:

Postar um comentário