Laboratorium 5: SQL PLUS

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.