Wprowadzenie do języka PL/SQL. Rozdział 9 Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL

Podobne dokumenty
Język PL/SQL Wprowadzenie

Język PL/SQL Wprowadzenie

Wprowadzenie do języka PL/SQL. Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL. Zmienne rekordowe.

1. ELEMENTY JĘZYKA PL/SQL

Wprowadzenie do języka PL/SQL. Rozdział 9 Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL

Język PL/SQL. Rozdział 1. Wprowadzenie do języka PL/SQL

Bloki anonimowe w PL/SQL

PL/SQL. Lidia Małkiewicz i Cezary Skubała

PODSTAWY BAZ DANYCH 13. PL/SQL

Ćwiczenie 11 PL/SQL. Wprowadzenie do języka PL/SQL

2 PL/SQL - podstawy Zmienne i stałe Operatory SQL w PL/SQL Instrukcje sterujące... 8

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

11 marca Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

Bazy danych 2 Laboratorium 2

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

Plan wykładu BAZY DANYCH II WYKŁAD 2. Bloki. Struktura bloku

Język PL/SQL. Rozdział 2. Kursory

Plan wykładu Projekt fizyczny bazy danych Wprowadzenie PL/SQL PL/SQL Cechy PL/SQL

Bloki anonimowe w PL/SQL

15. Funkcje i procedury składowane PL/SQL

Październik Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

Plan wykładu PL/SQL. PL/SQL - historia TWORZENIE APLIKACJI BAZODANOWYCH

Kursor. Rozdział 10a Kursory. Otwieranie kursora. Deklarowanie kursora

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

Kursor jawny. Rozdział 10a Kursory. Deklarowanie kursora (1) Deklarowanie kursora (2)

Procedury i funkcje składowane

Język PL/SQL Procedury i funkcje składowane

PL/SQL. Zaawansowane tematy PL/SQL

Deklarowanie kursora

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Celem ćwiczenia jest wprowadzeniem do programowaniu w języku PL/SQL. Język PL/SQL umoŝliwia tworzenie programów, przetwarzających dane w bazie danych.

Kursory i wyjątki. (c) Instytut Informatyki Politechniki Poznańskiej 1

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Oracle PL/SQL. Paweł Rajba.

Deklarowanie kursora. CURSOR nazwa [ ( param1 typ1 [,param2 typ2]... ) ] [RETURN typ zwracany] IS zapytanie SQL;

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

Język SQL. Rozdział 9. Język definiowania danych DDL, cześć 1. Tworzenie relacji, typy danych, wartości domyślne atrybutów, słownik bazy danych.

Pakiety podprogramów Dynamiczny SQL

PL/SQL. Część 1 Bloki PL/SQL. Piotr Medoń

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Plan wykładu BAZY DANYCH II WYKŁAD 5. Kolekcje. Tablice asocjacyjne Kolekcje Tablice asocjacyjne VARRAY Tablice zagnieżdżone

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

Typy danych w języku PL/SQL

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE,

Oracle Developer Suite. Budowa aplikacji użytkownika końcowego

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Systemy baz danych 2 laboratorium Projekt zaliczeniowy

Obiektowe bazy danych Ćwiczenia laboratoryjne (?)

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Podstawy Programowania C++

Składowane procedury i funkcje

1 Kolekcje Operacje masowe VARRAY NESTED TABLES Tabele asocjacyjne Perspektywy obiektowe 10.

Zaawansowane bazy danych i hurtownie danych semestr I

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków...

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Typy Oracle atrybutów relacji Typ NUMBER (1)

Typy Oracle atrybutów relacji Typ NUMBER (1)

Struktury sterowania PL/SQL

Wstęp do programowania. Różne różności

Plan wykładu BAZY DANYCH II WYKŁAD 4. Co to jest kursor? Rodzaje kursorów

W PostgreSQL mamy do dyspozycji nie tylko funkcje wbudowane, ale również możemy tworzyć własne. Są one zapisywane w tabeli systemowej pg_proc.

Język PL/SQL. Rozdział 6. Procedury wyzwalane

Wykład 4. SQL praca z tabelami 1

Oracle PL/SQL. Paweł Rajba.

Oracle PL/SQL. Paweł Rajba.

20 kwietnia Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład IX. dr inż.

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Tabele wykorzystywane w przykładach

Ćwiczenie 13 PL/SQL. Język PL/SQL procedury, funkcje, pakiety, wyzwalacze

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Wstęp do programowania 2

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

