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 no qual foi dito de que não existia 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

Formado em Gestão em Tecnologia da Informação, com sólidos conhecimentos em SQL, PL/SQL, Oracle Forms, Reports e E-Business Suite (AP,AR e GL).
Foi durante 3 anos gerente de tecnologia de grande empresa do setor de saúde, e atualmente atua como Analista de Sistema Sênior na Scania Latin America e também como Diretor-fundador do GPO (Grupo de Profissionais Oracle).