Pesquisar este blog

segunda-feira, 18 de janeiro de 2010

Dicas e Truques PL/SQL - Parte 2

1 - Uso do WHILE com EXIT WHEN

SQL> 
  1  create or replace
  2  function conta_ate_espaco(texto in varchar2) return number is
  3    i number := 1;
  4    vResult number := 0;
  5  begin
  6    while i <= length(texto) loop
  7       if substr(texto, i, 1) != ' ' then
  8          vResult:= vResult + 1;
  9          i:= i+1;
 10       end if;
 11      exit when substr(texto, i, 1) = ' ';   -- vai sair do loop quando encontrar um espaço
 12    end loop;
 13    -- return é executado após o fim do loop ou quando exit when da linha 11 é executado.
 14    return vResult;
 14* end;
SQL>


2 - Usando rótulos para identificar loops.

EXEMPLO 1:

SQL> 
  1  create or replace
  2  function conta_ate_espaco(texto in varchar2) return number is
  3    i number := 1;
  4    vResult number := 0;
  5  begin
  6    <<conta_char>>  -- define um rótulo
  7    while i <= length(texto) loop
  8       if substr(texto, i, 1) != ' ' then
  9     vResult:= vResult + 1;
 10          i:= i+1;
 11       end if;
 12      exit when substr(texto, i, 1) = ' ';
 13    end loop conta_char;  -- finalize o loop e opcionalmente informe o nome do rótulo
 14    return vResult;
 15* end;
SQL> / 

EXEMPLO 2:

SQL> 
  1  create or replace procedure imprime_tabuada is
  2    vNumero number := 1;
  3    i number := 1;
  4  begin
  5    <<inicio_rotina>>
  6    for vNumero in 1..10 loop
  7      i := 1;
  8      <<tabuada>>
  9      loop
 10        dbms_output.put_line(to_char(vNumero) || 'x' ||
 11                             to_char(i) || ' = ' || to_char(vNumero*i));
 12        exit tabuada when i = 10;
 13        i := i + 1;
 14      end loop tabuada;
 15    end loop inicio_rotina;
 16* end;
SQL>

EXEMPLO 3


SQL> 
  1  create or replace procedure conta_ate_10 is
  2    i number := 1;
  3  begin
  4    <<conta>>
  5    loop
  6      dbms_output.put_line(i);
  7      exit when i = 10;
  8      i := i + 1;
  9    end loop;
 10* end;
SQL>


3 - Usando a instrução GOTO.

SQL> 
  1  create or replace procedure conta_ate_10_com_goto is
  2    i number := 1;
  3  begin
  4    loop
  5      dbms_output.put_line(i);
  6      if i = 10 then
  7        goto fim;
  8      end if;
  9      i := i + 1;
 10    end loop;
 11    <<fim>>
 12    null;  -- necessário uma instrução após o rótulo ou um erro é gerado
 13* end;
SQL>




Nenhum comentário:

Postar um comentário