4
respostas

Criar procedure PLSQL

A Procedure recebe o CPF como parâmetro, realiza a consulta do CPF na tabela TB_Clientes, se o CPF existe, então realizar uma nova consulta que verifica hoje é data de aniversario do CPF informado, se verdadeiro retorna 1 se não retorna 0.

CREATE OR REPLACE PROCEDURE SP_DataAniversario

     (p_CPF VARCHAR, SP OUT SYS_REFCURSOR)
IS
  BEGIN
     OPEN SP FOR SELECT * FROM TB_Clientes 
             where CPF = p_CPF

  IF (p_CPF= '1') THEN

    BEGIN

    SELECT * from TB_Clientes where (TO_CHAR(Data_Aniversario, 'DD-MM')) = (TO_CHAR(SYSDATE, 'DD-MM'))
    and CPF = '78301914092' p_CPF

        RETURN (Nome)
    END IF
ELSE
    BEGIN
        RETURN (0)
    END
4 respostas

Olá Leonildo, tudo bem?

Poderia disponibilizar mais detalhes do seu ambiente? Assim poderei ti auxiliar melhor no que deseja. Qual o banco de dados você está utilizando? Você está com alguma dúvida em relação a criação da procedure? Achei bem legal a sua ideia, então poderia explicar como está a lógica do seu código atual?

Aguardo o seu retorno Leonildo:)!

Danielle,

Estou usando PLSQL Banco de dados Oracle, no ambiente SQL Developer.

Estou tentando criar uma Procedure em PLSQL, onde é passado o CPF com parâmetro e a procedure deve retorna true se é aniversário do CPF informado ou false se não for aniversario do CPF informado.

Tenho uma tabela Clientes, que possui os campos ID_Cliente, CPF, Nome e Data Aniversario.

Eu consegui criar a Procedure em MS SQL, mas como sou novo com a sintaxe do PLSQL, estou tendo dificuldade em montar a estrutura necessária e compilar sem apresentar erros.

CREATE OR REPLACE PROCEDURE SP_DataAniversario

     (p_CPF VARCHAR, SP OUT SYS_REFCURSOR)
IS
  BEGIN
     OPEN SP FOR SELECT * FROM TB_Clientes 
             where CPF = p_CPF

  IF (p_CPF= '1') THEN

    BEGIN

    SELECT * from TB_Clientes where (TO_CHAR(Data_Aniversario, 'DD-MM')) = (TO_CHAR(SYSDATE, 'DD-MM'))
    and CPF =  p_CPF

        RETURN (Nome)
    END IF
ELSE
    BEGIN
        RETURN (0)
    END

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!

Olá Diego, muito obrigado, ambos funcionaram.

Já iniciei o curso Formação SQL com Oracle Database, obrigado pela recomendação.

Se não for pedir muito até para eu entender os comandos, você poderia explica- los ditaticamente, caso não querira escrever e se preferiri enviar um áudioi sem problema. 11 94969 0002.

Desde muito obrigado.