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?

Tags:,
Petter Rafael
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.

Assinar blog por e-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.

Junte-se a 323 outros assinantes

Busca

agosto 2020
DSTQQSS
 1
2345678
9101112131415
16171819202122
23242526272829
3031 

Categorias