Leonildo, boa noite.
Seguem duas formas de solucionar esse problema no ORACLE, com PROCEDURE ou FUNCTION.
CREATE OR REPLACE PROCEDURE SP_ANIVERSARIO
(p_CPF IN OUT VARCHAR2)
IS
v_NOME TB_CLIENTES.NOME%type;
BEGIN
SELECT NOME INTO v_NOME FROM TB_CLIENTES WHERE TO_CHAR(DATA_ANIVERSARIO, 'DD-MM') = TO_CHAR(SYSDATE, 'DD-MM') AND CPF = p_CPF;
p_CPF := 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_CPF := 0;
END;
CREATE OR REPLACE FUNCTION FU_ANIVERSARIO
(p_CPF IN VARCHAR2)
RETURN NUMBER
IS
v_NOME TB_CLIENTES.NOME%type;
BEGIN
SELECT NOME INTO v_NOME FROM TB_CLIENTES WHERE TO_CHAR(DATA_ANIVERSARIO, 'DD-MM') = TO_CHAR(SYSDATE, 'DD-MM') AND CPF = p_CPF;
RETURN 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 0;
END;
Para testar:
SELECT * FROM TB_CLIENTES;
INSERT INTO TB_CLIENTES (ID_CLIENTE, CPF, NOME, DATA_ANIVERSARIO) VALUES (1, '123456789', 'LEONILDO', SYSDATE);
UPDATE TB_CLIENTES SET DATA_ANIVERSARIO = SYSDATE WHERE ID_CLIENTE = 1;
UPDATE TB_CLIENTES SET DATA_ANIVERSARIO = SYSDATE - 1 WHERE ID_CLIENTE = 1;
DELETE FROM TB_CLIENTES;
--PROCEDURE
VARIABLE v_CPF VARCHAR2(20);
EXECUTE :v_CPF := '123456789';
PRINT v_CPF;
EXECUTE SP_ANIVERSARIO(:v_CPF);
PRINT v_CPF;
--FUNCTION
VARIABLE v_RESULTADO NUMBER;
EXECUTE :v_RESULTADO := FU_ANIVERSARIO('123456789');
PRINT v_RESULTADO;
Para facilitar o aprendizado da sintaxe é importante tomar cuidado com a indentação do código. Tenta rodar os comandos aí.
Recomendo fazer o curso abaixo depois, faz parte da mesma formação deste.
Curso Oracle PL/SQL: Procedures, funções e exceções
Formação SQL com Oracle Database
Bons estudos!