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?


Descubra mais sobre ViamaisBLOG

Assine para receber nossas notícias mais recentes por e-mail.

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.
ViamaisBLOG
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.