1 Wprowadzenie do bloków nazwanych 1. 2 Parametry 2. 3 Procedury i funkcje 3. 4 Pakiety 6. 5 Podsumowanie Źródła 10

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.

Język SQL. Rozdział 2. Proste zapytania

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Procedury wyzwalane. Rozdział 13. Procedury wyzwalane. Cele stosowania procedur wyzwalanych. Definiowanie procedury wyzwalanej DML

Kiedy i czy konieczne?

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

1 Podstawy c++ w pigułce.

LibreOffice Calc VBA

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Oracle PL/SQL. Paweł Rajba.

Aspekty aktywne baz danych

Zaawansowane bazy danych i hurtownie danych semestr I

Indeksy. Indeks typu B drzewo

Podprogramy. Rozdział 11 Procedury i funkcje składowane

Instrukcje SQL można podzielić na pięć kategorii, które zostały przedstawione w poniższej tabeli.

41. Zmienne lokalne muszą mieć nazwę, którą poprzedza (maksymalnie 128 znaków) oraz typ (każdy z wyjątkiem: text, ntext oraz image)

Język PL/SQL. Rozdział 4. Procedury i funkcje składowane

Bazy danych. Dr inż. Paweł Kasprowski

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Oracle11g: Programowanie w PL/SQL

Transkrypt:

Wprowadzenie do języka PL/SQL Rozdział 9 Język PL/SQL Wprowadzenie Język PL/SQL to rozszerzenie SQL o elementy programowania proceduralnego i obiektowego. PL/SQL umoŝliwia wykorzystanie: zmiennych i stałych struktur kontrolnych, w tym instrukcji warunkowych, pętli, etykiet i instrukcji skoku, instrukcji wyboru warunkowego kursorów wyjątków i mechanizmu obsługi błędów Koncepcja języka, zmienne i stałe, typy zmiennych, nadawanie wartości zmiennym, instrukcje warunkowe, pętle, sterowanie przebiegiem programu Za pomocą języka PL/SQL tworzy się anonimowe bloki programu procedury i funkcje składowane pakiety wyzwalacze bazy danych 1 2 Przykładowy program w PL/SQL Struktura blokowa programu v_magazyn NUMBER(5); SELECT liczba_sztuk INTO v_magazyn FROM zapasy WHERE produkt = MLEKO UHT FOR UPDATE OF liczba_sztuk; --odczytujemy liczbę w magazynie IF (v_magazyn > 0) THEN -sprawdzamy ilość w magazynie UPDATE zapasy SET liczba_sztuk = liczba_sztuk - 1 WHERE produkt = MLEKO UHT ; INSERT INTO historia_zakupow VALUES ( Kupiono mleko UHT, SYSDATE); INSERT INTO historia_zakupow VALUES ( Brak mleka UHT w magazynie, SYSDATE); COMMIT; Program składa się z jednostek zwanych blokami. KaŜdy blok odpowiada problemowi (podproblemowi) Bloki mogą być dowolnie zagnieŝdŝone KaŜdy blok składa się z trzech części: deklaracji (o) rozkazów (w) obsługi błędów (o) Bloki mogą być zagnieŝdŝane w części rozkazów lub/i części obsługi błędów [ deklaracje ] rozkazy [EXCEPTION wyjątki ] 3 4

