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. Rozdział 1. Wprowadzenie do języka PL/SQL

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.

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

1. ELEMENTY JĘZYKA PL/SQL

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.

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

Bloki anonimowe w PL/SQL

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

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

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

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

PODSTAWY BAZ DANYCH 13. PL/SQL

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

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

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

Bazy danych 2 Laboratorium 2

Typy Oracle atrybutów relacji Typ NUMBER (1)

Typy Oracle atrybutów relacji Typ NUMBER (1)

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

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

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

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

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

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

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

Bloki anonimowe w PL/SQL

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

Deklarowanie kursora

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

PL/SQL. Zaawansowane tematy PL/SQL

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

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

Procedury i funkcje składowane

Typy danych w języku PL/SQL

15. Funkcje i procedury składowane PL/SQL

Pakiety podprogramów Dynamiczny SQL

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

DECLARE VARIABLE zmienna1 typ danych; BEGIN

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

Oracle PL/SQL. Paweł Rajba.

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

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

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Podstawy Programowania C++

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

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

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

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

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

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.

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

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

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

Struktury sterowania PL/SQL

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

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

Kiedy i czy konieczne?

LibreOffice Calc VBA

Oracle11g: Programowanie w PL/SQL

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

Podstawy programowania skrót z wykładów:

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

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

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

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

Język PL/SQL. Rozdział 3. Obsługa błędów wykonania Wyjątki predefiniowane i użytkownika, zgłaszanie i obsługa wyjątków.

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

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

Język SQL. Rozdział 2. Proste zapytania

Instrukcja CREATE TABLE

Składowane procedury i funkcje

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

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

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

1 Podstawy c++ w pigułce.

Programowanie obiektowe

Wstęp do programowania 2

Analiza porównawcza języków procedur składowanych PL/SQL, SQL PL, PL/pgSQL i T-SQL

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Oracle10g: Programowanie w PL/SQL

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

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

Algorytmika i Programowanie VBA 1 - podstawy

Język PL/SQL Pakiety podprogramów

Podstawy Programowania Podstawowa składnia języka C++

Wykład 4. SQL praca z tabelami 1

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

MySQL. Darmowa baza danych. Æwiczenia praktyczne

Wykład 2 Składnia języka C# (cz. 1)

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

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Zaawansowane bazy danych i hurtownie danych semestr I

Oracle PL/SQL. Paweł Rajba.

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

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Oracle PL/SQL. Paweł Rajba.

Systemy baz danych 2 laboratorium Projekt zaliczeniowy

1. Wyzwalacze BD (ang. triggers)

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 liczbę w magazynie UPDATE zapasy SET liczba_sztuk = liczba_sztuk - 1 WHERE produkt = MLEKO UHT ; INSERT INTO historia_zakupow VALUES ( Kupiono mleko UHT, SYSDATE); ELSE INSERT INTO historia_zakupow VALUES ( Brak mleka UHT w magazynie, SYSDATE); COMMIT; 3 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 Komentarze: -- - jednoliniowy /* */ - wieloliniowy [... deklaracje ]... rozkazy...... [EXCEPTION... wyjątki ] 4

Zmienne proste Atrybut %TYPE Zmienne proste (np. typu numerycznego, znakowego, daty) nazwa_zmiennej typ(długość) [ DEFAULT := wartość domyślna ] [ NOT NULL ]; licznik NUMBER(4); znak CHAR(1) DEFAULT 'A'; flaga BOOLEAN := TRUE; data_pocz DATE DEFAULT SYSDATE NOT NULL; Atrybut %TYPE pozwala zadeklarować zmienną w oparciu o typ innej zmiennej lub typ kolumny relacji w bazie danych. v_nazwisko PRACOWNICY.NAZWISKO%TYPE; v_nazwa_zespolu ZESPOLY.NAZWA%TYPE; v_drugie_nazwisko v_nazwisko%type; Zmienna zadeklarowana jako niepusta (NOT NULL) musi zostać zainicjalizowana Zmienna niezainicjalizowana posiada wartość pustą 5 6 Zmienne rekordowe (1) Zmienne rekordowe (2) 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 Deklaracja zmiennej w oparciu o zdefiniowany przez użytkownika typ rekordowy: TYPE TPracownik IS RECORD ( nazwisko VARCHAR2(50), pesel NUMBER(11), data_zatrudnienia DATE DEFAULT SYSDATE); r_pracownik TPracownik; r_pracownik.nazwisko := 'Kowalski'; r_pracownik.pesel := 70120100000; Deklaracja w oparciu o definicję relacji z bazy danych, kursora lub innej zmiennej rekordowej: r_pracownik_1 PRACOWNICY%ROWTYPE; r_pracownik_2 r_pracownik_1%type; r_zespol ZESPOLY%ROWTYPE; 7 8

