Criando uma Function, Procedure, Package e Trigger de forma básica
Agora que dei um exemplo de Bloco Anônimo, podemos utilizar estes blocos e compilar no Oracle como programas.
Estes programas podem estar nos formatos acima. Vai depender da funcionalidade e como ele ira ser utilizado.
Syntax básica para montar uma Function
CREATE OR REPLACE FUNCTION LISTA_TABELA(Numero
TABELA.SEQUENCIAL%TYPE,
Coluna NUMBER) RETURN VARCHAR IS
-- DECLARAÇÃO DAS VARIAVEIS
--
%TYPE SERVE PARA A COLUNA HERDAR O TIPO E CARACTERÍSTICA DA COLUNA
COL1
TABELA.SEQUENCIAL%TYPE;
COL2
TABELA.DESCRICAO%TYPE;
COL3
TABELA.VALOR%TYPE;
RETORNO_VALOR VARCHAR2(50);
Begin
--
BEGIN, INICIA O TRECHO DA VALIDAÇÃO DO EXCEPTION. EQUIVALENTE AO
TRY CATCH
BEGIN
SELECT T.SEQUENCIAL,
T.DESCRICAO, T.VALOR
INTO COL1, COL2, COL3
FROM TABELA T
WHERE T.SEQUENCIAL = Numero;
EXCEPTION
--
SEM REGISTROS ENCONTRADOS
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, 'Valor não
encontrado');
-- MUITOS REGISTROS ENCONTRADOS
WHEN TOO_MANY_ROWS THEN
RAISE_APPLICATION_ERROR(-20003, 'Muitos registros foram retornados');
-- OUTROS ERROS
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20004, 'Erro genérico');
END;
--
VALIDAÇÃO.
--
RAISE_APPLICATION_ERROR, Tem a finalidade de jogar um erro padronizado no
Oracle.
IF Coluna NOT IN (1, 2, 3) THEN
RAISE_APPLICATION_ERROR(-20001,
'Parâmetro 2, somente aceita números de 1,2,3');
End IF;
--
Lista a coluna desejada
IF Coluna = 1 THEN
RETORNO_VALOR := TO_CHAR(COL1);
ELSIF Coluna = 2 THEN
RETORNO_VALOR := COL2;
ELSIF Coluna = 3 THEN
RETORNO_VALOR := TO_CHAR(COL3);
END IF;
--
Retorna o valor
RETURN RETORNO_VALOR;
END;
Primeira forma :
SELECT LISTA_TABELA(1,3) FROM DUAL;
SELECT LISTA_TABELA(1,2) FROM DUAL;
SELECT LISTA_TABELA(1,1) FROM
DUAL;
Por bloco anônimo
DECLARE
RETORNO VARCHAR2(50);
BEGIN
RETORNO := LISTA_TABELA(1, 2);
DBMS_OUTPUT.put_line(RETORNO);
END;
Note que existem regras que devem ser seguidas.
No caso de uma função simples, somente uma linha e uma coluna pode ser retornada por vez. Se fizer uma função pipelined ai a coisa muda de figura. Em breve estarei postando um exemplo completo de função pipelined.
A função pode ser retornada em uma select, a procedure não.
Em breve continuarei postando o exemplo de uma procedure.... agora tenho que trabalhar um pouco.
Nenhum comentário:
Postar um comentário