Zmienne Zmienne rekordowe Zmienne proste (np. typu numerycznego, znakowego, daty) Zmienne podtypu (np. zdefiniowanego przez uŝytkownika) Zmienne złoŝone (np. rekordy, tablice, kolekcje, obiekty) nazwa_zmiennej typ(długość) [ DEFAULT wartość domyślna ] [ NOT NULL ]; Rekord to zbiór powiązanych danych róŝnych typów, opisujących jedno i to samo pojęcie. Przed zadeklarowaniem zmiennej rekordowej trzeba zdefiniować typ rekordowy TYPE Pracownik IS RECORD ( nazwisko VARCHAR2(50), pesel NUMBER(11), data_zatrudnienia DATE DEFAULT SYSDATE ); licznik NUMBER(4); znak CHAR(1) DEFAULT 'A'; flaga BOOLEAN DEFAULT TRUE; data_pocz DATE DEFAULT SYSDATE NOT NULL; kowalski Pracownik; kowalski.nazwisko := 'Kowalski'; kowalski.pesel := 70120100000; 5 6 Zmienne tablicowe Tablice indeksowane (index-by tables): nieograniczony rozmiar, automatycznie rozszerzane, nie mogą być typem atrybutu w bazie danych, indeks tablicy moŝe być ujemny Tablice zagnieŝdŝone (nested tables): nieograniczony rozmiar, rozszerzane za pomocą procedury EXTEND, mogą być typem atrybutu w relacji, mogą być uŝyte w poleceniach DML, nie zainicjalizowana tablica jest pusta, przechowywane fizycznie w osobnej relacji (store table), indeks tablicy musi być dodatni Kolekcje o zmiennym rozmiarze (varrays): ograniczony i rozszerzalny rozmiar, przechowywane w zwartej postaci in-line, indeks kolekcji musi być dodatni TYPE PracTab IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER; TYPE PracRecTab IS TABLE OF Pracownik; Atrybuty %TYPE, %ROWTYPE Atrybut %TYPE zawiera typ innej zmiennej lub typ atrybutu w bazie danych. v_nazwisko PRACOWNICY.NAZWISKO%TYPE; v_nazwa_zespolu ZESPOLY.NAZWA%TYPE; Atrybut %ROWTYPE zawiera typ rekordowy reprezentujący strukturę pojedynczej krotki z danej relacji. Atrybuty w krotce i odpowiadające im pola w rekordzie mają te same nazwy i typy. r_pracownik PRACOWNICY%ROWTYPE; r_zespol ZESPOLY%ROWTYPE; TYPE SwietaVar IS VARRAY(50) OF DATE; 7 8

Nadawanie wartości zmiennym Nadanie wartości zmiennym (c.d.) Nadanie wartości poprzez przypisanie Nadanie wartości przez wczytanie danych z bazy danych do zmiennej poleceniem SELECT INTO v_licznik NUMBER := 10; v_nazwa VARCHAR2(30) := 'Politechnika Poznańska'; v_flaga BOOLEAN := FALSE; v_podatek NUMBER(10,2) := v_suma * v_stawka_pod; v_zysk NUMBER(10,2) := f_oblicz_zysk('01-01-1999', v_today); UWAGA!!! Zmienna, która została zadeklarowana lecz nie została zainicjalizowana, posiada wartość NULL. UŜycie takiej zmiennej moŝe spowodować nieprawidłowe wyniki. SELECT nazwisko, etat INTO v_nazwisko, v_etat FROM pracownicy WHERE placa_pod = ( SELECT MAX(placa_pod) FROM pracownicy ); Nadanie wartości przez przekazanie zmiennej jako parametru typu IN OUT lub OUT do procedury lub funkcji v_pensja NUMBER(7,2); PROCEDURE zarobki(id_prac INT IN, placa REAL OUT) IS SELECT AVG(placa_pod) INTO v_pensja FROM pracownicy; zarobki(100, v_pensja); 9 10 Nadanie wartości zmiennym (c.d.) Nadanie wartości przez wczytanie danych z bazy danych do zmiennej za pomocą klauzuli RETURNING poleceń INSERT/UPDATE/DELETE Typowe zastosowanie RETURNING: odczyt wartości ustawionych na poziomie bazy danych (np. wartości klucza głównego) id NUMBER; nowa_placa NUMBER; INSERT INTO pracownicy (id_prac, nazwisko, etat, placa_pod, id_zesp) VALUES (prac_seq.nextval, 'NOWAK', 'ADIUNKT', 1000, 20) RETURNING id_prac INTO id; UPDATE pracownicy SET placa_pod = 1.1 * placa_pod WHERE id_prac = id RETURNING placa_pod INTO nowa_placa; 11 Stałe Stałe deklarujemy z uŝyciem słowa kluczowego CONSTANT. Stała musi zostać zainicjalizowana podczas deklaracji. Po utworzeniu stałej jakiekolwiek modyfikacje jej wartości są niedozwolone. c_godziny_pracy CONSTANT NUMBER := 42; c_pp CONSTANT VARCHAR2(30) := 'Politechnika Poznańska'; c_vat CONSTANT NUMBER(2,2) := 0.22; 12

