Goto no PL/SQL

[ad#texto]

Noto que alguns programadores/desenvolvedores tem certa repulsa pelo comando GOTO (vá para, em tradução livre) seja de qual for à linguagem, talvez esse sentimento seja antigo, pois algumas linguagens de outros tempos permitiam uma verdadeira salada com o comando GOTO o que tornava a manutenção do código ou alguma melhoria um verdadeiro trabalho Herculano.

Porém se o código-fonte for bem estruturado, é totalmente passível e de bom tom utilizar o comando GOTO quando a linguagem o possuir (obviamente).

Não sei se é endêmico da região em que trabalho, mas o pessoal do PL/SQL daqui não utiliza muito o GOTO em seus softwares, quando é preciso fazer algum jump para outra parte do código-fonte ou é tudo separado em diversas procedures dentro de um mesmo body (package) o que pode gerar uma confusão maior do que com o uso do GOTO, ou o que é pior, fica uma parte do código-fonte dentro de um if e a outra parte dentro do else, nem preciso comentar muito, veja o resultado por você mesmo:

If varTeste = true then
 -- Todo o seu código que será executado caso a condição seja verdadeira
Else
-- Todo o seu código que será executado caso a condição não seja verdadeira
End if;

Em pequenos fragmentos de código-fonte isso não trás problemas, mas experimente dividir o seu código em duas partes, cada uma com mais de 2.000 linhas e veja que isso fica muito boçal. Agora veja a diferença com o uso do GOTO:

If varTeste != true then
 Goto exec
End if;

-- Todo o seu código que será executado caso a condição seja verdadeira

<>
-- Todo o seu código que será executado caso a condição não seja verdadeira

Fica muito mais fácil de manter e mais performático também. Realmente não sei para que não utilizar. Ainda duvida da aplicação do GOTO no PL/SQL, veja um exemplo mais conciso:

declare

 w_teste     varchar2(1000);
 w_laco      varchar2(10);
 cursor u_teste is
  select cod_venda
  from vendas
  where ;

begin
 open u_teste;
 loop
 fetch u_teste into w_laco;
  exit when u_teste%notfound;

  if w_teste is null then
   w_teste := w_laco;
  else
   w_teste := w_teste || ', ' || w_laco;
  end if;
 end loop;

if w_teste is null then
 goto sem_erro;
end if;

close u_teste;

dbms_output.put_line('Saída de teste:');
dbms_output.put_line('Valor: ' || w_teste);

<<sem_erro>>
dbms_output.put_line('Fim de execução!');

end;

Ficou mais visível agora?

Petter Rafael

Desenvolvedor Web atua com as tecnologias Java e PHP apoiadas pelos bancos de dados Oracle e MySQL. Além dos ambientes de desenvolvimento acima possuiu amplo conhecimento em servidores Apache/Tomcat, Photoshop, Arte & Foto, Flash e mais uma dezena de ferramentas e tecnologias emergentes. Atualmente colabora com o Viablog escrevendo sobre programação e tecnologia.