Nadawanie wartości zmiennym (1) Nadawanie wartości zmiennym (2) Nadanie wartości przez inicjalizację przy deklaracji Nadanie wartości przez wczytanie danych z bazy danych do zmiennej poleceniem SELECT... INTO... v_licznik NUMBER := 10; v_nazwa VARCHAR2(30) DEFAULT 'Politechnika Poznańska'; Nadanie wartości poprzez przypisanie w ciele programu v_flaga BOOLEAN; v_podatek NUMBER(10,2); v_zysk NUMBER(10,2); v_flaga := FALSE; v_podatek := v_suma * v_stawka_pod; v_zysk := f_oblicz_zysk('01-01-1999', v_today); v_identyfikator := seq_pracownicy.nextval; -- od Oracle11g v_id_zesp pracownicy.id_zesp%type; v_etat pracownicy.etat%type; r_zespol zespoly%rowtype; SELECT id_zesp, etat INTO v_id_zesp, v_etat FROM pracownicy WHERE nazwisko = 'HAPKE'; SELECT * INTO r_zespol FROM zespoly WHERE id_zesp = v_id_zesp; SELECT seq_zespoly.nextval INTO v_id_zesp FROM dual; Uwaga! Polecenie SELECT musi zwrócić dokładnie jeden rekord. 9 10 Nadawanie wartości zmiennym (3) Nadanie wartości przez wczytanie danych z bazy danych do zmiennej za pomocą klauzuli RETURNING poleceń INSERT/UPDATE/DELETE Zastosowanie RETURNING: odczyt wartości ustawionych na poziomie bazy danych (np. wartości klucza głównego z sekwencji) v_id pracownicy.id_prac%type; v_nowa_placa pracownicy.placa_pod%type; INSERT INTO pracownicy (id_prac, nazwisko, etat, placa_pod) VALUES (prac_seq.nextval, 'NOWAK', 'ADIUNKT', 1000) RETURNING id_prac INTO v_id; UPDATE pracownicy SET placa_pod = 1.1 * placa_pod WHERE id_prac = v_id RETURNING placa_pod INTO v_nowa_placa;... Operacje na zmiennych rekordowych (1) Dopuszczalne operacje: przypisanie zmiennej rekordowej wartości NULL, przypisanie zmiennej rekordowej wartości innej zmiennej rekordowej (tylko gdy mają identyczną strukturę), przypisanie polu zmiennej rekordowej wartości pola innej zmiennej rekordowej (o ile typy pól są zgodne lub można wykonać konwersję wartości), porównywanie zmiennych rekordowych możliwe tylko na poziomie pól. 11 12

Operacje na zmiennych rekordowych (2) Użycie zmiennych rekordowych w DML r_pracownik_1 PRACOWNICY%ROWTYPE; r_pracownik_2 PRACOWNICY%ROWTYPE; r_zespol ZESPOLY%ROWTYPE; v_zmienna BOOLEAN; r_pracownik_1 := r_pracownik_2; -- OK. r_zespol := r_pracownik_2; -- Błąd r_zespol.id_zesp := r_pracownik_2.id_zesp; -- OK. v_zmienna := r_pracownik_1 = r_pracownik_2; -- Błąd v_zmienna := r_pracownik_1.etat = r_pracownik_2.etat; -- OK. v_zmienna := r_pracownik_1 = r_zespol; -- Błąd v_zmienna := r_pracownik_1.nazwisko = r_zespol.nazwa; -- OK. Rozszerzona składnia INSERT i UPDATE dla PL/SQL: INSERT INTO relacja [(lista kolumn)] VALUES zmienna_rekordowa; UPDATE relacja SET ROW = zmienna rekordowa [WHERE warunek]; Przykład: r_zespol zespoly%rowtype; SELECT * INTO r_zespol FROM zespoly WHERE nazwa = 'ALGORYTMY'; r_zespol.id_zesp := seq_zespoly.nextval; r_zespol.nazwa := r_zespol.nazwa ' (NOWE)'; INSERT INTO zespoly VALUES r_zespol; -- Brak nawiasów! 13 14 Stałe Typy danych 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) DEFAULT 0.23; c_pi CONSTANT NUMBER(3,2); -- BŁĄD, brak inicjalizacji c_vat := 0.08; -- BŁĄD! Typy liczbowe BINARY_INTEGER DEC DECIMAL DOUBLE PRECISION FLOAT INT INTEGER NATURAL NATURALN (not null) NUMBER NUMERIC PLS_INTEGER POSITIVE POSITIVEN (not null) REAL SIGNTYPE SMALLINT Typy znakowe CHAR CHARACTER LONG NCHAR NVARCHAR2 RAW STRING VARCHAR VARCHAR2 Typ logiczny BOOLEAN Czas DATE TIMESTAMP INTERVAL Inne ROWID UROWID Typy LOB BFILE BLOB CLOB NCLOB Typy wskaźnikowe REF CURSOR REF object_type 15 16