Typy danych Typy danych - uwagi Numerical Types BINARY_INTEGER DEC DECIMAL DOUBLE PRECISION FLOAT INT INTEGER Character Types CHAR CHARACTER LONG NCHAR NVARCHAR2 RAW STRING Composite Types RECORD TABLE VARRAY LOB Types BFILE BLOB Typy danych dostępne w PL/SQL nie odpowiadają dokładnie analogicznym typom dostępnym w SQL. Typy BINARY_INTEGER i PLS_INTEGER: -2 31 2 31. Ich podtypami są typy: POSITIVE, POSITIVEN, NATURAL, NATURALN i SIGNTYPE (-1, 0, 1). NATURAL NATURALN (not null) NUMBER NUMERIC PLS_INTEGER POSITIVE POSITIVEN (not null) REAL SIGNTYPE SMALLINT VARCHAR VARCHAR2 Boolean Type BOOLEAN Date Type DATE TIMESTAMP INTERVAL CLOB NCLOB Reference Types REF CURSOR REF object_type Typ NUMBER: 10-130 10 125. Jego podtypami są typy: DECIMAL, INTEGER, FLOAT, REAL, NUMERIC. Typy CHAR, VARCHAR2, RAW, LONG: 32767 bajtów Typ BOOLEAN: TRUE, FALSE, NULL 13 14 Podtypy Interakcja z uŝytkownikiem (1) KaŜdy typ danych definiuje zbiór poprawnych wartości i zbiór operatorów, które mogą być zastosowany do zmiennej danego typu. Podtyp definiuje ten sam zbiór operatorów co jego typ nadrzędny, lecz zawęŝa zbiór poprawnych wartości. SUBTYPE nazwa IS typ bazowy [ (ograniczenie) ] [ NOT NULL ]; Pobieranie informacji od uŝytkownika zmienne podstawienia. v_zmienna := &zmienna_podstawienia; Wypisywanie informacji na konsoli procedura PUT_LINE z pakietu DBMS_OUTPUT. DBMS_OUTPUT.PUT_LINE(ciąg_tekstowy); SUBTYPE DataUr IS DATE NOT NULL; SUBTYPE Pieniadze IS NUMBER(9,2); v_moje_urodziny DataUr; v_moja_pensja Pieniadze; ustaw zmienną SERVEROUTPUT narzędzia SQL*Plus na wartość ON przed wykonaniem programu. SQL> SET SERVEROUTPUT ON [SIZE rozmiar_bufora] 15 16

Interakcja z uŝytkownikiem (2) Struktury kontrolne Przykład: SELEKCJA ITERACJA SEKWENCJA SQL> SET SERVEROUTPUT ON v_i NUMBER(3) := &liczba; v_nazwa VARCHAR2(50) := '&tekst'; dbms_output.put_line('zmienna v_i: ' to_char(v_i)); v_nazwa := v_nazwa ' ABC'; dbms_output.put_line(v_nazwa); T WARUNEK N WARUNEK T N 17 18 Instrukcja warunkowa IF-THEN- IF warunek THEN IF warunek THEN Warunek musi zwracać wartość logiczną. Sekwencja poleceń jest wykonywana, gdy wartością warunku jest TRUE. Jeśli wartością warunku jest FALSE lub UNKNOWN to sekwencja nie jest wykonywana. IF warunek 1 THEN ELSIF warunek 2 THEN Przykład instrukcji warunkowej Przed wykonaniem ćwiczenia ustaw zmienną środowiska SQL*Plus: SQL> SET SERVEROUTPUT ON SIZE 1000000 v_hello VARCHAR2(20) := 'Hello, '; v_kogo_witamy NUMBER(1) := 0; IF (v_kogo_witamy = 0) THEN v_hello := v_hello 'world!'; v_hello := v_hello 'universe!'; DBMS_OUTPUT.PUT_LINE(v_hello); 19 20

