Etykiety, GOTO, EXIT i pętle

W PL/SQL istnieje możliwość użycia etykiet do oznaczenia miejsca w kodzie. Robi się to z wykorzystaniem składni <<>> w którym umieszcza się etykietę. Do takiej etykiety można się potem odwołać np. w instrukcji GOTO, która powoduje przejście do konkretnego miejsca w kodzie tak jak w poniższym przykładzie.

BEGIN
  GOTO etykieta;
  Dbms_Output.put_line('Tekst 1');
  <<etykieta>>
  Dbms_Output.put_line('Tekst 2');
END;

Powyższy kod wyświetli jedynie Tekst 2

Stosowanie GOTO i etykiet jest jednak powszechnie uznawane za trudno czytelnie i nie eleganckie. Istnieje jednak pewien wyjątek dotyczący etykiet związany z pętlami. Etykieta umieszczona przed pętlą pozwala na nadanie jej nazwy, którą potem można wykorzystać w instrukcji EXIT.

BEGIN
  <<petla>>
  LOOP
    Dbms_Output.put_line('W petli...');
    EXIT petla;
  END LOOP;
  Dbms_Output.put_line('Po pętli...');
END;
/

Zazwyczaj jest to “jedynie” elegancja w kodzie i nie wnosi ona zmiany jego zachowania, poza przypadkiem pętli zagnieżdżonych.

BEGIN
  <<petla_zewnetrzna>>
  LOOP
    LOOP
      Dbms_Output.put_line('W petli...');
      EXIT petla_zewnetrzna;
    END LOOP;
  END LOOP;
  Dbms_Output.put_line('Po pętli...');
END;
/

Powyższy kod dzięki wykorzystaniu w pętli wewnętrznej instrukcji EXIT z etykietą pętli zewnętrznej wychodzi z pętli zewnętrznej unikając niekończonego zapętlenia. Zrealizowanie tego samego zachowania bez możliwości określenia z której pętli ma wyjść instrukcja EXIT wymagałoby wykorzystanie, mało eleganckiej w tym momencie, instrukcji IF. Użycie etykiet pętli upraszcza kod i robi go dużo bardziej czytelnym.

About Przemysław Kantyka

LinkedIn Profile I am a Consultant with 15 years of professional experience in Forms, Oracle, PL/SQL and APEX. I am a participant in the Oracle ACE program. As a Snowflake Data Engineer, I also work with data warehouse systems and perform analysis, ETL and tuning activities. I am also a co-organizer of Snowflake Meetup Group Poland and a speaker at international conferences (DOAG, Oracle Open World, APEX World). I am co-founder and developer of Oracle-Snowflake Connector. Visit dataconsulting.pl website
This entry was posted in PL/SQL Podstawy and tagged , , , , , , . Bookmark the permalink.

Leave a Reply