Fonte: www.activedelphi.com.br
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');
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