Pular para o conteúdo

Overload em PL/SQL: A utilização de sobrecarga em procedure e funções dentro de uma package

Overload em PL/SQL

Olá pessoal ! Aqui estou de volta com um novo assunto, Overload em PL/SQL. A idéia veio de uma discussão que tive uma vez com programadores sobre PL/SQL. Para minha surpresa, me deparei com uma afirmação na qual se questiona a existência de sobrecarga em PL/SQL. Uma pérola !

Então resolvi mostrar de uma maneira simples a utilização de sobrecarga em procedure e funções dentro de uma package. Para isso, vamos utilizar os scripts abaixo para criar a nossa package chamada TIPO. Ela terá a funcionalidade de identificar 3 tipos de variáveis: VARCHAR2, NUMBER e DATE.

CREATE OR REPLACE PACKAGE tipo AS
  PROCEDURE pergunta(p_texto IN VARCHAR2);

  PROCEDURE pergunta(p_texto IN NUMBER);

  PROCEDURE pergunta(p_texto IN DATE);

  FUNCTION  resposta(p_tipo IN VARCHAR2) RETURN VARCHAR2;

  FUNCTION  resposta(p_tipo IN NUMBER)   RETURN VARCHAR2;

  FUNCTION  resposta(p_tipo IN DATE)     RETURN VARCHAR2/

END tipo; 

CREATE OR REPLACE PACKAGE BODY tipo AS
  v_resposta VARCHAR2(100) := NULL;

  PROCEDURE pergunta(p_texto VARCHAR2) IS  
  BEGIN  
    DBMS_OUTPUT.PUT_LINE('VALOR ' || p_texto || ' é ' || Resposta(p_texto));

  END;    

  PROCEDURE pergunta(p_texto NUMBER) IS  
  BEGIN
     DBMS_OUTPUT.PUT_LINE('VALOR ' || p_texto || ' é ' || Resposta(p_texto));

  END;    

  PROCEDURE pergunta(p_texto DATE) IS  
  BEGIN
     DBMS_OUTPUT.PUT_LINE('VALOR ' || p_texto || ' é ' || Resposta(p_texto));

  END;    

  FUNCTION resposta(p_tipo VARCHAR2) 
  RETURN VARCHAR2 IS     
  BEGIN
     BEGIN
        v_resposta := 'DO TIPO VARCHAR';

     EXCEPTION
        WHEN OTHERS THEN
           v_resposta := 'ERRO';

     END;

     RETURN(v_resposta);     

  END resposta;

  FUNCTION resposta(p_tipo NUMBER) 
  RETURN VARCHAR2 IS
     v_resposta VARCHAR2(100);

  BEGIN
     BEGIN
        v_resposta := 'DO TIPO NUMÉRICO';

     EXCEPTION
        WHEN OTHERS THEN
           v_resposta := 'ERRO';

     END;

     RETURN(v_resposta);     

  END;

  FUNCTION resposta(p_tipo DATE) 
  RETURN VARCHAR2 IS
     v_resposta VARCHAR2(100);

  BEGIN
     BEGIN
        v_resposta := 'DO TIPO DATA';

     EXCEPTION
        WHEN OTHERS THEN
           v_resposta := 'ERRO';

     END;

     RETURN(v_resposta);     

  END;

END tipo;

Utilizaremos as procedures PERGUNTA que irão chamar as funções RESPOSTA para devolver o resultado. Abaixo  um pequeno bloco anônimo com uma variável caracter para teste.

BEGIN
   tipo.pergunta('TESTE');

END;

RESULTADO: VALOR TESTE é do TIPO VARCHAR

Ao executarmos com um valor do tipo CHAR, a engine do PL/SQL executou a procedure que atendia ao tipo de variável.

Vamos fazer mais um teste:

BEGIN
   tipo.pergunta(1);

END;

RESULTADO: VALOR 1 é do TIPO NUMBER

E agora um outro tipo:

BEGIN
   tipo.pergunta(TO_DATE('01/01/2014','DD/MM/YYYY'));

END;

RESULTADO: VALOR 01/01/2014 é do TIPO DATA

Este foi um teste simples, pois não vou mais me alongar na explicação. Espero que o conceito e implementação d Overload em PL/SQL tenha ficado claro e que seja de alguma valia para alguém ! 🙂

Quaisquer dúvidas, basta entrar em contato e enviar sua pergunta.

Um grande abraço

 

Sergio Willians

Sergio Willians

Sergio Willians é o fundador do GPO (Grupo de Profissionais Oracle) e possui quase 30 anos de experiência em tecnologias Oracle, sendo especialista em desenvolvimento Forms/Reports, PL/SQL e EBS (E-Business Suite) nos módulos Receivables, Payables e General Ledger. Atualmente trabalha na Scania Latin America, onde se dedica à área de integração de dados com Confluent Kafka. Sua paixão é compartilhar conhecimento com a comunidade Oracle, contribuindo para o crescimento e a excelência da plataforma.

Comentário(s) da Comunidade

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress