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?