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
Não sabia que dava pra fazer isso no plsql.obrigado pela dica!