Podstawowa składnia
[
DECLARE
deklaracje (np. zmiennych, stałych)
]
BEGIN
polecenia programu
[
EXCEPTION
obsługa błędów
]
END;
Zmienne
Dostępne typy zmiennych:
- liczbowe: BINARY_INTEGER, DEC, DECIMAL, FLOAT, INT, INTGER, NATURAL, NUMBER, NUMERIC, PLS_INTEGER, POSITIVE, REAL, SMALLINT,
- znakowe: CHAR, CHARACTER, LONG, NCHAR, NVARCHAR2, RAW, STRING, VARCHAR, VARCHAR2,
- logiczne: BOOLEAN,
- czasowe: DATE, TIMESTAMP, INTERVAL,
- czasowe: DATE, TIMESTAMP, INTERVAL,
- wskaźnikowe: REF CURSOR, REF object_type
Przykaady deklaracji:
DECLARE
i NUMBER(10);
j INT := 10;
DATA DATE NOT NULL DEFAULT DATE '2007-01-01';
ok BOOLEAN NOT NULL DEFAULT FALSE;
s VARCHAR(100) := 'ala ma kota';
Zmienne złożone:
DECLARE
TYPE t_punkt IS RECORD (
x INT,
y INT
);
p1 t_punkt;
Dostęp do poszczególnych pól jak w Pascalu/C (czyli np. p1.x).
Atrybuty %TYPE i %ROWTYPE służą do sprawdzania typu określonych pól/wierszy w tabelach.
DECLARE
zmienna tabela.pole%TYPE;
wiersz tabela%ROWTYPE;
Stałe
DECLARE
nazwa CONSTANT typ := wartość;
Interakcja z użytkownikiem
Blok może zawierać zmienne podstawienia (czyli nazwy zmiennych poprzedzone znakiem '&'), przed uruchomieniem bloku użytkownik jest proszony o podanie wartości wszystkich zmiennych podstawieniowych.
s:=&abc;
i:=&identyfikator;
Do wypisywania komunikatów służy funkcja dbms_output.put_line()
dbms_output.put_line('i='||i||' s='||s);
Instrukcje warunkowe
Składnia polecania IF:
IF warunek THEN
polecenia
(
ELSIF warunek_x THEN
polecenia
)*
[
ELSE
polecenia
]
END IF;
Składnia polecania CASE:
CASE wyrażenie
WHEN wartość THEN polecenia1
WHEN wartość_2 THEN polecenia2
[
ELSE
polecenia
]
END [ CASE ];
CASE
WHEN warunek_1 THEN polecenia
WHEN warunek_2 THEN polecenia2
[
ELSE
polecenia
]
END [ CASE ];
Jeśli CASE jest traktowane jako wyra»enie to można kończyć ENDem, jeśli jako
polecenie to trzeba je zakończyć END CASE.
Pętle
Składnia polecenia LOOP:
LOOP
sekwencja
[ IF warunek THEN EXIT; END IF; ]
[ EXIT WHEN warunek ; ]
END LOOP;
Składnia polecania WHILE:
WHILE warunek LOOP
polecenia
END LOOP;
Składnia polecenia FOR:
FOR licznik IN [ REVERSE ] start..koniec LOOP
polecenia
END LOOP;
Nie jest konieczne definiowanie zmiennej licznik.
Różności
- instrukcja NULL (instrukcja która nic nie robi, wypełniacz pustych bloków),
Zapytania SQL w PL/SQL
SELECT lista pól INTO lista zmiennych FROM ... ;
INSERT INTO tabela (lista pól) VALUES (lista warto±ci);
INSERT INTO tabela VALUES zmienna_wierszowa;
/* pseudokolumna ROW */
UPDATE tabela SET row = zmienna_wierszowa;
Kursory
DECLARE
CURSOR nazwa [ (parametry) ] IS
{ zapytanie_sql | RETURN typ złożony }
[ FOR UPDATE [ OF lista pól ] ]
Przykłady:
DECLARE
CURSOR cur_osoby IS SELECT * FROM osoby;
CURSOR cur_osoby2 RETURN osoby%ROWTYPE;
CURSOR cur_wypozyczenia (p_pesel wypozyczenia%TYPE) IS
SELECT * FROM wypozycznia WHERE pesel=p_pesel;
Operacje na kursorach:
OPEN nazwa_kursora [ ( warto±ci parametrów) ];
FETCH nazwa_kursora INTO { lista_zmiennych | zmienna wierszowa } ;
CLOSE nazwa_kursora;
Atrybuty kursora:
%ISOPEN
%FOUND
%NOTFOUND
%ROWCOUNT
Pętle FOR z użyciem kursorów:
FOR { zmienna rekordowa | zmienna wierszowa } IN nazwa_kursora LOOP
polecenia
END LOOP;
Nie jest konieczne otwieranie lub zamykanie kursora. Nie jest równie» konieczne
definiowanie zmiennej licznikowej.
Pętle FOR z zapytaniem SQL:
FOR { zmienna rekordowa | zmienna wierszowa } IN ( zapytanie SQL ) LOOP
polecenia
END LOOP;
Kursor niejawny ma nazwę SQL (ostatnie wykonywane polecenie SELECT INTO,
INSERT, UPDATE, DELETE).
Obsługa wyjątków
DECLARE
wyj1 EXCEPTION;
wyj2 EXCEPTION;
BEGIN
polecenia ...
RAISE wyjątek;
EXCEPTION
WHEN wyj1 THEN
polecenia1
WHEN wyj2 THEN
polecenia2
[ WHEN OTHERS THEN
polecenia.. ]
END;
Predefiniowane wyjątki:
CASE_NOT_FOUND
CURSOR_ALREADY_OPEN
DUP_VAL_ON_INDEX
INVALID_CURSOR
NO_DATA_FOUND
TOO_MANY_ROWS
VALUE_ERROR
ZERO_DIVIDE
Przydatne informacje:
- polecenie set serveroutput on aktywuje wypisywanie komunikatów przez funkcję put_line,
Ćwiczenie. Wypisz przy użyciu PL/SQLa bieżącą datę i godzinę
Ćwiczenie. Oblicz 15-tą liczbę Fibonacciego.
Ćwiczenie. Zmodyfikuj poprzednie rozwiązanie, tak by użytkownik mógł wskazywać która liczbę fibonacciego należy obliczyć.
Ćwiczenie. Wypisz reprezentację słowną liczby podanej przez użytkownika (jeśli liczba nie będzie z zakresu 0..99, możesz wypisać komunikat o błędzie).
Ćwiczenie. Wypisz liczbę wierszy w tabeli ksiazki.
Ćwiczenie. Dla każdej tabeli zdefiniowanej w bazie danych, wpisz jej nazwę i liczbę wierszy (wskazówka: użyj widoku systemowego USER_TABLES lub tabeli ALL_TABLES)
Ćwiczenie. Wypisz dla każdej książki jej najdłuższy czas wypożyczenia.
Ćwiczenie. Sprawdź czy w bazie istnieje czytelnik o numerze pesel 999 i jeśli brak takiej osoby dodaj wiersz z jej opisem.
Ćwiczenie. Wyświetl trzy najczęściej wypożyczne książki (jeśli jest wiele książek o tej samej liczbie wypożyczeń, posortuj wyniki wg. tytułu). Wskazówka: uwzględnij atrybut %ROWCOUNT.
Ćwiczenie. Sprawdź czy istnieje książka o numerze ewidecyjnym 15. Użyj obsługi wyjątków.