Typ NUMBER Dodatkowe typy numeryczne w PL/SQL (1) Definicja identyczna jak w SQL Zaimplementowany w sposób niezależny od platformy Deklaracja typu zmiennoprzecinkowego: NUMBER maks. 40 pozycji v_liczba_zp NUMBER; Deklaracja typu stałoprzecinkowego: NUMBER(precyzja, skala): precyzja: <1, 38> - całkowita liczba pozycji znaczących skala: <-84, 127> - liczba pozycji na prawo (dodatnia) lub lewo (ujemna) od przecinka v_liczba_sp1 NUMBER(6,2); v_liczba_sp2 NUMBER(4); v_liczba_sp3 NUMBER(8,10); v_liczba_sp4 NUMBER(1,-3); Typy całkowitoliczbowe: PLS_INTEGER zakres: < 2 147 483 648, 2 147 483,647>, wydajny (wykorzystuje arytmetykę sprzętową), podtypy: NATURAL tylko liczby nieujemne, NATURALN tylko liczby nieujemne bez NULL, POSITIVE tylko liczby dodatnie, POSITIVEN tylko liczby dodatnie bez NULL, SIGNTYPE wartości: -1, 0, 1, BINARY_INTEGER od wersji Oracle10g identyczny z PLS_INTEGER, we wcześniejszych wersjach implementowany niezależnie od sprzętu, SIMPLE_INTEGER zakres identyczny z PLS_INTEGER, bez NULL, brak kontroli przepełnienia, dostępny od Oracle11g, znaczny wzrost wydajności w stosunku do PLS_INTEGER przy kompilacji natywnej. 17 18 Dodatkowe typy numeryczne w PL/SQL (2) Ciągi znaków zmiennej długości w PL/SQL (1) Typy zmiennoprzecinkowe z reprezentacją binarną wg standardu IEEE-754: SIMPLE_FLOAT, SIMPLE_DOUBLE podtypy powyższych, dostępne od Oracle11g, brak NULL i kontroli przepełnienia, wyższa wydajność przy kompilacji natywnej. VARCHAR2 ciąg znaków kodowany zestawem znaków domyślnym dla bazy, maks. długość 32676B, długość podajemy w bajtach lub znakach: v_s1 VARCHAR2(1000 BYTE); v_s2 VARCHAR2(1000 CHAR); pominięcie BYTE i CHAR długość wyrażona w jednostkach określonych przez parametr sesji NLS_LENGTH_SEMANTICS SELECT value FROM nls_session_parameters WHERE parameter = 'NLS_LENGTH_SEMANTICS'; Uwaga! VARCHAR2 w SQL przechowuje maks. 4000B NVARCHAR2 ciąg znaków kodowany w wielobajtowym Unicode, może wykorzystywać inny zestaw znaków niż domyślny dla bazy 19 20

Ciągi znaków zmiennej długości w PL/SQL (2) Ciągi znaków stałej długości w PL/SQL (1) Synonimy: VARCHAR2: CHAR VARYING, CHARACTER VARYING, STRING, VARCHAR NVARCHAR2: NATIONAL CHAR VARYING, NCHAR VARYING, NATIONAL CHARACTER VARYING Uwaga! W Oracle pusty ciąg znaków jest równy NULL. Jest to sprzeczne ze standardem języka SQL. v_ciag VARCHAR2(10); v_zmienna BOOLEAN; v_ciag := ''; v_zmienna := v_ciag IS NULL; -- v_zmienna = true v_ciag := NULL; v_zmienna := v_ciag IS NULL; -- v_zmienna = true CHAR ciąg znaków kodowany zestawem znaków domyślnym dla bazy, maks długość. 32676B, długość podajemy w bajtach lub znakach: v_s1 CHAR(100 BYTE); v_s2 CHAR(100 CHAR); v_s3 CHAR; pominięcie BYTE i CHAR długość wyrażona w jednostkach określonych przez parametr sesji NLS_LENGTH_SEMANTICS, pominięcie długości długość ciągu = 1, niewykorzystane pozycje dopełniane spacjami z prawej strony, Uwaga! CHAR w SQL przechowuje maks. 2000B (255B w wersjach przed Oracle8i), NCHAR ciąg znaków kodowany w wielobajtowym Unicode, może korzystać z innego zestawu znaków niż domyślny dla bazy 21 22 Ciągi znaków stałej długości w PL/SQL (2) ROWID i UROWID (1) Synonimy: CHAR: CHARACTER NCHAR: NATIONAL CHARACTER, NATIONAL CHAR Typy dla zmiennych przechowujących adresy rekordów relacji. ROWID typ dla adresu rekordu "zwykłych" relacji Oracle (implementowanych za pomocą sterty). UROWID ang. Universal ROWID typ dla adresów rekordów wszystkich rodzajów relacji, zarówno zwykłych jak i zewnętrznych, zorganizowanych jak indeks, obcych (np. z IBM DB2 dostępnych przez bramę). Użycie adresu rekordu może znacznie przyspieszyć operacje w programie PL/SQL. Uwaga! Adres rekordu może ulec zmianie! 23 24

