do ÂściÂągnięcia - pobieranie - ebook - pdf - download
Podstrony
- Strona Główna
- Charlene Roberts [Art of Love] A Gentleman's Savior [EC Voyager] (pdf)
- Robert M. Howard Getting a Poor Return, Courts, Justice, and Taxes (2009)
- Roberts Nora Irlandzka trylogia 01 Klejnoty słońca
- Jordan_Robert_ _Kolo_Czasu_t_2_cz_2_ _Kamien_lzy
- Roberts_Alison_ _Jedyny_w_swoim_rodzaju
- Alarm dla Polski Jerzy Robert Nowak
- Heinlein, Robert A And He Built a Crooked House
- Haasler Robert Zbrodnie w imieniu Chrystusa
- Heinlein, Robert A Citizen of the Galaxy
- Brzechwa Pan Kleks 01 Akademia pana Kleksa
- zanotowane.pl
- doc.pisz.pl
- pdf.pisz.pl
- moje-waterloo.xlx.pl
[ Pobierz całość w formacie PDF ]
Zadaniem funkcji jest obliczenie wartości. Definicja funkcji jest taka sama jak
procedury z tym wyjątkiem, że funkcja posiada klauzulę RETURN.
FUNCTION name [ (argument [, argument] ... ) ]
RETURN datatype IS
[local declarations]
BEGIN
executable statements
[EXCEPTION
exception handlers]
END [name];
Wewnątrz funkcji musi pojawić się przynajmniej jeden rozkaz RETURN. Rozkaz
RETURN natychmiast kończy wykonanie funkcji i zwraca sterowanie do modułu
wywołującego. W przypadku funkcji musi wystąpić przynajmniej jeden rozkaz RETURN,
w którym musi być wyrażenie. Wynik tego wyrażenia musi mieć taki typ jak podany w
nagłówku. Jeśli funkcja nie kończy się rozkazem RETURN, to PL/SQL zgłosi
odpowiedni wyjątek. W przypadku procedury rozkaz RETURN nie może zawierać
żadnego wyrażenia.
6.4. Kursory
W celu wykonania rozkazu SQL system tworzy pewien obszar roboczy nazywany
przestrzeniÄ… kontekstu. W przestrzeni tej przechowywane sÄ… informacje konieczne do
wykonania rozkazu. PL/SQL pozwala nazwać przestrzeń kontekstu i odwoływać się do
zawartych w niej danych za pomocą mechanizmu nazywanego kursorem. PL/SQL używa
dwóch typów kursorów:
68
Bazy danych Robert Chwastek
jawnych - użytkownik może w sposób jawny utworzyć kursor dla zapytań, których
wynikiem jest wiele wierszy i wykonywać operacje na tych wierszach (najczęściej za
pomocÄ… rozkazu FOR);
niejawnych - PL/SQL automatycznie tworzy kursor dla wszystkich pozostałych
operacji.
Jeśli zapytanie zwraca wiele wierszy, to możliwe jest utworzenie kursora, który
będzie umożliwiał dostęp do pojedynczych wierszy ze zwracanej listy. Kursor definiuje
się w części deklaracji bloku PL/SQL przez nazwanie go i specyfikację zapytania. Sposób
deklaracji kursora pokazuje przykład:
DECLARE
FROM pracownicy
...
BEGIN
...
Sama deklaracja nie powoduje wykonania występującego w niej zapytania. Do tego
konieczne jest otwarcie kursora, którego można dokonać instrukcją OPEN w następujący
sposób:
OPEN prac_kursor;
W celu odczytania pojedynczego wiersza z kursora konieczne jest następnie użycie
rozkazu FETCH. Każdy kolejny rozkaz FETCH dla danego kursora powoduje odczytanie
kolejnego wiersza. Rozkaz FETCH może być użyty w następujący sposób:
FETCH prac_kursor INTO prac_nazw, prac_wydz;
Po zakończeniu pracy z kursorem konieczne jest poinformowanie o tym systemu w
celu zwolnienia zasobów. Dokonuje się tego rozkazem CLOSE, np.:
CLOSE prac_kursor;
Każdy kursor posiada pewne atrybuty, których wartości informują o jego stanie.
Nazwy atrybutów poprzedzone są znakiem % i wpisywane bezpośrednio po nazwie
kursora. Zdefiniowano następujące atrybuty kursorów:
%NOTFOUND - TRUE, jeśli ostatni rozkaz FETCH zakończył się niepowodzeniem z
powodu braku wierszy
%FOUND - TRUE, jeśli ostatni rozkaz FETCH zakończył się sukcesem
%ROWCOUNT - liczba wierszy w kursorze (po otwarciu kursora)
%ISOPEN - TRUE, jeśłi kursor jest otwarty
Następujące przykłady pokazują sposób użycia atrybutów kursora:
LOOP
FETCH prac_kursor INTO prac_nazw, prac_wydz;
IF prac_kursor%ROWCOUNT > 10 THEN
...
EXIT WHEN prac_kursor%NOTFOUND;
...
END LOOP;
69
Bazy danych Robert Chwastek
6.5. Rekordy
W języku PL/SQL rekordem nazywana jest zmienna złożona, będąca grupą
zmiennych elementarnych. Każda zmienna elementarna w rekordzie nazywana jest polem.
Rekordy są używane najczęściej do przechowywania zawartości pojedynczego wiersza w
bazie danych. PL/SQL pozwala definiować rekordy odpowiadające pojedynczym
wierszom w tabeli, widoku lub kursorze, nie pozwala jednak na definiowanie typów
poszczególnych pól.
Deklarowanie rekordu najlepiej jest wyjaśnić na przykładzie. Jeśli wystąpiła
deklaracja kursora w tabeli pracownicy, który zwraca nazwisko, wydział i datę
zatrudnienia, to możliwe jest zadeklarowanie odpowiedniego rekordu za pomocą atrybutu
%ROWTYPE:
DECLARE
CURSOR prac_kursor IS
SELECT nazwisko, wydzial, data_zatrudnienia
FROM pracownicy;
prac_rek prac_kursor%ROWTYPE
...
FETCH prac_kursor INTO prac_rek;
Rekord może być tworzony nie tylko za pomocą kursora, ale również za pomocą
nazwy tabeli w następujący sposób:
nazwa_rekordu nazwa_tabeli%ROWTYPE;
Rzeczywistą deklarację pokazuje przykład:
DECLARE
prac_rek pracownicy%ROWTYPE;
...
BEGIN
...
END;
Dostęp do pola rekordu możliwy jest za pomocą nazwy tego rekordu i poprzedzonej
kropkÄ… nazwy pola:
nazwa_rekordu.nazwa_pola;
Aby więc dodać pojedyncze wynagrodzenie do sumy (przy użycia zdefiniowanego
wcześniej rekordu prac_rek) można napisać:
suma := suma + prac_rek.placa;
Możliwe jest przypisanie wartości do pola rekordu lub rekordu jako całości. Należy
jednak pamiętać, że rekord jest zmienną i zmiana wartości jego pól nie powoduje zmiany
wartości odpowiedniego wiersza w bazie danych.
Przypisania wartości do pola rekordu można dokonać za pomocą operatora
przypisania := w następujący sposób:
Użycie tej konstrukcji ilustruje przykład:
prac_rek.nazwisko := UPPER(prac_rek.nazwisko);
Przypisanie zawartości całego możliwe jest na dwa sposoby:
przypisanie zawartości jednego rekordu do drugiego (deklaracje obu rekordów muszą
odwoływać się do tego samego kursora lub tabeli;
70
Bazy danych Robert Chwastek
wstawienie wartości do rekordu rozkazem SELECT ... INTO lub FETCH ... INTO
Użycie tych dwóch operacji ilustruje przykład:
DECLARE
prac_rek1 pracownicy%ROWTYPE;
prac_rek2 pracownicy%ROWTYPE;
BEGIN
SELECT nazwisko, imie, wydzial, placa_podstawowa
INTO prac_rek1 FROM pracownicy
WHERE wydzial = 30;
prac_rek2 := prac_rek1;
...
END;
PL/SQL niejawnie deklaruje rekord w pętli FOR dla kursora. Sytuację tę ilustruje
przykład:
DECLARE
CURSOR prac_kursor IS
SELECT nazwisko, imie, wydzial, placa_podstawowa
FROM pracownicy;
BEGIN
FOR pracownik IN prac_kursor LOOP
suma := suma + pracownik.placa_podstawowa;
...
END LOOP;
Niejawnie deklarowanym rekordem jest tu zmienna o nazwie pracownik. Zmienna ta jest
automatycznie deklarowana tak, jakby wystąpiła jawna deklaracja postaci
nazwa_kursora%ROWTYPE.
6.6. Obsługa błędów
6.6.1. Informacje podstawowe
Błędy podczas wykonania programu powodowane są wieloma różnymi
przyczynami. Wśród nich można wymienić następujące: błędy projektowe, błędy
kodowania, uszkodzenia sprzętu, niewłaściwe dane itp. Nie jest możliwe przewidzenie
wszystkich możliwych błędów, można jednak zaplanować obsługę niektórych z nich. W
starszkych językach programowania błąd taki jak Przepełnienie stosu powodował
zgłoszenie komunikatu i zakończenie wykonania programu. W nowoczesnych językach
(C , Java, PL/SQL) zmieniło się podejście do obsługi błędów. Języki te udostępniają
bowiem mechanizm nazywany obsługą wyjątków, który pozwala zdefiniować akcję
wywoływaną w momencie wystąpienia błędu i dalej kontynuować wykonanie programu.
Wyjątkiem nazywamy spełnienie warunków wystąpienia błędów. Wyjątki dzielą się
na predefiniowane (przez twórców języka) i definiowane przez użytkownika. Przykładami
wyjątków predefiniowanych mogą być: Out of memory , Division by zero . W języku
PL/SQL użytkownik może definiować wyjątki w części deklaracyjnej bloku PL/SQL.
71
Bazy danych Robert Chwastek
[ Pobierz całość w formacie PDF ]