PL_SQL 5.pdf

(303 KB) Pobierz
7.04.2015
PL/SQL
Wykład 5
Programowanie aplikacji baz danych 
po stronie serwera ­ PL/SQL
 
Streszczenie
Na kolejnych dwóch wykładach zostanie przedstawione podstawowe narzędzie
używane w Oracle przy tworzeniu oprogramowania aplikacji na serwerze,
mianowicie rozszerzenie języka SQL o elementy języka programowania – język
PL/SQL. Podobny język jest określony w nowym Standardzie SQL:1999. Nosi on
tam nazwę SQL/PSM.
W tym wykładzie omówimy bloki PL/SQL, które stanowią podstawowe składniki
kodu używanego w procedurach, funkcjach, pakietach i wyzwalaczach (będące
tematami następnego wykładu).
 
5.1 Blok PL/SQL
Język PL/SQL jest proceduralnym rozszerzeniem języka SQL i stanowi podstawę
do pisania aplikacji Oracle – jest mianowicie dostępny w różnych programach
narzędziowych ORACLE, jak np. SQL*Plus, Oracle*Forms czy Oracle*Reports,
prekompilatory, procedury, wyzwalacze, aplikacje internetowe.
 Odpowiednikiem konstrukcji bloku (i programu) występujących w językach
programowania jest w PL/SQL blok PL/SQL nazywany też blokiem anonimowym.
Ma on następującą składnię:
 
DECLARE
   deklaracje obiektów PL/SQL jak zmienne, stałe, wyjątki, procedury, funkcje
BEGIN
   ciąg instrukcji do wykonania
EXCEPTION
   obsługa wyjątków (błędów)
END;
 
Deklaracje i obsługa wyjątków są opcjonalne. Bloki mogą być zagnieżdżone.
Jedynymi instrukcjami języka SQL, które mogą się pojawić w bloku PL/SQL, są
http://edu.pjwstk.edu.pl/wyklady/sbd/scb/w5.htm
1/19
7.04.2015
PL/SQL
instrukcje SELECT, INSERT, UPDATE, DELETE, COMMIT i ROLLBACK.
Wprowadzając blok PL/SQL przy użyciu programu SQL*Plus, należy:
blok zakończyć kropką znajdującą się na osobnej linii ­ w celu wpisania go
do bufora bieżącej instrukcji;
bądź znakiem 
/
 znajdującym się na osobnej linii ­ w celu wpisania go do
bufora bieżącej instrukcji i wykonania.
Wykonanie instrukcji w buforze bieżącej instrukcji (instrukcji SQL lub bloku
PL/SQL) realizujemy poprzez podanie znaku 
/
 na osobnej linii. Instrukcje samego
SQL*Plus nie są wpisywane do bufora.
Przykład
W poniższym bloku jest oprogramowana transakcja sprzedaży samochodu marki
Fiat. Gdy w magazynie jest brak informacji o takiej marce samochodu,
podnoszony jest błąd, który jest następnie obsługiwany w sekcji wyjątków
poprzez wpisanie odpowiedniej informacji do tablicy dziennika błędów.
DECLARE
  ilość NUMBER(5);
BEGIN
  SELECT m.Stan INTO ilość FROM Magazyn m
  WHERE m.Produkt = 'Fiat';
  /* Gdy w kolumnie Produkt tabeli Magazyn nie ma wartości 'Fiat' jest
podnoszony wyjątek o nazwie no_data_found. */
  IF ilość> 0 THEN
    UPDATE Magazyn SET Stan = Stan ‐ 1
    WHERE Produkt = 'Fiat';
    INSERT INTO Zakupy
    VALUES ('Kupiono Fiata', Sysdate);
  ELSE
    INSERT INTO Zakupy
    VALUES ('Brak Fiatów', Sysdate);
  END IF;
  COMMIT;
EXCEPTION ‐‐ Początek sekcji wyjątków
WHEN no_data_found THEN
   INSERT INTO dziennik_błędów
   VALUES ('Nie znaleziono produktu FIAT');
END;
http://edu.pjwstk.edu.pl/wyklady/sbd/scb/w5.htm
2/19
7.04.2015
PL/SQL
/
Proszę zwrócić uwagę na zamieszczanie komentarzy w kodzie:
albo między nawiasami /* i */  albo
od dwóch kresek ­­ do końca bieżącej linii.
 
Deklaracje zmiennych i stałych
Deklaracja zmiennej ma następującą postać:
 
identyfikator typ_danych [NOT NULL] [ := wyrażenie];
 
Opcjonalna część 
:= wyrażenie
 umożliwia inicjalizację wartości zmiennej – w
przeciwnym razie zmiennej jest przypisywane NULL. 
Deklaracja stałej ma następującą postać:
 