ROWID i UROWID (2) Podtypy v_adres UROWID; v_placa pracownicy.placa_pod%type; SELECT ROWID, placa_pod INTO v_adres, v_placa FROM pracownicy WHERE nazwisko = 'HAPKE'; 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 ]; -- obliczenia nowej płacy, wynik w v_placa UPDATE pracownicy SET placa_pod = v_placa WHERE ROWID = v_adres; SUBTYPE TDataUr IS DATE NOT NULL; SUBTYPE TPieniadze IS NUMBER(9,2);... v_moje_urodziny TDataUr; v_moja_pensja TPieniadze; 25 26 Interakcja z użytkownikiem (1) Interakcja z użytkownikiem (2) Pobieranie informacji od użytkownika zmienne podstawienia. Przykład: v_zmienna := &zmienna_podstawienia; SET SERVEROUTPUT ON Wypisywanie informacji na konsoli procedura PUT_LINE z pakietu DBMS_OUTPUT. DBMS_OUTPUT.PUT_LINE(ciąg_tekstowy); SQL*Plus lub isql*plus: ustaw zmienną SERVEROUTPUT na wartość ON przed wykonaniem programu. SET SERVEROUTPUT ON [SIZE rozmiar_bufora] 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); domyślny rozmiar bufora: 2 000, dopuszczalne wartości: <2 000, 1 000 000> Oracle SQL Developer: włącz konsolę 27 28

Struktury kontrolne Instrukcja warunkowa IF-THEN-ELSE SELEKCJA ITERACJA SEKWENCJA WARUNEK WARUNEK T N N T IF warunek THEN IF warunek THEN ELSE 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 ELSE 29 30 Przykład instrukcji warunkowej Przed wykonaniem ćwiczenia ustaw zmienną środowiska SQL*Plus: 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!'; ELSE v_hello := v_hello 'universe!'; DBMS_OUTPUT.PUT_LINE(v_hello); Instrukcja wyboru wielokrotnego 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... ELSE polecenie n ; END CASE; CASE WHEN wyrażenie 1 THEN polecenie 1 ; WHEN wyrażenie 2 THEN polecenie 2 ; WHEN... ELSE polecenie n ; END CASE; 31 32

Przykład instrukcji CASE Pętla LOOP 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); 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. LOOP IF warunek THEN EXIT; LOOP EXIT WHEN warunek; 33 34 Przykład prostej pętli Pętla WHILE v_suma NUMBER := 0; v_i INTEGER := 0; c_koniec CONSTANT INTEGER := &koniec; LOOP 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); 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. 35 36

Przykład pętli WHILE Pętla FOR a NUMBER := &pierwsza_liczba; b NUMBER := &druga_liczba; WHILE (a!= b) LOOP IF (a > b) THEN a := a - b; ELSE b := b - a; DBMS_OUTPUT.PUT_LINE(' NWD = ' a); 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 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 37 38 Przykład pętli FOR Polecenie CONTINUE 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 is_prime := FALSE; IF (is_prime) THEN DBMS_OUTPUT.PUT_LINE(i ' jest liczba pierwsza'); Powoduje pominięcie bieżącej iteracji i przejście do następnej iteracji. Wersje: bezwarunkowa CONTINUE, warunkowa CONTINUE WHEN <warunek logiczny>. Dostępne w Oracle od wersji 11g. FOR i IN 1..100 LOOP CONTINUE WHEN mod(i, 2) = 1; DBMS_OUTPUT.PUT_LINE('Numer iteracji: ' to_char(i)); 39 40

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;... <<etykieta>> NULL; Etykieta musi poprzedzać polecenie wykonywalne GOTO nie może przeskakiwać do warunkowych części poleceń IF-THEN-ELSE, CASE, do polecenia LOOP i do bloku podrzędnego GOTO nie może wyskakiwać z podprogramu oraz procedury obsługi błędu v_tekst VARCHAR2(20); <<początek>> v_tekst := 'Ala '; GOTO ma; <<asa>> v_tekst := v_tekst 'asa '; GOTO drukuj; <<drukuj>> DBMS_OUTPUT.PUT_LINE(v_tekst); GOTO koniec; <<ma>> v_tekst := v_tekst 'ma '; GOTO asa; <<koniec>> NULL; 41 42