PL/SQL jest językiem proceduralnym, w którym można pisać programy przetwarzające dane w dowolny sposób. Pełną dokumentację języka można znaleźć na stronie Oracle. Dobrze też zajrzeć do materiałów na Ważniaku: ćwiczenia 11, ćwiczenia 12 i ćwiczenia 13.
Przed rozpoczęciem ćwiczeń należy wykonać polecenie:
SET SERVEROUTPUT ON;
Umożliwia ono wypisywanie użytkownikowi komunikatów na ekranie.
Blok kodu PL/SQL ma postać:
Składnia | Przykład |
---|---|
DECLARE
|
DECLARE
|
Sekcje DECLARE
i EXCEPTION
są
opcjonalne, więc najprostszy blok kodu ma postać:
Składnia | Przykład |
---|---|
BEGIN
|
BEGIN
|
Rodzaj | Składnia | Uwagi |
---|---|---|
Liczbowe |
DECIMAL
|
O typach w PL/SQL można poczytać tutaj. |
Znakowe |
CHAR
|
|
Logiczne |
BOOLEAN
|
Dodatkowo są zdefiniowane dwie stałe TRUE oraz FALSE .
|
Czasowe |
DATE
|
|
Złożone |
TYPE NazwaTypu IS RECORD (specyfikacja);
|
Np.
Do pól rekordu odwołujemy się za pomocją |
Typ wiersza |
zm tab%ROWTYPE;
|
Zmienna zm będzie typu rekordowego odpowiadającego pojedyńczemu wierszowi tabeli tab .
|
Typ kolumny |
zm tab.kol%TYPE;
|
Zmienna zm takiego samego typu jak dane w kolumnie kol tabeli tab .
|
Rodzaj instrukcji | Składnia | Przykład | Uwagi |
---|---|---|---|
Przypisanie |
zmienna := wartość;
|
x := 10;
|
|
Instrukcja warunkowa |
IF warunek1 THEN
|
IF ilosc > 50 THEN
|
|
Selekcja |
CASE wyrażenie
|
proc := CASE ptu
|
Sekcja ELSE jest opcjonalna.
|
Pętla WHILE |
WHILE warunek LOOP
|
WHILE licznik < 100 LOOP
|
|
Pętla FOR |
FOR licznik IN [REVERSE] od..do LOOP
|
FOR licz IN 1..ilosc LOOP
|
|
Instrukcja pusta |
NULL;
|
IF x > y THEN
|
|
Zgłoszenie wyjątku |
RAISE nazwa_wyjątku;
|
RAISE TOO_MANY_ROWS;
|
Listę predefiniowanych wyjątków można znaleźć tutaj. |
Obsługa wyjątku: |
BEGIN
|
DECLARE
|
|
Przypisanie danych z bazy na zmienną |
SELECT specyfikacja_kolumn
|
DECLARE
|
|
Modyfikacja bazy plus przypisanie |
INSERT INTO tabela
|
DECLARE
|
To samo można zrobić przy UPDATE i DELETE .
|
Kursory służą do przeglądania wyników zapytania wiersz po wierszu.
Konstrukcja | Składnia | Przykład | Uwagi |
---|---|---|---|
Podstawowy sposób pracy z kursorem |
DECLARE
|
DECLARE
|
Polecenie
Każde wywołanie
Ważne jest by pamiętać, by zamknąć
( |
Kursor parametryzowany |
CURSOR nazwa(lista parametrów) IS
|
DECLARE
|
Dodajemy klauzulę FOR UPDATE jeśli chcemy móc
modyfikować dane, na których działa kursor.
|
Pętla z kursorem |
FOR zmienna IN kursor LOOP
|
DECLARE
|
Zmiennej
Polecenie |
Iteracja po wynikach zapytania |
FOR zmienna IN (zapytanie) LOOP
|
FOR prac IN (SELECT imie,nazwisko
|
|
Modyfikacja danych, do których odwołuje się kursor |
UPDATE tabela SET kol = wart, ...
|
DECLARE
|
Kursor musi być zadeklarowny z klauzulą
Zmodyfikowany zostanie dokładnie ten wiersz, na który
wskazuje aktualnie kursor
Tej samej konstrukcji ( |
Atrybut | Opis |
---|---|
%ISOPEN
|
cur%ISOPEN ma wartość TRUE jeśli
kursor cur jest otwarty.
|
%FOUND
|
Prawda jeśli ostatnie pobranie (FETCH ) z
kursora powiodło się.
|
%NOTFOUND
|
Prawda jeśli ostatnie pobranie (FETCH ) z
kursora się nie powiodło.
|
%ROWCOUNT
|
cur%ROWCOUNT to liczba pobranych do tej pory
wierszy z kursora.
|
nazwisko
pracuje od
data_zatrudnienia
". Posłuż się poleceniem
FETCH
.
%ROWCOUNT
.
Napisz program, który wyświetli nazwiska wszystkich pracowników posiadających dany etat, o który spyta użytkownika. Zastosuj pętlę FOR z kursorem sparametryzowanym.
Uwaga: konstrukcja
DECLARE
spowoduje, że
zm VARCHAR2(20) := '&nazwa';
...
sqlplus
zapyta użytkownika o
wartość dla nazwa
przed wykonaniem programu.