identyfikator CONSTANT typ_danych [NOT NULL] [ := wyrażenie];
Oto przykłady:
zarobki NUMBER(7,2);
pi CONSTANT NUMBER(7,5) := 3.14159;
nazwisko VARCHAR2(25) := 'Kowalski';
data DATE := Sysdate;
żonaty BOOLEAN := False;
liczba_dzieci BINARY_INTEGER :=0;
Do inicjalizacji wartości zmiennej zamiast operatora := można użyć klauzuli
DEFAULT – używa się jej, gdy zmienna ma charakterystyczną wartość, np.
Data DATE DEFAULT Sysdate;
Zauważmy, że deklaracji zmiennych tego samego typu nie można łączyć razem
jak w innych językach!
http://edu.pjwstk.edu.pl/wyklady/sbd/scb/w5.htm
3/19
7.04.2015
PL/SQL
W PL/SQL są dostępne typy danych z języka SQL, a ponadto kilka innych, z
których najważniejsze to typ BOOLEAN wartości logicznych i typ
BINARY_INTEGER liczb całkowitych – niezależny od podtypów typu NUMBER i
przez to wymagający przy zapisie mniej pamięci.
Nie należy nadawać tej samej nazwy zmiennej co kolumnie w tabeli. Zmienne i
stałe PL/SQL mogą występować w instrukcjach SQL, tak jak stałe SQL i kolumny.
 
Wprowadzanie danych z klawiatury i wypisywanie wyników na ekran
Oprócz zmiennych deklarowanych w bloku PL/SQL mogą występować jeszcze
zmienne z aplikacji korzystającej z bloku PL/SQL ­ poprzedza się je dwukropkiem
(:zmienna) i nazywa się zmiennymi wiązania. Mogą również występować
zmienne podstawienia SQL*Plus (&zmienna) ­ ale tylko w wyrażeniach i nigdy po
lewej stronie w instrukcji przypisania.
Przy testowaniu i uruchamianiu aplikacji składających się z kodu PL/SQL
wygodnie jest pobierać dane do testowania z klawiatury i wypisywać
informacje o przebiegu obliczeń na ekran. Realizuje się to w następujący sposób.
Po ustawieniu w SQL*Plus:
SET SERVEROUTPUT ON
w bloku PL/SQL może wystąpić instrukcja:
DBMS_OUTPUT.Put_line(wyrażenie_napisowe);
Oto skrypt SQL*Plus obejmujący wprowadzanie przez użytkownika wartości do
bloku PL/SQL ­ za pomocą zmiennej podstawienia 
rocz_zarob
, a następnie
wypisywanie wyniku na ekran ­ za pomocą procedury 
DBMS_OUTPUT.Put_line
. Należy
pamiętać, ze w celu uruchomienia skryptu należy go najpierw zapisać w pliku, a
następnie wywołać go w SQL*Plus przy użyciu instrukcji start.
SET SERVEROUTPUT ON
ACCEPT rocz_zarob PROMPT 'Podaj roczne zarobki: '
DECLARE
mies NUMBER(9,2) := &rocz_zarob;
BEGIN
  mies := mies/12;
  DBMS_OUTPUT.PUT_LINE ('Miesięczne zarobki = ' ||mies);
END;
/
http://edu.pjwstk.edu.pl/wyklady/sbd/scb/w5.htm
4/19
7.04.2015
PL/SQL
Nie możemy użyć tego skryptu w iSQL*Plus, bo nie obsługuje on instrukcji
ACCEPT. Na szczęście opuszczenie instrukci ACCEPT też prowadzi do
satysfakcjonującego rezultatu. Dlaczego?
Zamiast zmiennych podstawienia można użyć zmiennych wiązania z SQL*Plus,
np.
ACCEPT rocz_zarob PROMPT 'Podaj roczne zarobki: '
VARIABLE mies NUMBER
BEGIN
  :mies := &rocz_zarob/12;
END;
/
PRINT Mies
Zmienne systemowe
Jest pewna liczba zmiennych zadeklarowanych w systemie, z których można
korzystać w kodzie PL/SQL (ale nie w SQL) – ich wartości dotyczą ostatnio
wykonanej instrukcji SQL.
SQL%ROWCOUNT
           liczba wierszy przetworzonych przez ostatnią instrukcję
SQL;
SQL%FOUND=True
       jeśli został znaleziony (przetworzony) przynajmniej jeden
wiersz;
SQL%NOTFOUND=True
  jeśli nie znaleziono (przetworzono) żadnego wiersza;
SQLERRM
                  tekstowa informacja o błędzie;
SQLCODE
                  kod błędu.
Obu zmiennych SQLERRM i SQLCODE można używać tylko w sekcji EXCEPTION.
Przykład użycia zmiennej SQL%ROWCOUNT (do obliczenia liczby usuwanych
działów o numerze 50) przedstawia następujący blok:
DECLARE usunięte NUMBER;
BEGIN
  DELETE FROM Dept WHERE Deptno = 50;
  usunięte := SQL%ROWCOUNT;
  INSERT INTO dziennik VALUES ('Dział', usunięte, Sysdate);
END;
/
http://edu.pjwstk.edu.pl/wyklady/sbd/scb/w5.htm
5/19
Zgłoś jeśli naruszono regulamin