Instrukcja wyboru wielokrotnego CASE Przykład instrukcji CASE Instrukcja CASE moŝe występować z selektorem (selektorem moŝe być dowolnie złoŝone wyraŝenie, ale najczęściej jest to jedna zmienna) lub z listą wyraŝeń (searched CASE) CASE selektor WHEN wartość 1 THEN polecenie 1 ; WHEN wartość 2 THEN polecenie 2 ; WHEN polecenie n ; END CASE; CASE WHEN wyraŝenie 1 THEN polecenie 1 ; WHEN wyraŝenie 2 THEN polecenie 2 ; WHEN polecenie n ; END CASE; v_ocena NUMBER(2,1) := 2.0; v_slownie CHAR(16); CASE v_ocena WHEN 2.0 THEN v_slownie := 'niedostateczny'; WHEN 3.0 THEN v_slownie := 'dostateczny'; WHEN 3.5 THEN v_slownie := 'dostateczny plus'; WHEN 4.0 THEN v_slownie := 'dobry'; WHEN 4.5 THEN v_slownie := 'dobry plus'; WHEN 5.0 THEN v_slownie := 'bardzo dobry'; END CASE; DBMS_OUTPUT.PUT_LINE(v_slownie); 21 22 Pętla LOOP Przykład prostej pętli Prosta pętla wykonuje się w nieskończoność. Wyjście z pętli jest moŝliwe tylko jako efekt wykonania polecenia EXIT lub EXIT WHEN. W kaŝdym przebiegu pętli wykonuje się sekwencja poleceń. Po ich wykonaniu kontrola powraca do początku pętli. v_suma NUMBER := 0; v_i INTEGER := 0; c_koniec CONSTANT INTEGER := &koniec; LOOP LOOP IF warunek THEN EXIT; LOOP EXIT WHEN warunek; v_suma := v_suma + v_i; EXIT WHEN (v_i = c_koniec); v_i := v_i + 1; DBMS_OUTPUT.PUT_LINE('Suma liczb od 0 do ' c_koniec); DBMS_OUTPUT.PUT_LINE(v_suma); 23 24

Pętla WHILE Przykład pętli WHILE Przed kaŝdą iteracją sprawdzany jest warunek. Pętla jest wykonywano tak długo, jak długo warunek ma wartość TRUE. JeŜeli wartość warunku wynosi FALSE lub UNKNOWN to kontrola przechodzi do pierwszego polecenia po pętli. JeŜeli warunek na samym początku nie był spełniony, to pętla nie wykona się ani razu. WHILE warunek LOOP UWAGA!!! Pamiętaj, aby w sekwencji operacji znalazło się polecenie, które zmieni warunek, w przeciwnym przypadku grozi pętla nieskończona. a NUMBER := &pierwsza_liczba; b NUMBER := &druga_liczba; WHILE (a!= b) LOOP IF (a > b) THEN a := a - b; b := b - a; DBMS_OUTPUT.PUT_LINE(' NWD = ' a); 25 26 Pętla FOR Przykład pętli FOR Pętla FOR wykonuje się określoną liczbę razy. Liczba iteracji jest określona przez zakres podany między słowami kluczowymi FOR i LOOP. Zakres musi być typu numerycznego, w przedziale 2 31 2 31 FOR licznik IN [ REVERSE ] dolna_gr.. górna_gr LOOP a NUMBER := &koniec; is_prime BOOLEAN; FOR i IN 1.. a LOOP is_prime := TRUE; FOR j IN 2.. i/2 LOOP IF (MOD(i,j) = 0) THEN Słowo kluczowe REVERSE odwraca kierunek iteracji Wewnątrz pętli nie wolno nadawać wartości zmiennej iterującej Jeśli dolna granica jest wyŝsza niŝ górna granica to pętla nie wykona się ani razu Obie granice zakresu iteracji nie muszą być statyczne Zmienna iterująca nie musi być wcześniej deklarowana ani inicjalizowana Do wcześniejszego wyjścia z pętli moŝna uŝyć polecenia EXIT is_prime := FALSE; IF (is_prime) THEN DBMS_OUTPUT.PUT_LINE(i ' jest liczba pierwsza'); 27 28

Polecenia sterujące GOTO i NULL Przykład polecenia GOTO Polecenie GOTO bezwarunkowo przekazuje kontrolę wykonywania programu do miejsca wskazywanego przez etykietę związaną z poleceniem. Polecenie NULL nie wykonuje Ŝadnej akcji. GOTO etykieta; NULL; v_tekst VARCHAR2(20); <<początek>> v_tekst := 'Ala '; GOTO ma; <<asa>> <<etykieta>> v_tekst := v_tekst 'asa '; GOTO drukuj; Etykieta musi poprzedzać polecenie wykonywalne GOTO nie moŝe przeskakiwać do warunkowych części poleceń IF-THEN-, CASE, do polecenia LOOP i do bloku podrzędnego GOTO nie moŝe wyskakiwać z podprogramu oraz procedury obsługi błędu <<drukuj>> DBMS_OUTPUT.PUT_LINE(v_tekst); GOTO koniec; <<ma>> v_tekst := v_tekst 'ma '; GOTO asa; <<koniec>> NULL; 29 30