Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Oracle8.
Programowanie
w jzyku PL/SQL
Autor: Scott Urman
Tumaczenie: Tomasz Pdziwiatr, Grzegorz Stawikowski,
Cezary Welsyng
ISBN: 83-7197-533-3
Tytu oryginau: Oracle8 PL/SQL Programming
Format: B5, stron: 762
Wykorzystanie wbudowanego w system Oracle jzyka PL/SQL w znaczcy sposb
powiksza potencja programisty systemw bazodanowych. PL/SQL czy w sobie due
moliwoci i elastyczno jzyka czwartej generacji (4GL) SQL z konstrukcjami
proceduralnymi jzyka trzeciej generacji (3GL). Programy napisane w tym jzyku
umoliwiaj obsug danych zarwno w samym systemie Oracle, jak i w zewntrznych
aplikacjach.
Ksika Oracle8. Programowanie w jzyku PL/SQL to wyczerpujce omwienie jzyka
PL/SQL. To doskonaa pozycja uatwiajca nauk tego jzyka, wietnie te sprawdza
si jako podrczne kompendium wiedzy o PL/SQL, pomocne w codziennej pracy.
Liczne przykady uzupeniaj informacje zawarte w ksice pokazujc sprawdzone
metody rozwizywania problemw, napotykanych przez programistw.
W ksice omwiono midzy innymi:
Podstawy jzyka PL/SQL: struktura programu, zmienne, typy, wyraenia
i operatory oraz instrukcje sterujce
Korzystanie z rekordw i tabel
Korzystanie z SQL z poziomu PL/SQL, funkcje SQL dostpne w PL/SQL
Tworzenie i uywanie kursorw
Bloki w PL/SQL: podprogramy (procedury i funkcje), pakiety i wyzwalacze
Metody obsugi bdw w PL/SQL
Obiekty w PL/SQL, kolekcje
Testowanie i wykrywanie bdw
Zagadnienia zaawansowane: dynamiczny PL/SQL, komunikacja midzy sesjami,
kolejkowanie, obsuga zada, procedury zewntrzne
Optymalizacja aplikacji PL/SQL i metody zapewnienia maksymalnej wydajnoci
Ksika jest przeznaczona zarwno dla dowiadczonych programistw, jak i tych,
ktrzy jeszcze nie poznali innych jzykw trzeciej generacji. Przydatna, cho
niekonieczna, jest oglna znajomo systemu Oracle (czenie si i korzystanie z bazy
danych, podstawy jzyka SQL, itp.).
Spis treci
Wstp ...................................................................................................17
Rozdzia 1. Wprowadzenie do PL/SQL......................................................................23
Dlaczego jzyk PL/SQL?..........................................................................................................23
Model klient-serwer............................................................................................................25
Normy .................................................................................................................................26
Waciwoci jzyka PL/SQL ....................................................................................................26
Struktura bloku ...................................................................................................................26
Zmienne i typy danych .......................................................................................................27
Konstrukcje ptlowe ...........................................................................................................28
Konwencje stosowane w niniejszej ksice..............................................................................30
Wersje jzyka PL/SQL oraz bazy danych Oracle...............................................................30
Dokumentacja Oracle .........................................................................................................31
Kod dostpny na pycie CD................................................................................................32
Przykadowe tabele ...................................................................................................................32
Podsumowanie ..........................................................................................................................38
Spis treci
INITCAP...........................................................................................................................123
LOWER ............................................................................................................................123
LPAD................................................................................................................................124
LTRIM..............................................................................................................................125
NLS_INITCAP .................................................................................................................125
NLS_LOWER...................................................................................................................126
NLS_UPPER ....................................................................................................................126
REPLACE.........................................................................................................................127
RPAD................................................................................................................................128
RTRIM..............................................................................................................................128
SOUNDEX .......................................................................................................................129
SUBSTR ...........................................................................................................................130
SUBSTRB.........................................................................................................................131
TRANSLATE ...................................................................................................................131
UPPER..............................................................................................................................132
Funkcje znakowe zwracajce wartoci liczbowe....................................................................133
ASCII................................................................................................................................133
INSTR...............................................................................................................................133
INSTRB ............................................................................................................................134
LENGTH ..........................................................................................................................135
LENGTHB........................................................................................................................135
NLSSORT.........................................................................................................................136
Funkcje numeryczne ...............................................................................................................136
ABS...................................................................................................................................136
ACOS................................................................................................................................137
ASIN .................................................................................................................................137
ATAN ...............................................................................................................................138
ATAN2 .............................................................................................................................138
CEIL .................................................................................................................................139
COS...................................................................................................................................139
COSH................................................................................................................................140
EXP...................................................................................................................................140
FLOOR .............................................................................................................................140
LN .....................................................................................................................................141
LOG ..................................................................................................................................141
MOD .................................................................................................................................142
POWER ............................................................................................................................142
ROUND ............................................................................................................................143
SIGN .................................................................................................................................143
SIN....................................................................................................................................144
SINH .................................................................................................................................144
SQRT ................................................................................................................................144
TAN ..................................................................................................................................145
TANH ...............................................................................................................................145
TRUNC.............................................................................................................................146
Funkcje zwizane z dat .........................................................................................................146
ADD_MONTHS...............................................................................................................146
LAST_DAY......................................................................................................................147
MONTHS_BETWEEN ....................................................................................................147
NEW_TIME .....................................................................................................................148
NEXT_DAY .....................................................................................................................149
ROUND ............................................................................................................................149
SYSDATE ........................................................................................................................150
TRUNC.............................................................................................................................151
Spis treci
Rozdzia 9. Wyzwalacze.........................................................................................265
Tworzenie wyzwalaczy...........................................................................................................265
Komponenty wyzwalacza.................................................................................................267
Wyzwalacze i sownik danych..........................................................................................270
Kolejno uruchamiania wyzwalaczy...............................................................................272
Stosowanie wartoci :old oraz :new w wyzwalaczach na poziomie wiersza ...................273
Korzystanie z predykatw wyzwalacza: INSERTING, UPDATING oraz DELETING.....276
Tabele mutujce ......................................................................................................................278
Przykad tabeli mutujcej .................................................................................................280
Rozwizanie problemu bdu tabeli mutujcej.................................................................281
PL/SQL w dziaaniu wdraanie techniki kaskadowego uaktualniania ..............................283
Program narzdziowy kaskadowego uaktualniania..........................................................285
Dziaanie pakietu kaskadowego uaktualniania.................................................................288
Podsumowanie ........................................................................................................................292
10
Spis treci
11
OCI ...................................................................................................................................389
Program SQL-Station .......................................................................................................392
Mechanizm PL/SQL po stronie klienta...................................................................................396
Przyczyny wykorzystywania mechanizmu PL/SQL po stronie klienta............................396
Program Oracle Forms......................................................................................................397
Program Procedure Builder ..............................................................................................399
Wrapper PL/SQL ....................................................................................................................401
Wykonanie wrappera ........................................................................................................401
Pliki wejcia i wyjcia ......................................................................................................402
Sprawdzanie syntaktyki i semantyki ................................................................................402
Wytyczne dla programu wrapper......................................................................................403
Podsumowanie ........................................................................................................................403
12
Przykad ............................................................................................................................463
Zastosowanie parametru out_value_size ..........................................................................465
PL/SQL w dziaaniu wykonywanie dowolnych procedur skadowanych .........................466
Udoskonalenia pakietu DBMS_SQL w wydaniu PL/SQL 8.0 ...............................................472
Parsowanie duych cigw znakw instrukcji SQL.........................................................473
Przetwarzanie tablicowe za pomoc pakietu DBMS_SQL ..............................................474
Opisywanie listy instrukcji SELECT................................................................................478
Rne procedury .....................................................................................................................481
Pobieranie danych typu LONG ........................................................................................481
Dodatkowe funkcje obsugi bdw .................................................................................482
PL/SQL w dziaaniu zapisywanie wartoci typu LONG do pliku .....................................484
Uprawnienia a pakiet DBMS_SQL.........................................................................................486
Uprawnienia wymagane dla pakietu DBMS_SQL...........................................................486
Role a pakiet DBMS_SQL ...............................................................................................487
Porwnanie pakietu DBMS_SQL z innymi metodami przetwarzania dynamicznego ...........487
Opisywanie listy instrukcji SELECT................................................................................488
Przetwarzanie tablicowe ...................................................................................................488
Operacje dzielenia na czci danych typu LONG ............................................................488
Rnice interfejsw ..........................................................................................................489
Wskazwki i techniki..............................................................................................................489
Ponowne zastosowanie kursorw .....................................................................................489
Zezwolenia........................................................................................................................489
Zawieszenia programu zwizane z operacjami DDL .......................................................490
Podsumowanie ........................................................................................................................490
Spis treci
13
14
Spis treci
15
Skorowidz ...........................................................................................737
Rozdzia 4.
SQL w PL/SQL
Strukturalny jzyk zapyta (SQL) okrela sposb manipulowania danymi w bazie danych
Oracle. Konstrukcje proceduralne, ktre przedstawiono w rozdziale 2. i 3., staj si znacznie
bardziej uyteczne w poczeniu z moc przetwarzania jzyka SQL, poniewa wtedy
konstrukcje te pozwalaj programom PL/SQL na manipulowanie danymi w bazie danych
Oracle. W niniejszym rozdziale zostan omwione instrukcje SQL, ktre s dozwolone
w jzyku PL/SQL i instrukcje sterowania transakcjami, ktre gwarantuj utrzymanie
spjnoci danych. W rozdziale 5. Czytelnik zapozna si z wbudowanymi funkcjami SQL.
Instrukcje SQL
Instrukcje SQL mona podzieli na sze kategorii, ktre wymieniono poniej. W tabeli
4.1 znajduje si kilka przykadowych instrukcji. Szczegowy opis wszystkich instrukcji
SQL znajduje si w publikacji Server SQL Reference.
Tabela 4.1. Kategorie instrukcji SQL
Kategoria
, ,
, ,
,
, , , ,
98
Rozdzia 4.
SQL w PL/SQL
99
! "
#$%! &'())*
! "#$%! )
'("+&,+)*
*
W celu kompilacji tego bloku identyfikator wymaga dowizania. Podczas tego
procesu nastpuje sprawdzenie faktu istnienia tabeli. Jednak tabela nie moe istnie przed
uruchomieniem bloku. Z powyszego wynika, e omawiany blok nie moe zosta skompilowany, a zatem nie ma sposobu na uruchomienie go.
Instrukcje sterowania transakcji s jedynymi instrukcjami SQL, ktre nie maj moliwoci
modyfikowania obiektw schematu lub uprawnie do obiektw schematu i w ten sposb
s jedynymi poprawnymi instrukcjami SQL, stosowanymi w jzyku PL/SQL.
100
Rysunek 4.1.
Wyniki
wykonania
instrukcji SQL
w programie
SQL*Plus
Naley zwrci uwag na sposb zastosowania instrukcji . Wyniki wykonania tej
instrukcji pokazano na rysunku 4.1.
#%-./01
2&-%0+&+
#, %/0'('*
, s
ustalone s znane podczas tworzenia instrukcji. Jzyk PL/SQL usuwa to ograniczenie za pomoc zmiennych. Stosowanie zmiennych jest dozwolone wszdzie tam, gdzie
w instrukcji SQL jest dozwolone stosowanie wyrae. Jeli zmienne s uywane w opisywany sposb, s nazywane zmiennymi dowizanymi. Przykadowo, w poprzedniej instrukcji mona zastpi warto ustalon liczby zalicze (
) zmienn
dowizan:
Dostpne na pycie CD w skrypcie bindvar.sql
#///3 #%-./4
*
56
%78./79%,/#7.:! %-./65
#%-./0
2&-%0+&+
#, %/0'('*
*
Rozdzia 4.
SQL w PL/SQL
101
Instrukcja SELECT
Instrukcja SELECT pobiera dane z bazy danych do zmiennych PL/SQL. Poniej przedstawiono skadni instrukcji SELECT:
Opis
./898,%
Kolumna (lub wyraenie) do wybrania. Kady element listy wyboru jest oddzielony
przecinkiem i moe by opcjonalnie identyfikowany przez alias (zamiennik).
Cay zbir elementw listy w instrukcji nazywa si list wyboru.
Znak 6 w skadni jest skrtem zastpujcym cay wiersz. W ten sposb s zwracane
poszczeglne pola w tabeli w kolejnoci, w jakiej zdefiniowano pola.
;.
Zmienna PL/SQL, do ktrej bdzie przekazany element listy wyboru. Kada zmienna
powinna by kompatybilna ze swoim skojarzonym elementem listy wyboru.
Dlatego elementy listy oraz zmienne wyjciowe powinny istnie w tej samej liczbie.
%<,%-
5=
,-9,..
Identyfikuje tabel, z ktrej maj by pobrane dane. Moe by synonimem lub tabel
w odlegej bazie danych, okrelonej przez powizanie z baz danych. Wicej informacji
na temat odwoa tabel znajduje si w dalszej czci niniejszego rozdziau.
< 7 9$%
Kryterium dla tego zapytania. Klauzula ta identyfikuje wiersz, ktry bdzie zwrcony
przez zapytanie. Kryterium skada si z warunkw logicznych (booleowskich)
czonych operatorami logicznymi. Zagadnienia zwizane z kryteriami wyboru opisano
bardziej szczegowo w dalszej czci niniejszego rozdziau.
102
Oglnie wicej klauzul jest dostpnych dla instrukcji . Przykadowo, zaliczaj si
do nich klauzule
oraz
. Szczegowo omwiono je w rozdziale 6.
Wicej informacji na ich temat znajduje si w publikacji Server SQL Reference.
Instrukcja wedug podanej powyej skadni powinna zwraca najwyej jeden wiersz.
Klauzula jest sprawdzana dla kadego wiersza w tabeli. Jeeli odpowiada ona wicej
ni jednemu wierszowi, PL\SQL zwraca nastpujcy komunikat o bdzie:
>'?@AB.C>%,9D %8% %/,%$,%,9
;8.,:-9.%/779%#9.#:.7:-9.%/7)
Instrukcja INSERT
Skadni instrukcji przedstawiono poniej. Naley zwrci uwag, e bezporednio
w instrukcji nie wystpuje klauzula WHERE (chocia moe ona wystpowa w podzapytaniu).
Klauzula !"
"#! odwouje si do tabeli Oracle, "$ "
%!& odwouje si
do kolumny w tej tabeli, a &"$ jest wyraeniem SQL lub PL/SQL, co zdefiniowano
w poprzednim rozdziale. Odwoania do tabel omwiono bardziej szczegowo w dalszej
Rozdzia 4.
SQL w PL/SQL
103
czci niniejszego rozdziau. Jeeli instrukcja zawiera %'"
!, wtedy
elementy listy instrukcji ! powinny odpowiada kolumnom, do ktrych maj by
wstawiane dane.
Prawidowe zastosowanie kilku instrukcji przedstawiono w poniszym przykadzie:
Dostpne na pycie CD w skrypcie insert.sql
! -/ -/3.-4
*
>>
,.%7,98.-8E.<,%/ -
/ -/D #3
! -
F
- *
>>,-:9.%/7-,./ -/3
/ -/.-"E.%/"/)
! -"+.,$8+"+%+)*
>>,-:-% C.9.%/7" 78: % /<9#:.7,/%-.,9
>>./% <#:.3
/ -/.-"E.%/"/)
/ -/D #3"+
%.#<+"+
,+)*
*
Wersja Oracle8 z opcj obiektw dostarcza dodatkow klauzul dla instrukcji
klauzuli (). W razie zastosowania tej klauzuli z tabelami obiektw jest zwracane
odwoanie do wstawianego obiektu. Wicej informacji na ten temat znajduje si w rozdziale 11.
104
Instrukcja UPDATE
Poniej przedstawiono skadni instrukcji :
Klauzula !"
"#! odwouje si do modyfikowanej tabeli, "$ "
%!& jest
nazw kolumny, ktrej warto ma by zmieniona, a &"$ jest wyraeniem SQL,
co zdefiniowano w rozdziale 2. Jeeli instrukcja zawiera %'"
,
elementy listy wyboru powinny odpowiada kolumnom w klauzuli .
W poniszym przykadzie pokazano zastosowanie instrukcji :
Dostpne na pycie CD w skrypcie update.sql
!:,%/ -/3:,%4
*
!%-.#%/ B01*
>>./% <#:
-,-1-,,# %%#%-./
>>-9/78/<.#$/ -,9"<,%78/ -. :&./,%.3
!:,%B0+&./,%8+*
/ -/
# %%#%-./0# %%#%-./H!%-.#%/
2&:,%0!:,%*
*
Instrukcja DELETE
Instrukcja usuwa wiersze z tabeli bazy danych. Klauzula wskazuje, ktre
wiersze maj by usunite. Poniej podana jest skadnia instrukcji :
Rozdzia 4.
SQL w PL/SQL
105
Klauzula !"
"#! odwouje si do tabeli z bazy danych Oracle, a %!"$!"
*
definiuje zbir wierszy, ktre maj by usunite. Specjalna skadnia )(%
jest uywana wraz z definicj kursora i jest omwiona w rozdziale 6. Odwoania do tabeli
oraz klauzula s omawiane szczegowo w kolejnej czci tego rozdziau, w podrozdziale Klauzula WHERE.
W poniszym przykadzie przedstawiono sposb stosowania kilku rnych instrukcji :
Dostpne na pycie CD w skrypcie delete.sql
! - ,EE *
! - ,EEB0'(*
>> / --,8#7#</"9<,%8#$.98/%#7:#:.#78
>>7%:/%,98#$/ -,93
F
#///
2&# %%/ -/I! - ,EE*
>> / --,8#7#<7-C,/ -/ -. :#C,<,,."<J%8
>>.,/.-:/7#77-8#$7.#73
F
/ -/
2&# %%#%-./0(
:,%0+#,,.#/+*
*
Klauzula WHERE
Wraz z instrukcjami , oraz stosuje si klauzul , bdc integraln czci wykonywanych przez te instrukcje operacji. Klauzula ta definiuje, ktre
instrukcje tworz zestaw aktywny zestaw wierszy zwracanych przez zapytanie ()
lub na ktrych s wykonywane instrukcje oraz .
Klauzula skada si z warunkw poczonych operatorami logicznymi , ) oraz
). Warunki zwykle przyjmuj form porwna, tak jak w poniszym przykadzie zastosowania instrukcji :
!%&1)*
!%B0++*
>> / 9/78/<.</898-7. E,%8<
F
#///
2&
*
*
, dla ktrych
warunek zosta oceniony na warto (dla ktrych kolumna
= ++,. Przy
tego typu porwnaniach naley zwraca uwag na waciwe stosowanie nazw zmiennych
oraz sposb porwnywania znakw.
106
Nazwy zmiennych
Na potrzeby kolejnego przykadu przyjto, e w poprzednim bloku programu zmieniono
nazw zmiennej z
na
:
&1)*
%B0++*
>> / 9/78/<.</898-7. E,%8<
F
#///
2&-%0
*
*
Ta prosta zmiana radykalnie wpywa na otrzymane wyniki wykonania tej instrukcji tak
zmodyfikowany blok usunie wszystkie wiersze tabeli
, a nie tylko te, dla ktrych
zachodzi rwno -".++. Wynika to ze sposobu parsowania identyfikatorw
w instrukcji SQL. Kiedy mechanizm PL/SQL napotyka na warunek taki jak:
najpierw nastpuje sprawdzenie identyfikatorw / &"$ oraz 0 &"$ w celu ustalenia, czy odpowiadaj one kolumnom tabeli, na ktrych jest wykonywana dana operacja.
Nastpnie identyfikatory te s sprawdzane, czy s zmiennymi w bloku PL/SQL. Jzyk
PL/SQL nie rozrnia maych i duych liter, zatem w poprzednim bloku obydwa identyfikatory
oraz
s skojarzone z kolumn w tabeli
, a nie ze
zmienn. Wynikiem sprawdzenia tego warunku dla kadego wiersza tabeli bdzie warto
i dlatego wszystkie wiersze zostan usunite.
Jeeli blok posiada etykiet, mona w dalszym cigu uy tej samej nazwy dla zmiennej
jak dla kolumny tabeli dziki nadanej etykiecie do odwoania do zmiennej. Przedstawiony poniej blok daje podany efekt, a mianowicie usuwa tylko te wiersze, dla ktrych
-".++:
II,#<KK
%&1)*
%B0++*
>> / 9/78/<.</898-7. E,%8<
F
#///
2&-%0
*
*
Mimo e ten sposb dziaania prowadzi do uzyskania podanego wyniku, jednak stosowanie tej samej nazwy dla zmiennej PL/SQL i dla kolumny tabeli nie jest cech dobrego
stylu programowania. Te i inne wytyczne dotyczce stylu programowania w jzyku PL/SQL
omwiono w kocowej czci rozdziau 2.
Porwnania znakw
W poprzednim przykadzie znajduje si fragment kodu sucy do porwnywania wartoci
dwch znakw. W systemie Oracle mog by zastosowane dwa rne rodzaje porwna:
z dopenieniem odstpu (blank-padded) lub bez dopenienia odstpu (non-blank-padded).
Rozdzia 4.
SQL w PL/SQL
107
naley dopeni znakami odstpu (spacjami), tak aby obydwa miay t sam dugo.
2. Nastpnie porwnuje si kady cig znakw, znak po znaku, zaczynajc
od lewej strony. Przykadowo, w cigu znakw
znakiem jest
,
a w cigu znakw
znakiem jest
.
3. Jeeli ASCII(
) < ASCII(
), to
<
.
Jeeli ASCII(
) > ASCII(
), to
>
.
Jeeli ASCII(
) = ASCII(
), to odpowiednio w cigach znakw
oraz
przechodzi si do nastpnego znaku.
4. Jeeli moliwe jest osignicie kocw cigw znakw
oraz
, wtedy te cigi s sobie rwne.
Jednak ponisze porwnanie bez dopenienia odstpu zwrci warto (, poniewa cigi
znakw s rnej dugoci. Jest to podstawowa rnica pomidzy powyszymi dwoma
metodami porwna.
+#+0+#+>>7879%,#.# 9C<,#,97<.,-/
>>9.%9/78#.C 7<,93
108
Po zdefiniowaniu tych dwch rnych metod porwna warto si zastanowi, kiedy naley
stosowa kad z nich. Jzyk PL/SQL wykorzystuje metody porwnania z dopenieniem
odstpu tylko wtedy, gdy obydwa porwnywane cigi znakw s staej dugoci. Jeeli
dane cigi znakw s rnej dugoci, stosuje si metod porwnywania bez dopeniania
odstpu. Typ danych okrela cig znakw o staej dugoci, a typ danych 10
okrela cig znakw o zmiennej dugoci. Stae znakowe (objte znakami apostrofu) s
zawsze uwaane za cigi znakw o staej dugoci.
Jeeli dana instrukcja nie jest wykonywana na poprawnych wierszach, naley sprawdzi typy danych uyte w klauzuli . Wykonanie poniszego bloku nie spowoduje usunicia
jakichkolwiek wierszy, poniewa zmienna
jest typu 10, a nie typu :
!%!"#1)*
!%B0++*
>> / 9/78/<.</898-7. E,%8<
F
#///
2&-%0!%*
*
ma zdefiniowany typ danych . Wszystkie klasy
informatyki (computer science) posiadaj wartoci ++ dla kolumny
naley
zwrci uwag na kocowy znak odstpu. Zmienna
= ++ nie ma kocowego
znaku odstpu i zdefiniowano dla niej typ danych o zmiennej dugoci, a zatem instrukcja
nie bdzie miaa adnego wpywu na wiersze.
Aby klauzula daa podany efekt, dla zmiennych w bloku PL/SQL naley zdefiniowa ten sam typ danych, co dla porwnywanych kolumn bazy danych. Taki efekt
gwarantuje zastosowanie atrybutu 23.
Odwoania do tabel
Wszystkie operacje DML odwouj si do tabeli. Poniej przedstawiono przykad takiego
odwoania:
L
3MLN M
Rozdzia 4.
SQL w PL/SQL
109
Schemat domylny jest schematem, z ktrym uytkownik jest poczony przed wykonywaniem jakichkolwiek instrukcji. Jeeli dana tabela znajduje si w innym schemacie,
moe by kwalifikowana przez nazw schematu, jak w kolejnym przykadzie:
$
/ -/
:,%0+ /.#+
2&.-0'(((O*
Nazwa powizania bazy danych "$ "
- "$"" podlega tym samym reguom skadniowym, co identyfikator bazy danych. Schemat w odlegej bazie danych jest identyfikowany
przez nazw uytkownika "$ "$&% %" oraz haso *"!, a "4$"%
5! jest poprawnym cigiem znakw poczenia dla odlegej bazy danych. Zakadajc, e utworzono
odpowiednie schematy i e jest zainstalowany program SQL*Net wersja 2., poniszy,
przykadowy fragment kodu tworzy powizanie bazy danych:
%&'P#<
PFP
+#< -/+*
Jeli powizanie bazy danych stanowi cz transakcji, wtedy ta transakcja jest nazywana
transakcj rozproszon, poniewa jej rezultatem jest zmodyfikowanie wicej ni jednej
bazy danych. Wicej informacji dotyczcych transakcji rozproszonych i sposobw zarzdzania nimi znajduje si w publikacji Server SQL Reference.
110
Synonimy
Odwoania do tabel mog by skomplikowane, szczeglnie kiedy obejmuj operacje
zwizane ze schematem uytkownika i (lub) powizaniem bazy danych. Aby uatwi
obsug skomplikowanych odwoa, system Oracle pozwala na tworzenie ich synonimw.
Synonim w zasadzie zmienia nazw odwoania do tabeli, podobnie jak alias dla elementu
listy wyboru instrukcji . Synonim jest obiektem sownika danych i jest tworzony
przez instrukcj DDL 3)3:
F
*
Kontynuujc powyszy przykad, za pomoc utworzonego synonimu mona zapisa rozproszon instrukcj :
$
:,%0+ /.#+
2&.-0'(((O*
Pseudokolumny
Pseudokolumny s dodatkowymi obiektami, ktre mog by wywoywane tylko z poziomu
instrukcji SQL. Pod wzgldem skadniowym pseudokolumny s traktowane jak kolumny
w tabeli. Jednak faktycznie nie istniej w ten sam sposb jak kolumny. Zamiast tego s
one okrelane jako cz wykonania instrukcji SQL.
oraz
3
Rozdzia 4.
SQL w PL/SQL
111
gdzie % '" jest nazw sekwencji. Pseudokolumna 1 zwraca biec warto
sekwencji, a pseudokolumna1 inkrementuje sekwencj i zwraca now warto.
Obydwie pseudokolumny 1 oraz 1 zwracaj wartoci typu
.
Wartoci sekwencji mog by uywane w licie wyboru zapytania, w klauzuli 1
instrukcji oraz w klauzuli instrukcji . Jednak nie mog by one zastosowane w klauzuli lub w instrukcji proceduralnej PL/SQL. Poniej podano przykady
poprawnego wykorzystania pseudokolumn 1 oraz 1:
= / -/D #
2&'((((*
>>2:./% <#:.'((((7,/.98<,%78/:<,9%,/#.-8E.<,%
/ -/.-"E.%/"/)
- .!"+#,+"+.$+)*
>>2:./% <#:.'((('7,/.98<,%78/:<,9%,/#.-8E.<,%
/ -/.-"E.%/"/)
- .!"+%C%+"+/,+)*
- .!Q Q
F
- *>>:.%9.<% :.#7/<9#:.
>>>>>>>>>>
'(((@
- /!Q Q
F
- *>>;9%#.7#9%,/#
>>>>>>>>>>
'(((@
Pseudokolumna LEVEL
Pseudokolumna 1 jest wykorzystywana tylko wewntrz instrukcji , ktra umoliwia poruszanie si po drzewie hierarchii, obejmujcym dan tabel. Podczas tego procesu
s stosowane klauzule oraz )
3. Pseudokolumna 1 zwraca biecy
poziom drzewa jako warto typu
. Wicej informacji na ten temat znajduje si
w publikacji Server SQL Reference.
Pseudokolumna ROWID
Pseudokolumna ) jest wykorzystywana w licie wyboru zapytania. Zwraca ona identyfikator danego wiersza. Formatem pseudokolumny jest 18-znakowy cig znakw, co
opisano w rozdziale 2. Pseudokolumna ) zwraca warto typu ) . W poniszym
przykadzie zapytanie zwraca wszystkie identyfikatory wierszy w tabeli
(pokoje):
2
F
%,,/*
2
>>>>>>>>>>>>>>>>>>
((((((?O3((((3(((@
((((((?O3((('3(((@
112
Pseudokolumna ROWNUM
Pseudokolumna ) zwraca biecy numer wiersza w zapytaniu. Umoliwia to ograniczenie cakowitej liczby wierszy. Pseudokolumna ) jest wykorzystywana gwnie
w klauzuli zapyta oraz w klauzuli instrukcji . Pseudokolumna )
zwraca warto typu
. Wykonanie poniszego zapytania spowoduje zwrcenie
tylko dwch pierwszych wierszy z tabeli
:
6
F
/ -/
2&
2 I1*
Wprawdzie powysza instrukcja zwraca dwa wiersze z tabeli (studenci), posortowane wedug kolumny 0
(imi), jednak niekoniecznie te wiersze s dwoma
pierwszymi wierszami wedug kolejnoci w caym sortowaniu. Aby to osign, najlepiej
zadeklarowa kursor dla tego zapytania i pobra tylko dwa pierwsze wiersze. Informacje
dotyczce kursorw i sposobw ich stosowania przedstawiono w rozdziale 6.
Rozdzia 4.
SQL w PL/SQL
113
Opis
Typy obiektw
schematu
Tabele, sekwencje
Tabele, perspektywy
Tabele
Tabele, perspektywy
F
Tabele
Tabele, perspektywy,
sekwencje, migawki
Tabele, perspektywy
Istnieje wiele uprawnie systemowych, dotycz one prawie kadej moliwej operacji DDL.
Na przykad, uprawnienie systemowe
pozwala uytkownikowi, ktremu
przyznano to uprawnienie, na tworzenie tabel. Uprawnienie systemowe 3
pozwala uytkownikowi, ktremu przyznano uprawnienie, na tworzenie tabel w innym
schemacie uytkownika. Publikacja Server SQL Reference dokumentuje wszystkie dostpne
uprawnienia systemowe.
114
Instrukcja GRANT
Poniej przedstawiono skadni instrukcji 6 dla uprawnie obiektowych:
L2&
M*
gdzie -" jest nadawanym uprawnieniem, #% jest obiektem, do ktrego jest
przyznawany dostp, a $&% % jest uytkownikiem, ktry otrzymuje uprawnienie.
Przykadowo, jeli $&% % jest poprawnym schematem bazy danych, ponisza instrukcja 6 jest prawidowa:
#///
78<,9.<*
gdzie -" jest uprawnieniem systemowym, a $&% % jest uytkownikiem,
ktry otrzymuje uprawnienie. W razie okrelenia opcji )) uytkownik
$&% % otrzymuje prawo przyznawania tego uprawnienia innym uytkownikom.
Na przykad:
"
, 78<,9.<*
Podobnie jak w przypadku instrukcji 6 dla uprawnie obiektowych, w jednej instrukcji
6 mona okrela wiksz liczb uprawnie systemowych.
6 jest instrukcj DDL, a wic jest natychmiast uaktywniana i po jej wykonaniu jest
wydawana niejawnie instrukcja potwierdzenia ).
Instrukcja REVOKE
Poniej przedstawiono skadni instrukcji 1)7, ktra suy do odbierania uprawnie
obiektowych:
F
L
M*
gdzie -" jest odbieranym uprawnieniem, #% jest obiektem, dla ktrego
uprawnienie jest odbierane, a $&% % jest uytkownikiem, ktremu uprawnienie jest
odbierane. Przykadowo, poniej przedstawiono poprawny sposb zastosowania instrukcji
1)7:
#///F
78<,9.<*
Rozdzia 4.
SQL w PL/SQL
115
gdzie -" jest odbieranym uprawnieniem systemowym, a $&% % jest uytkownikiem, ktremu jest odbierane dane uprawnienie. Poniej podano przykadowe,
poprawne zastosowanie instrukcji 1)7:
"
F
78<,9.<*
Role
W przypadku duego systemu Oracle, gdzie istnieje wiele rnych kont uytkownikw,
zarzdzanie uprawnieniami moe by skomplikowanym zadaniem. W celu uatwienia
zarzdzania kontami w systemie Oracle stosuje si role. Rola w zasadzie jest zbiorem
uprawnie, zarwno systemowych, jak i obiektowych. Warto przeanalizowa nastpujcy
zestaw instrukcji:
D %8*
/ -/
D %8*
#///
D %8*
%,,/
D %8*
W ten sposb uytkownicy:
i
otrzymali uprawnienie
na trzech tabelach. Taki sposb postpowania moe uatwi zarzdzanie systemem, poniewa powyszym dziaaniem zastpiono sze oddzielnych operacji przyznawania
uprawnienia .
Rola
jest rol predefiniowan w systemie Oracle. Jest ona przyznawana automatycznie kademu uytkownikowi. A zatem mona wykonywa ponisz instrukcj:
%9..
*
W ten sposb dane uprawnienie jest przyznawane kademu uytkownikowi systemu Oracle.
W systemie Oracle istniej take inne predefiniowane role. Zawieraj one typowe uprawnienia systemowe. Role te wymieniono w tabeli 4.4. Warto zauway, ze wszystkie wymienione w tej tabeli role s automatycznie przyznawane uytkownikowi 3, ktry
jest predefiniowanym uytkownikiem systemu Oracle.
Zwykle role ) oraz ) s przyznawane uytkownikom bazy danych, ktrzy
maj tworzy obiekty schematu, a sama rola ) jest przyznawana uytkownikom,
ktrzy wykonuj zapytania na obiektach schematu. Uytkownicy, ktrym przyznano tylko
rol ), mog wymaga dodatkowych uprawnie na obiektach schematu, do ktrych
musz mie dostp.
116
Przyznane uprawnienia
, , , = ,
,
, , 2
F
,
, plus ,
, na tabelach
systemowych 1 $, 1 oraz 1 0
F
Sterowanie transakcjami
Transakcja jest seri instrukcji SQL, ktrych wykonanie w ramach pewnej jednostki koczy
si powodzeniem lub niepowodzeniem. Transakcje s standardowym elementem pracy
relacyjnej bazy danych i stanowi zabezpieczenie przed utrat spjnoci danych. Klasycznym przykadem powyszego jest transakcja bankowa. Warto rozway nastpujce dwie
instrukcje SQL, ktre przeprowadzaj transfer kwoty transakcji
pomidzy
dwoma kontami bankowymi, identyfikowanymi jako
i
.
<,
/-,0/-,R<9,%/<#:.
%<,0<,,-9#8*
<,
/-,0/-,H<9,%/<#:.
%<,0<,,,-.,%#8*
Na potrzeby niniejszego przykadu przyjto, e pierwsza instrukcja zostaa wykonana z powodzeniem, ale wykonanie drugiej instrukcji zakoczyo si niepowodzeniem
z powodu wystpienia pewnego bdu (przykadowo, uszkodzenie w bazie danych lub
w sieci). W takiej sytuacji dane s niespjne stan konta
zosta zmniejszony, ale stan konta
nie zosta zwikszony. Jest oczywiste, e nie jest
to podana sytuacja, zwaszcza dla waciciela konta
. Przed tak sekwencj
zdarze mona si zabezpieczy dziki poczeniu powyszych dwch instrukcji w jedn
transakcj. W ten sposb albo obydwie transakcje zakocz si powodzeniem, albo obydwie transakcje zakocz si niepowodzeniem. Taki sposb postpowania zabezpiecza
przed utrat spjnoci danych.
Transakcja rozpoczyna si od pierwszej instrukcji SQL, wydanej po poprzedniej transakcji,
lub pierwsz instrukcj SQL po nawizaniu poczenia z baz danych. Transakcja koczy
si instrukcj ) lub )
7.
Rozdzia 4.
SQL w PL/SQL
117
Opcjonalne sowo kluczowe )7 udostpniono w celu zwikszenia zgodnoci ze standardem SQL. Dopki transakcja nie zostanie potwierdzona za pomoc instrukcji ),
zmiany dokonane przez t transakcj s widoczne tylko w sesji, w ktrej dana transakcja
jest wykonywana. Tak sytuacj pokazano na rysunku 4.2. Najpierw w sesji A jest wydawana instrukcja . W sesji B jest wykonywane zapytanie na tabeli
, jednak
w sesji B nie jest widoczne wykonanie instrukcji przeprowadzanej w sesji A, poniewa nie zostao one potwierdzone. Nastpnie w sesji A nastpuje wydanie instrukcji
potwierdzenia ), a druga instrukcja w sesji B pokae nowo wstawiony wiersz.
Rysunek 4.2.
Dwie sesje
wszystkie wyniki pracy wykonanej przez transakcj zostaj wycofane, jak gdyby
transakcja nie bya przeprowadzana;
Podobnie jak w instrukcji ), opcjonalne sowo kluczowe )7 jest dostpne dla zwikszenia zgodnoci ze standardem SQL. Niejawna instrukcja )
7 jest czsto wykonywana w razie wykrycia w programie bdu, ktry uniemoliwia dalsz prac. W razie nagego
zakoczenia sesji (na przykad w razie zerwania poczenia z baz danych) bez zakoczenia
118
Punkty zachowania
Z poprzedniego podrozdziau wynika, e wydanie instrukcji )
7 powoduje wycofanie
caej transakcji. Warto jednak wiedzie, e po zastosowaniu instrukcji 1) tylko
cz transakcji wymaga wycofania. Poniej przedstawiono skadni instrukcji 1):
*
gdzie "$ " jest nazw punktu zachowania. Nazwy punktw zachowania podlegaj tym
samym zasadom skadniowym, co identyfikatory SQL (patrz rozdzia 2.). Naley zwrci
uwag, e punkty zachowania nie s deklarowane w sekcji deklaracji, poniewa dla danej
transakcji maj one znaczenie globalne i wykonywanie transakcji moe by kontynuowane
a do zakoczenia bloku. Zatem jeli zdefiniowano punkt zachowania, wykonywanie programu moe by cofnite do danego punktu zachowania. W tym celu wydaje si polecenie
o nastpujcej skadni:
L2
M
*
Rozdzia 4.
SQL w PL/SQL
119
wtedy trzecia instrukcja oraz punkt zachowania C zostan wycofane. Jednak dwie
pierwsze instrukcje bd przetwarzane. Z drugiej strony, jeeli do instrukcji brakujcych zostanie wprowadzona instrukcja:
*
Transakcje a bloki
Naley zwrci uwag na pewne rnice midzy transakcjami a blokami PL/SQL. Rozpoczcie wykonywania bloku nie oznacza rozpoczcia wykonywania transakcji. Podobnie
rozpoczcie wykonywania transakcji nie musi wiza si z rozpoczciem wykonywania
bloku. Przykadowo, warto rozway sytuacj, w ktrej z wiersza polece programu
SQL*Plus wydano nastpujce instrukcje:
Dostpne na pycie CD w skrypcie 1trans.sql
#///
-%"#, %/"-/#%..,"P/ -/"
# %%/ -/" #%-./"%,,.-)
++"'('"+, %#.#'('+"O("'("?"GGGGS)*
%,,/
%,,.-0%,,.->'(((*
2
*
*
Z powyszego fragmentu kodu wynika, ze wydano instrukcj , a nastpnie anonimowy blok PL/SQL. W bloku tym znajduje si instrukcja i nastpnie instrukcja
)
7. Instrukcja )
7 wycofuje nie tylko instrukcj , ale rwnie wczeniejsz instrukcj . Zarwno instrukcja , jak i blok s czci tej samej sesji
bazy danych, a w ten sposb take tej samej transakcji.
W podobny sposb jeden blok moe zawiera w sobie wiele transakcji. Przykadowo:
Dostpne na pycie CD w skrypcie 1block.sql
! %.,/ *
>>28<,:,-'-,O(("9/9.:#9%,/#.-,.
>>328<, :./% <#:
,<7-8#$O(9.%/7#$3
F
!,,, %'33O((
120
Podsumowanie
W niniejszym rozdziale oglnie omwiono zagadnienia dotyczce instrukcji SQL, DML
oraz instrukcji sterowania transakcjami, dozwolonymi w szczeglnoci w jzyku PL/SQL.
Podano rwnie informacje zwizane z uprawnieniami i rolami, a take przedstawiono
sposb zabezpieczania danych przed utrat spjnoci za pomoc mechanizmu transakcji.
W nastpnym rozdziale zostan opisane wbudowane funkcje SQL. W rozdziale 6. zostan
omwione kursory, ktre s stosowane dla zapyta wielowierszowych. W celu prawidowego zrozumienia prezentowanych tam zagadnie naley przeanalizowa koncepcje
przedstawione w niniejszym oraz w kolejnym rozdziale.