[ Pobierz całość w formacie PDF ]
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.
10.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:
x 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);
x niejawnych - PL/SQL automatycznie tworzy kursor dla wszystkich pozostałych operacji.
47
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 wcz ci deklaracji bloku PL/SQL przez nazwanie go i
specyfikacj zapytania. Sposób deklaracji kursora pokazuje przykład:
'(&/$5(
&85625 SUDFBNXUVRU ,6 6(/(&7 QD]ZLVNR Z\G]LDá
)520 SUDFRZQLF\
:+(5( SáDFD !
%(*,1
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:
23(1 SUDFBNXUVRU
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:
)(7&+ SUDFBNXUVRU ,172 SUDFBQD]Z SUDFBZ\G]
Po zako czeniu pracy z kursorem konieczne jest poinformowanie o tym systemu w celu zwolnienia zasobów.
Dokonuje si tego rozkazem CLOSE, np.:
&/26( SUDFBNXUVRU
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:
x %NOTFOUND - TRUE, je li ostatni rozkaz FETCH zako czył si niepowodzeniem z powodu braku
wierszy
x %FOUND - TRUE, je li ostatni rozkaz FETCH zako czył si sukcesem
x %ROWCOUNT - liczba wierszy w kursorze (po otwarciu kursora)
x %ISOPEN - TRUE, je Å‚i kursor jest otwarty
Nast puj ce przykłady pokazuj sposób u ycia atrybutów kursora:
/223
)(7&+ SUDFBNXUVRU ,172 SUDFBQD]Z SUDFBZ\G]
,) SUDFBNXUVRU 52:&2817 ! 7+(1
ZLHFHM QL
(;,7 :+(1 SUDFBNXUVRU 127)281'
(1' /223
10.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:
'(&/$5(
&85625 SUDFBNXUVRU ,6
6(/(&7 QD]ZLVNR Z\G]LDO GDWDB]DWUXGQLHQLD
)520 SUDFRZQLF\
SUDFBUHN SUDFBNXUVRU 52:7
)(7&+ SUDFBNXUVRU ,172 SUDFBUHN
Rekord mo e być tworzony nie tylko za pomoc kursora, ale równie za pomoc nazwy tabeli w nast puj cy
sposób:
QD]ZDBUHNRUGX QD]ZDBWDEHOL 52:7
Rzeczywist deklaracj pokazuje przykład:
'(&/$5(
48
SUDFBUHN SUDFRZQLF\ 52:7
%(*,1
(1'
Dost p do pola rekordu mo liwy jest za pomoc nazwy tego rekordu i poprzedzonej kropk nazwy pola:
QD]ZDBUHNRUGX QD]ZDBSROD
Aby wi c dodać pojedyncze wynagrodzenie do sumy (przy u ycia zdefiniowanego wcze niej rekordu prac_rek)
mo na napisać:
VXPD VXPD SUDFBUHN SODFD
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:
QD]ZDBUHNRUGX QD]ZDBSROD SOVTOBZ\UD HQLH
U ycie tej konstrukcji ilustruje przykład:
SUDFBUHN QD]ZLVNR 833(5 SUDFBUHN QD]ZLVNR
Przypisanie zawarto ci całego mo liwe jest na dwa sposoby:
x przypisanie zawarto ci jednego rekordu do drugiego (deklaracje obu rekordów musz odwoływać si do
tego samego kursora lub tabeli;
x wstawienie warto ci do rekordu rozkazem SELECT ... INTO lub FETCH ... INTO
U ycie tych dwóch operacji ilustruje przykład:
'(&/$5(
SUDFBUHN SUDFRZQLF\ 52:7
SUDFBUHN SUDFRZQLF\ 52:7
%(*,1 [ Pobierz całość w formacie PDF ]
zanotowane.pl doc.pisz.pl pdf.pisz.pl szkicerysunki.xlx.pl
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.
10.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:
x 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);
x niejawnych - PL/SQL automatycznie tworzy kursor dla wszystkich pozostałych operacji.
47
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 wcz ci deklaracji bloku PL/SQL przez nazwanie go i
specyfikacj zapytania. Sposób deklaracji kursora pokazuje przykład:
'(&/$5(
&85625 SUDFBNXUVRU ,6 6(/(&7 QD]ZLVNR Z\G]LDá
)520 SUDFRZQLF\
:+(5( SáDFD !
%(*,1
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:
23(1 SUDFBNXUVRU
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:
)(7&+ SUDFBNXUVRU ,172 SUDFBQD]Z SUDFBZ\G]
Po zako czeniu pracy z kursorem konieczne jest poinformowanie o tym systemu w celu zwolnienia zasobów.
Dokonuje si tego rozkazem CLOSE, np.:
&/26( SUDFBNXUVRU
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:
x %NOTFOUND - TRUE, je li ostatni rozkaz FETCH zako czył si niepowodzeniem z powodu braku
wierszy
x %FOUND - TRUE, je li ostatni rozkaz FETCH zako czył si sukcesem
x %ROWCOUNT - liczba wierszy w kursorze (po otwarciu kursora)
x %ISOPEN - TRUE, je Å‚i kursor jest otwarty
Nast puj ce przykłady pokazuj sposób u ycia atrybutów kursora:
/223
)(7&+ SUDFBNXUVRU ,172 SUDFBQD]Z SUDFBZ\G]
,) SUDFBNXUVRU 52:&2817 ! 7+(1
ZLHFHM QL
(;,7 :+(1 SUDFBNXUVRU 127)281'
(1' /223
10.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:
'(&/$5(
&85625 SUDFBNXUVRU ,6
6(/(&7 QD]ZLVNR Z\G]LDO GDWDB]DWUXGQLHQLD
)520 SUDFRZQLF\
SUDFBUHN SUDFBNXUVRU 52:7
)(7&+ SUDFBNXUVRU ,172 SUDFBUHN
Rekord mo e być tworzony nie tylko za pomoc kursora, ale równie za pomoc nazwy tabeli w nast puj cy
sposób:
QD]ZDBUHNRUGX QD]ZDBWDEHOL 52:7
Rzeczywist deklaracj pokazuje przykład:
'(&/$5(
48
SUDFBUHN SUDFRZQLF\ 52:7
%(*,1
(1'
Dost p do pola rekordu mo liwy jest za pomoc nazwy tego rekordu i poprzedzonej kropk nazwy pola:
QD]ZDBUHNRUGX QD]ZDBSROD
Aby wi c dodać pojedyncze wynagrodzenie do sumy (przy u ycia zdefiniowanego wcze niej rekordu prac_rek)
mo na napisać:
VXPD VXPD SUDFBUHN SODFD
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:
QD]ZDBUHNRUGX QD]ZDBSROD SOVTOBZ\UD HQLH
U ycie tej konstrukcji ilustruje przykład:
SUDFBUHN QD]ZLVNR 833(5 SUDFBUHN QD]ZLVNR
Przypisanie zawarto ci całego mo liwe jest na dwa sposoby:
x przypisanie zawarto ci jednego rekordu do drugiego (deklaracje obu rekordów musz odwoływać si do
tego samego kursora lub tabeli;
x wstawienie warto ci do rekordu rozkazem SELECT ... INTO lub FETCH ... INTO
U ycie tych dwóch operacji ilustruje przykład:
'(&/$5(
SUDFBUHN SUDFRZQLF\ 52:7
SUDFBUHN SUDFRZQLF\ 52:7
%(*,1 [ Pobierz całość w formacie PDF ]