segunda-feira, 27 de janeiro de 2014

ORACLE-Criando Function, Procedure, Package, Trigger de forma básica

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;

Existem diversas formas de retornar a função, vou mostrar duas delas :
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