Rótulo e o comando GOTO
Autor: Prof. Paulo Kaupa
Os rótulos (labels) servem para nomear partes do código. Quando usados em conjunto com a estrutura GOTO é possível modificar o fluxo do código.
Rótulos (Labels)
Para definir um rótulo basta acrescentar uma palavra entre os símbolos <<>>.
Um rótulo deve ser inserido na sessão de execução de códigos, entre as palavras-chave BEGIN e END, o nome dado ao rótulo deve ser único, ou seja, caso existe mais que um rótulo cada um deve receber um nome diferente. Sempre após um rótulo deve haver ao menos um trecho de código.
Sintaxe :
BEGIN
<< ROTULO>>
<código a ser executado>;
END;
Os labels podem ser aplicados para organizar o código, facilitando futuras leituras e o entendimento.
Exemplo 1:
BEGIN
<<LOOP_EXTERNO>>
FOR V_EXTERNO IN 1..20 LOOP
DBMS_OUTPUT.PUT_LINE('Valor do Contador Externo: ' || V_EXTERNO);
<<LOOP_INTERNO>>
FOR V_INTERNO IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('Valor do Contador Interno: ' || V_INTERNO);
IF V_EXTERNO = 10 THEN
EXIT LOOP_EXTERNO;
END IF;
END LOOP INTERNO;
END LOOP EXTERNO;
END;
No exemplo 1, dois laços são códificados de forma encadeada (um dentro do outro), com o uso dos rótulos, podemos identificar exatamente o inicio e fim de cada laço.
Comando GOTO
O comando GOTO também deve ser inserido na sessão de execução de códigos, entre as palavras-chave BEGIN e END. Esta estrutura deve indicar um rótulo ao qual irá direcionar a execução do código.
Restrições:
O comando GOTO não pode ser usado para direcionar o código para dentro de uma estrutura Condicional como o IF e o CASE nem para dentro as estruturas de laço (Loop) ou para suas sub-rotinas.
Exemplo 2:
SET SERVEROUTPUT ON;
DECLARE
v_valor NUMBER(38):=1;
BEGIN
IF v_valor = 10 THEN
DBMS_OUTPUT.PUT_LINE('DEZ');
GOTO FIM;
ELSE
DBMS_OUTPUT.PUT_LINE(v_ valor);
END IF
<<FIM>>
DBMS_OUTPUT.PUT_LINE('Fim do programa');
END;
No Exemplo 2, foi criado um rótulo nomeado FIM. Se o valor passado para a variável v_valor for igual a 10 o fluxo do código será direcionado com o uso do comando GOTO para o rótulo <<FIM>>.
Exemplo 3:
SET SERVEROUTPUT ON;
DECLARE
v_contador NUMBER (38):=1;
BEGIN
FOR v_contador IN 1..20 LOOP
IF v_contador = 10 THEN
DBMS_OUTPUT.PUT_LINE('DEZ');
GOTO FIM;
ELSE
DBMS_OUTPUT.PUT_LINE(v_contador);
END IF
END LOOP;
<<FIM>>
DBMS_OUTPUT.PUT_LINE('Fim do programa');
END;
No Exemplo 3, o fluxo do código será direcionado para o rótulo <<FIM>> quando o valor do contador for igual a 10.
Nota: Para um melhor entendimento do Bloco de Código do Exemplo 1, consulte o material Estruturas de Decisção e Estruturas de Repetição (Laços).
Exemplo 4:
SET SERVEROUTPUT ON;
DECLARE
v_contador NUMBER(2) := 10;
BEGIN
<<INICIO_LOOP>>
WHILE v_contado <= 20 LOOP
DBMS_OUTPUT.PUT_LINE ('Contador igual a: ' || v_contado);
v_contado := v_contado + 1;
IF v_contado = 14 THEN
v_contado := v_contado + 1;
GOTO INICIO_LOOP;
END IF;
END LOOP;
END;
No Exemplo 4, o fluxo do código será direcionado para o rótulo <<INICIO_LOOP >> quando o valor do contador for igual a 14.
Exemplo 5:
SET SERVEROUTPUT ON;
DECLARE
v_contador NUMBER(2) := 10;
BEGIN
<<INICIO_LOOP>>
WHILE v_contador <= 20 LOOP
DBMS_OUTPUT.PUT_LINE ('Contador igual a: ' || v_contador);
v_contador := v_contador + 1;
IF v_contador = 11 OR v_contador = 17 THEN
v_contador := v_contador + 1;
GOTO INICIO_LOOP;
ELSIF v_contador = 19 THEN
GOTO FIM_CODIGO;
END IF;
END LOOP;
<<FIM_CODIGO>>
DBMS_OUTPUT.PUT_LINE ('FIM');
END;
No Exemplo 5, o fluxo do código será direcionado para o rótulo <<INICIO_LOOP >> quando o valor do contador for igual a 11 ou igual a 17. Quando o valor for igual a 19 o código será direcionado para o final.
Atividade 1 - (Rótulos e Estrutura GOTO)
1 – Elabore um Bloco de Códigos que direcione o código para um rótulo <<PAR>> caso o valor informado seja par e imprima na tela a seguinte mensagem: “O Valor informado é par.” Se o valor informado for impar redirecione seu código para um rótulo <<IMPAR>> e informe através de uma mensagem que o valor in formado é impar.
2 - O código deve avaliar apenas os números que estiverem entre 1 e 50.
3 – Crie ao final de seu bloco de código um rótulo com nome QUARENTA. Quando seu código alcançar o valor 40 redirecione o fluxo para este rótulo