Instrukcja GOTO

Instrukcja GOTO służy do przeniesienia wykonywania w inne miejsce bloku. Możemy dzięki niej stworzyć etykietę i umieścić ją w wybranym miejscu bloku, a następnie „przeskoczyć” do niej z innego miejsca przy pomocy GOTO.

Po napotkaniu na instrukcję GOTO wykonywanie przechodzi do następnej instrukcji następującej po etykiecie do której GOTO się odwołuje.

Należy bardzo uważać przy stosowaniu instrukcji GOTO, ponieważ łatwo pomylić się i stworzyć konstrukcję która wpadnie w nieskończoną pętlę. Poniższy przykład zadziałałby właśnie w ten sposób:



Gdybym uruchomił powyższy kod, blok wykonywałby się wiecznie, ponieważ nie ma wyjścia z takiej pętli. Po każdym przejściu, zacząłby się wykonywać od początku.
Po etykiecie zawsze musi znajdować się kod wykonywalny. Nie można przeskoczyć do samego końca kodu jeśli po etykiecie już nic się nie znajduje. Efekt próby kompilacji takiego programu:

Możemy ten problem rozwiązać, dodając przed END dodatkową klauzulę NULL; tak jak w pierwszym przykładzie. 
Istnieją inne obostrzenia związane z instrukcją GOTO. Nie może odnosić się do etykiet:

  • Znajdujących się w bloku zagnieżdżonym względem bloku w którym znajduje się GOTO
  • W bloku w którym zagnieżdżony jest blok wywołujący instrukcję GOTO
  • Znajdujących się wewnątrz instrukcji sterujących IF, CASE jeśli GOTO znajduje się na zewnątrz nich.
  • Znajdujących się w pętlach
  • Znajdujących się w wewnątrz instrukcji sterujących IF, CASE jeśli instrukcja GOTO znajduje się w kodzie zależnym od innego warunku. Np. etykieta znajduje się w ciągu zależnym od jednego IF, a GOTO w ciągu zależnym od innego lub od ELSE. Analogicznie CASE.
  • Znajdujących się poza podprogramem np. w sekcji inicjalizacji pakietu lub innym podprogramie.
  • Znajdujących się w sekcji wykonania, jeśli instrukcja GOTO znajduje się w sekcji obsługi błędów.

Wielu ludzi znacznie mądrzejszych ode mnie, starców z długimi brodami bez życia poza komputerem udawadniało sobie wzajemnie czy instrukcja goto jest ok czy to totalne zło, nie tylko w PL/SQL, ale od zarania dziejów nowszych nieco języków programowania niż COBOL. Faktem jest że spotyka się tą instrukcję raczej rzadko, osobiście staram się jej unikać. To czy uznasz drogi czytelniku / czytelniczko (?) tą instrukcję za fajną i użyteczną pozostawiam Tobie.