Páginas

9 de nov. de 2010

Funções recursivas no Oracle Database

Pessoal,
   
     Este artigo é simples e curto e tem como objetivo apenas demonstrar o conceito de recursividade e como utilizar uma função recursiva em um Banco de Dados Oracle.


     Em Ciências da Computação, o termo recursividade é utilizado para a definição de uma subrotina (função ou método) que pode invocar a si mesma. Este conceito é simples na teoria, mas na prática (até o primeiro contato) é um pouco mais complexo. Com o objetivo de facilitar o entendimento de recursividade, iremos criar e utilizar uma função recursiva em um Banco de Dados Oracle.
   
     O código abaixo cria uma função recursiva com o nome fc_recursiva_exemplo, que retorna uma string contendo todos os números entre um valor de início (intContInicio) e um valor fim (intContFim), recebidos como  parâmetros de entrada pela função. Esta função é executada internamente, N vezes (conforme valores de início e fim) e utiliza o parâmetro strVazia, que é preenchido cumulativamente e que deve ser chamado com um valor vazio para 'montar' a string de retorno.
   
CREATE or replace FUNCTION fc_recursiva_exemplo(intContInicio IN NUMBER, intContFim IN NUMBER, strVazia IN VARCHAR2)
RETURN VARCHAR2
is
    intContInicioTemp NUMBER;
    strTemp VARCHAR2(4000);
BEGIN   
    intContInicioTemp:= (intContInicio+1);    

    --dbms_output.put_line('linha: ' || i);
    strTemp:=strVazia || intContInicio || ', ';



    if (intContInicioTemp <= intContFim) then       
        select  fc_recursiva_exemplo(intContInicioTemp, intContFim, strTemp) into strTemp from dual;
    else
        strTemp:=SUBSTR(strTemp,1,LENGTH(strTemp)-2);
    end if;
   
    Return strTemp;
END;

   
   Obs.: Reparem que no código acima, dentro do bloco IF, há uma chamada para a própria função (fc_recursiva_exemplo) que é executada N vezes, até que o valor fim seja alcançado. Isso é feito sem executar uma rotina de loop, utilizando apenas o conceito de recursividade.


     Segue abaixo um exemplo para testar a função:
         select fc_recursiva_exemplo(1,10,'') from dual;
  
    que deverá retornar a seguinte string:
          1, 2, 3, 4, 5, 6, 7, 8, 9, 10
        



Nenhum comentário:

Postar um comentário