Notatki
Pokaz slajdów
Konspekt
1
Rozdział 9
Język PL/SQL
Wprowadzenie
  • Koncepcja języka, zmienne i stałe, typy zmiennych, nadawanie wartości zmiennym, instrukcje warunkowe, pętle, sterowanie przebiegiem programu
2
Wprowadzenie do języka PL/SQL
  • 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


  • Za pomocą języka PL/SQL tworzy się
    • anonimowe bloki programu
    • procedury i funkcje składowane
    • pakiety
    • wyzwalacze bazy danych
3
Przykładowy program w PL/SQL
  • DECLARE
  • v_magazyn NUMBER(5);
  • BEGIN
  • 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);
  • ELSE
  • INSERT INTO historia_zakupow
  • VALUES (’Brak mleka UHT w magazynie’, SYSDATE);
  • END IF;
  • COMMIT;
  • END;
4
Struktura blokowa programu
  • 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
5
Zmienne
  • Zmienne proste (np. typu numerycznego, znakowego, daty)
  • Zmienne podtypu (np. zdefiniowanego przez użytkownika)
  • Zmienne złożone (np. rekordy, tablice, kolekcje, obiekty)
6
Zmienne rekordowe
  • 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
7
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
8
Atrybuty %TYPE, %ROWTYPE
  • Atrybut %TYPE zawiera typ innej zmiennej lub typ atrybutu w bazie danych.





  • 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.
9
Nadawanie wartości zmiennym
  • Nadanie wartości poprzez przypisanie











  • 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.


10
Nadanie wartości zmiennym (c.d.)
  • Nadanie wartości przez wczytanie danych z bazy danych do zmiennej poleceniem SELECT ... INTO ...





  • Nadanie wartości przez przekazanie zmiennej jako parametru typu IN OUT lub OUT do procedury lub funkcji





11
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)
12
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.
13
Typy danych
14
Typy danych - uwagi
  • Typy danych dostępne w PL/SQL nie odpowiadają dokładnie analogicznym typom dostępnym w SQL.


  • Typy BINARY_INTEGER i PLS_INTEGER: -231 ¸ 231. Ich podtypami są typy: POSITIVE, POSITIVEN, NATURAL, NATURALN i SIGNTYPE (-1, 0, 1).


  • Typ NUMBER: 10-130 ¸ 10125. Jego podtypami są typy: DECIMAL, INTEGER, FLOAT, REAL, NUMERIC.


  • Typy CHAR, VARCHAR2, RAW, LONG: 32767 bajtów


  • Typ BOOLEAN: TRUE, FALSE, NULL


15
Podtypy
  • 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.
16
Interakcja z użytkownikiem (1)
  • Pobieranie informacji od użytkownika – zmienne podstawienia.



  • Wypisywanie informacji na konsoli – procedura PUT_LINE z pakietu DBMS_OUTPUT.




    • ustaw zmienną SERVEROUTPUT narzędzia SQL*Plus na wartość ON przed wykonaniem programu.

17
Interakcja z użytkownikiem (2)
  • Przykład:


18
Struktury kontrolne
19
Instrukcja warunkowa IF-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.
20
Przykład instrukcji warunkowej
  • Przed wykonaniem ćwiczenia ustaw zmienną środowiska SQL*Plus:
  • SQL> SET SERVEROUTPUT ON SIZE 1000000
21
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)
22
Przykład instrukcji CASE
23
Pętla LOOP
  • 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.
24
Przykład prostej pętli
25
Pętla 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.







  • UWAGA!!!
  • Pamiętaj, aby w sekwencji operacji znalazło się polecenie, które zmieni warunek, w przeciwnym przypadku grozi pętla nieskończona.
26
Przykład pętli WHILE
27
Pętla 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 –231 ¸ 231






    • 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
28
Przykład pętli FOR
29
Polecenia sterujące GOTO i NULL
  • Polecenie GOTO bezwarunkowo przekazuje kontrolę wykonywania programu do miejsca wskazywanego przez etykietę związaną z poleceniem. Polecenie NULL nie wykonuje żadnej akcji.






    • 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
30
Przykład polecenia GOTO