kieszonkowy słownik
DESCRIPTION
ShortTRANSCRIPT
+ DODAJ OO PÓU<I •tt;'BUK @ 0 ~:
STEVEN FEUERSTEIN BILL PRIBYL
CHIP DAWES
;;:; SPIS TREŚCI 2 / 202
ORACLE PL/SQL KIESZONKOWY SŁOWNIK JĘZYKA
Przekład z języka angielskiego
Piotr Nowakowski
WYDAWNICTWO NAUKOWE PWN WARSZAWA 2009
Polska wersja okładki: Łukasz Kowalik
Redakcja: Krystyna Knap
Skład komputerowy: Krqsztof Świstak
Zasarze7..onych nazw fi rm i produktów uzy10 w ksiązce wyłącznie w celu identyfikacj i.
Authorized crnnslarion of che English edition of Oracle PL/SQL Language Pocket Reference, 4• F,dition
ei Scevcn Feuerstein, Bill Pribyl & Chip Dawes. ·1nis trnnslacion is published and sold by permission of O'Reilly Media, Inc.,
che owner of all rights 10 publish and scil che same.
Autoryzowane tłumaczenie wydania angielskiego Oracle PL/SQL Language Pocket Reference, 4• Edition
ei Scevcn Feuerstein, Bill Pribyl & Chip Dawes. To cłum::z.mie =il<> op.blikow.re i jest sprllXlaw.re za ~ CYReilly MOOia, !re,
właściciela wszysckich prnw do publikowania i sprzedawania cej ksią7..ki.
Polish language edicion published by Wydawniccwo Naukowe PWN SA, Copyright © 2009
Wszystkie prawa 7..ascrzezone. 7..aden fragmenc ccj książki nic mo7..e być kopiowany lub pr/..ekazywany w jakiejkolwiek formie, elekcronicznic lub mechanicznie, w cym za pomocą fotokopii, nagrań albo zapamiętany w jakimkolwiek systemie wyszukującym,
bez zgody Wydawniccwa Naukowego PWN SA.
Copyrighc ei for che Polish edition by Wydawnictwo Naukowe PWN SA, Wars7..awa 2009
ISBN: 978-83-01 - 15792-0
Wydawnictwo Naukowe PWN S.A. 02-676 Warszawa, ul. Postępu 18 tel. (O 22) 69 54 321 faks (O 22) 69 54 031 e-mail: [email protected] www.pwn.pl
Wydanie pierwsze Arkuszy drukarskich 6,25 Druk ukończono w kwietniu 2009 r. Druk i oprawa: Drukarnia Wydawnictw Naukowych Sp. z o.o. 92-333 Łódź, ul. Wydawnic7..a 1/3
Spis treści
Wprowadzenie ... ......•............................................................................ 7 Podziękowania ..... „ .•.... „.„ •.. . . „ . . . . . . . „ ••••• •• „ ... „.„ „ . . . „ . . . . • . . „ . . . . . . ..••.... •....... . . . ... 8 Konwencje ........... „ .•..•... ... •.. . . . . . . .. ... . ...... .. . . . . . . . •• ••...•... •.. •.... . . . .... . . •••• . . . . .... ...•... 8
Język PL/ SQL - podstawy ..................................................................... 9 Zestaw znaków .......................................................... „ .••••....... •.. . .... . . .... „ . . . . . . 9 Identyfikatory ............................................................. „ .••••....... •.. . .... . . .... „ . . . . . . 9 Literały boolowskie, liczbowe i tekstowe ..•..................... „„ „ . . . ..••.... •....... . . . . 10 Literały liczbowe .. „ .•...... ... •.. . . „ . . . . . . . „ ... „ . ........... •.. . ... . . . . • . . „ . . . . . . . „ ..... •....... . . . . 12 Literały DA TETIME ...........................••••. „ ........... •.. . ... . . . . • . . „ . . . . . . . „ ..... •....... . . . . 13 Ograniczniki .............. „ .... . . ........ •.. ... . ...... .. . . . . „ . •• • ........ •.. •.... . . . .... . . ••• „ . . . ......... 13 Komentarze .............. „ .... • . •••••••• ••• ••• • ••••.• .. • . . . . •. •• ••••••••• ••• ••••• • • • .••. • . •••• . . • . •••• .•••• 15 Pragmy ... ............................................................................................... „ . . . . 16 Polecenia ........................................ „ ••••• •••••••••••• ••• • ••.• . • . • • . „ . . . . • . •••••••• • ••••••• • • • . 17 Struktura blokowa .. „ . . . .... „ ........... •.. . .... . . .. . . „ ••••• •• „ ..... ... ..... . . . .... . . •••• . . . . ......... 17
Zmienne i dane programu .................................................................. 19 Zmienne skalarne ................. „ . . . . • . •••••••• ••• ••••• • • • .••. • . . . . •. •• •••••••••••• ••• ••• • • . • ..• . . .. . . . 20 Typy LOB .. „ ........ •.. ... . ...... .. . . . . . „ . . . ........ •.. •..... . . . . . . . . . . . . .. „ •••........ •.. . .... . . .... „ . . . . 28 Niejawne konwersje typów ...............•. „ . • . ••••.•••••• ••• • ••• • . • . • • . „ . . . . • . •.. ••••• • ••••••• • • • . 28 Wartości NULL ....................... „ . . . ........ •.. •..... . . . . . . . . . . . . .. „ •••........ •.. ... . . . . ... . . .. . . . 29 Deklaracje zmiennych ..•............................... „ •• • ........ •.. •.... . . . .... . . ••• „ . . . ......... 29 Deklaracje dowiązane .. „ . . . ........ •.. ... . ...... .. . . . . . „ •• • ........ •.. •.... . . . .... . . ••• „ . . . ......... 32 Podtypy definiowane przez programistę .... „ „ „ . . . ........ •.. •.... . . . . . „ . „ „ „ . . . ......... 33
Wyrażeni a warunkowe i sekwencyjna kontrola przepływu ................. 34 Wyrażenia warunkowe .......................... „ ........... •.. . ... . . . .. . . „ . . . . . . ... ..... •........ . . . 34 Sekwencyjne struktury kontrolne .........••........................... „ . . . . • . •••••••• • ••••••• • • • . 38
Pętle ........................•.......................................................................... 40 Pętle proste .............. „ .... . . ...•.... ... ... . ...... .. . . „ ••••• •• „ ..... ... ..... . . . .... . . •••• . . . . ......... 4 O
Spis treści I 3
Liczbowa pętla FOR .. „ .... • . •.•••••••••••••••••.• .. • . . . . •. •• • ••••.••••••••••••••.••. • . ••• •. . • . ••••.••• .41 Kursorowa pętla FOR ................................................................................... 42 Pętla WHILE .................................................••••............................•............... 43 Emulacja pętli REPEAT UNTIL ..•................................................................. .43 Polecenie EXIT ............................................................................................. 44 Polecenie CONTINUIE (Oracle Database 11g) ....................... ......................... 44 Etykiety pętli ................................................................................................ 46
Integracja z bazą danych .................................. ............. „ •.. •... . • . .. • .• . . . . 47 Sekwencje w PUSaL-u ...............................••••............................•.............. .47 Kontrola transakcji ...........................••••........................................................ 48 Transakcje autonomiczne ............................................................•............... 50
Kursory w PL/SOL-u ................... ... ............ .................................... ..... 52 Kursory jawne ..............................................................................•............... 52 Kursory domniemane ...................................................•............................... 56 Kursory dynamiczne ........................••••........................................................ 60 DBMS SQL ................................................................................................. 61 SQL injecdon oraz zmienne dowiązane ......................................................... 62 Zmienne kursorowe ..................................................................................... 63 Wyrażenia kursorowe ................................................................................... 65
Obsługa wyj ątków .............................................................................. 66 Deklarowanie wyjątków ................................................................................ 67 Generowanie wyjątków ................................................................................ 69 Zakres ..........................................................................................•............... 70 Eskalacja ..................................................................................................... 71
Rekordy w PL/SOL-u .... .................................... ............... ................... 74 Deklarowanie rekordów .........•...................................................................... 74 Pola rekordów .. „ • . • . . .. . . .... • . •••••••••••••••••••.• .. • . . . ••••• ••.. ••••••••••••••••.••. • . •••• . . • . ••••.•••• 75 Operacje na rekordach .......................•••....................................................... 76 Rekordy a DML.. .......................................................................................... 77 Rekordy zagnieżdżone ..•...................•••....................................................... 78
4 I Oracle PL/SQL. Kieszonkowy słownik języka
Kolekcje w PL/SOL-u .......................................................................... 79 Deklarowanie kolekcji ................................................................................... 81 lnicjalizacja kolekcji ...................................................................................... 83 Dodawanie i usuwanie elementów ............................................................... 84 Operacje na tał>elach zagnieżdżonych .......................................................... 85 Operacje na kolekcjach ................................................................................ 89 Kolekcje a prawa dostępu ............................................................................ 93 Kolekcje zagnieżdżone ..•...................•••....................................................... 93 Zapytania zł> iorcze .............................•••....................................................... 93
Wł>udowane funkcje ii pakiety ... „ . . . .. . .. ... . . . . . . . .. . . . .... . . . .. ... . .. . ... .. . .. ... . ... .. 98 Wł>udowane funkcje .................................................................................... 98 Wł>udowane funkcje oł>slugi wyrażeń regularnych ...................................... 112 Wł>udowane pakiety ................................................................................... 118
Procedury i funkcje ..•.. „ • . • •..• . • „ . . •• . „ . •• „ . . .. • . „ ••• „ . .• • „ . ... „ . „ •.. • „ . . • . .. • . • . . 124 Procedury ....................................................................................•............. 12 4 Funkcje ............................ „ . . ••• .. . . . .................... . . .. . . . . . .. . „ •• ................. . ... . . .. . 125 Parametry .................................................................... „ . . ... . . . . . ... ............... 127 Programy lokalne ......................................................... „ •• ................. . ... . . .. . 131 Przeładowywanie programów .....................••••.............................•............. 132 Deklaracje wyprzedzające ..•........................................................•............. 134 Funkcje tał>elowe ....................................................................................... 135 Pamięć podręczna rezultatów funkcji.. ........................................................ 135 Zapisane programy PUSQL-owe a proł>lem uwierzytelniania ...................... 138
Wyzwalacze .............•.................... „ . . .. •.. . • . • • • . .. • . . . ... . • . „ . .• . „ . ••. .. . .. . .. • ••. 139 Tworzenie wyzwalaczy .......................•••..................................................... 139 Predykaty w wyzwalaczach ........................................................................ 144 Zdarzenia DML.. .................................•••..................................................... 144 Wyzwalacze złożone ..........................•••....................... „ . . ... . . . . . ... ............... 145 Zdarzenia DDL ...................................•••....................... „ . . ... . . . . . ... ............... 147 Zdarzenia ł>azodanowe .......................•••..................................................... 148
Spis treści I 5
Pakiety .............................................................................................. 148 Struktura pakietu ................. „ ....... „ .................................. „ ........................ 148 Odwołania do elementów pakietów .„ ............. „„„„„.„ ................. „„„ „„„„151 Dane pakietu ....................... „ ....... „ .................................. „ ........................ 151 Pragma SERIALL Y _ REUSABLE .. „ ••••.••• ••• ••••• • • „ „ „ ........................ „„. „ ... „ .. 152 lnicjalizacja pakietu .. „„„. „ „ ........................... „ „ „ ........................ „„. „ ... „ .. 152
Wywoływanie funkcji PL/SOL-owych w wyrażeniach SOL-owych .... 154 Wywoływanie funkcj i ... „ . „ „ ........................... „ „ „ ........................ „„. „ ... „ .. 154 Wywoływanie funkcj i pakietowych w SQL -u.„„ ... „ ............... „„ „ ..•.. „ ......... 156 Hierarchia nazw kolUJmn i funkcji „ „„ „ „ .................. „.„ „ . „ „ „ „ ... „ ............... 157
Mechanizmy obiektowe .................................................................... 157 Typy obiektowe ... „ .„ ....................... „„.„ .„ „ ••••... „ ............... „„ .„ .•............. 158 Dziedziczenie typów .. „ ................ „ ... „„„ .. „ ..................... „ ... „„ . „ .•............. 160 Metody ...................... „„„ .. „ .•........................ „„„ ........................ „„.„ ... „ .. 161 Metody w podtypach ... „. „ . „ „ ....... „ ............... „ „ „ ........................ „„. „ ... „ .. 165 Operacje na obiektach w PUSQL-u i SQL-u ... „ ... „ ............... „„ „ ..•.. „ ......... 167 Rzutowanie typów obiektowych „ ..... „„„ .. „ ..................... „ ... „„ . „ .•............. 168 Modyfikowanie typów obiektowych ................ „ „ „ ........................ „„. „ ... „ .. 172
Kompilacja ....................................................................................... 175 Kompilowanie zapisanych programów Pl/SQL-owych ... „ „ „ „ ... „ ............... 175 Kompilacja warunkowa ... „ „ ........................... „ „ „ ........................ „„. „ ... „ .. 178 Ostrzeżenia kompilatorowe ............................ „ „ „ ........................ „„. „ ... „ .. 181 Kompilator optymalizujący .... „ „. „ ... „ ..................... „.„ „ . „ „ ....... „ ............... 184 Natywna kompilacja kodu Pl/SQL-owego .. „ .. „ ............... „ ... „ „ „ ..... „ ......... 186
Integracja z j ęzykiem Java ............................................................... 190 Przykład .................... „ ......................... „ ........................................ „ .......... 191 Publikowanie kodu w języku Java ..•............... „ .„.„ „ . „ .................. „„ .„ „ „ „ 192 Słownik danych ...... „ ........................ „„ „ . „ „ ....... „ ............... „.„ „ ... „ .......... 194
Indeks ............................................................................................... 195
6 I Oracle PL/SQL. Kieszonkowy słownik języka
Oracle PL/SQL. Kieszonkowy słownik języka
Wprowadzenie Oracle PUSQL. Kieszonkowy słownik języka to podręczny przewodnik po języku PUSQL, stanowiącym zestaw proceduralnych rozszerzeń języka SQL, a także po zestawie programów narzędziowych udostępnianych przez system Oracle. Jeżeli dany pakiet, program lub funkcja jest obsługiwana tylko przez konkretną wersję systemu (np. Oracle Database I lg), wspomnimy o tym w tekście.
Celem niniejszego przewodnika jest informowanie użytkowników PL/SQL-a o składni wybranych poleceri oraz innych elementów języka. Zakładamy. że czytelnicy są już obeznani z podstawami składni PUSQL-a. Więcej informacji można znaleźć w następujących książkach:
• Steven Feuerstein, Oracle PUSQL Programming, wydanie czwarte
• Bill Pribyl, Stev·en Feuerstein, Learning Oracle PUSQL (wyd. polskie: Oracle PUSQL. Wprowadzenie, Helion 2002)
• Steven Feuerstein, Oracle PUSQL Best Practices, wydanie drugie (wyd. polskie: Oracle PUSQL. Najlepsze praktyki, WN PWN2009)
• Rick Greenwald, David C. Kreines, Oracle in a Nutshell
Wprowadzenie I 7
Podziękowania
Dziękujemy wszystkim osobom zaangażowanym w pracę nad niniejszą książką - zwłaszcza Bryn Llewelyn za cenne uwagi, Ericowi J . Givlerowi oraz Stephenowi Nelsonowi za recenzję pierwszego wydania oraz Jonathanowi Gennickowi za recenzję drugiego i trzeciego wydania. Pragniemy również wyrazić wdzięczność wszystkim pracownikom wydawnictwa O' Reilly.
Konwencje WERSALIKAMI zapisano słowa kluczowe PUSQL-a oraz nazwy niektórych wbudowanych pakietów i narzędzi dostarczanych przez system Oracle.
Kursywą zapisano nazwy plików i katalogów, a także niektóre szczególnie istotne pojęcia i sformułowania.
Czci on ką o stałej szerokośc i zapisano przykładowe fragmenty kodu, literały oraz identyfikatory.
Czcionką o stałej szerokości z 11yt l uszczeniem zapisano dane wprowadzane przez użytkownika.
Nawiasy kwadratowe L1 oznaczają opcjonalne fragmenty składni poleceń .
Nawiasy klamrowe { I oznaczają listę opcji, z których należy wybrać jedną.
Znak I rozdziela elementy list w opisach składni poleceń.
8 Oracle PL/SQL. Kieszonkowy słownik języka
Język PL/SQL - podstawy Niniejszy dział opis uje podstawy języka PUSQL: znaki, identyfikatory, literały, ograniczniki, komentarze i pragmy, a także struktu rę wyrażeń i bloków kodu.
Zestaw znaków
Język PL/SQL składa się z liter, cyfr, symboli oraz znaków białych, zgodnie z poniższą tabelą:
Typ Znaki
A-Z, a-z
0-9
Litery
CyfJy
Symbole
Znaki białe
- !®#$%~&*0_-+= 1 an:;'"<>„?t~
odstęp, tabulator, mak końca wiersza, znak powrotu karetki
Znaki wchodzą w :skład podstawowych jednostek składniowych języka: identyfikatorów, literałów, ograniczników oraz komentarzy.
Identyfikatory
Identyfikatory to nazwy obiektów języka PUSQL (ro.in. stałych, zmiennych, wyjątków, procedur, kursorów oraz słów zastrzeżonych). Mają one następujące właściwości:
• mogą liczyć co najwyżej 30 znaków,
• nie mogą zawierać znaków białych (odstępów, tabulatorów itp.),
• muszą rozpoczynać się od litery,
• mogą zawierać symbol dolara ($), podkreślenie (_) oraz hash (#),
• wielkość li ter nie gra roli.
Język PL/SQL - podstawy I 9
Korzystanie ze słów zastrzeżonych w identyfikatorach jest niewskazane i może prowadzić do trudnych w wykryciu problemów podczas kompilacji.
WSKAZÓWKA Popr1,ednie wydania niniejszej książki zawierały szczegółową listę
słów zastrzeżonych - j ednak w systemie Oracle Database 1 lg Rełease 1 l ista ta liczy ponad 1600 słów, z których aż 650 nie może służyć jako nazwy procedur lub zmiennych. Pełną listę słów zastrzeżonych można uzyskać, wyświetlaj ąc zawartość perspektywy słownika danych V$RESERVED_ WORDS. Radzimy unikać wykorąstywania tyc!h słów w charakterze identyfikatorów.
Umieszczenie identyfikatora w cudzysłowie znosi wszystkie podane wyżej ograniczenia z wyjątkiem pierwszego. Przykładowo, poprawna jest następująca deklaracja:
OECLARE " 1 •abc" VARCHAR2(100):
BEGIN IF "1 •abc" IS ~ U l l THEN
END:
Literały boolowskie, liczbowe i tekstowe
Literały to konkretne wartości reprezentowane przez identyfikatory - przykładowo, TRUE, 3.14159, 6.63E-4, 'Moby Dick' oraz NULL. Wśród literałów wyróżniamy m.in. boolowskie, liczbowe i tekstowe; brak natomiast li terałów złożonych (typy złożone otrzymują wartości poprzez operację przypisania lub za pośrednictwem konstruktorów). W przeciwieilstwie do pozostałych elementów języka PUSQL, literały zachowują rozróżnienie na duże
1 O I Oracle PL/SQL. Kieszonkowy słownik języka
i małe litery. Osadzenie apostrofu w literale tekstowym wymaga poprzedzenia go dodatkowym apostrofem.
W systemie Oracle Database ! Og (i późniejszych) możliwe jest definiowanie niestandardowych mechanizmów cytowania literałów tekstowych w poleceniach PUSQL-owych oraz SQL-owych. Aby zdefiniować własny ogranicznik literału, należy posłużyć się
składnią q' (Ii tera q oraz pojedynczy apostrof). Po tym nagłówku wprowadzamy tekst ogranicznika, a następnie jeszcze jeden apostrof: przykładowo - q' ! moj l an cuch!'. Ograniczniki NCHAR i NY ARCHAR poprzedzamy znakami nq - jak w: nq' Al ancuch ncharA ' . Stosowanie tej techniki pozwala na uproszczenie kodu, gdy w przetwarzanych łańcuchach tekstowych pojawia się wiele apostrofów. Jeśli w charakterze ogranicznika wybraliśmy jeden z czterech znaków otwierających - (, [, {, < -wówczas zamknięcie łańcucha wymaga wprowadzenia znaku komplementarnego (odpowiednio: ), ], f, >).
Poniższa tabela zawiera przykłady literałów tekstowych:
Liter al
Th at' 's Ent ert a i nment ! '
q'#That's Entertainment !#'
'"The Raven"'
' Tl='' COT6CST'''
q' $TZ='COT6CST'$'
q'CTZ='COT6CST'J'
I' I I
'''hel lo world'''
q'!' hel l o wo rl d' ! '
I' I t I I
Rzeczywista wartość
Thars Entertainment!
Thars Entertainment!
"The Raven•
TZ= 'CDT6CST'
TZ= 'CDT6CST'
TZ= 'CDT6CST'
'hello world'
'hello world'
"
Język PL/SQL - podstawy I 11
Literał Rzeczywista wartość
Q ' [I' ] I "
nq'<Cena='$')' Cena='$'
nq'-WHERE nazwa LIKE 'ń'-' WHERE nazwa UKE 'ń'
Literały liczbowe
Uzupełnianie literałów liczbowych o oznaczenia pożądanych typów danych pozwala na optymalizację programów. Aby zakwalifikować literał do wybranego typu, należy posłużyć się kropką dziesiętną lub kwalifikatorami f lub d,jak w poniższych przykładach:
Literał Typ danych
3 .14159 NUMBER
42 INTEGER
o.o NUMBER
3 .14159f BINARY FLOAT
3 .14159d BINARY DOUBLE
Oracle Database 1 Og wprowadza ki lka dodatkowych stałych:
BINARY_FLOAT_NAN (NotaNumber) BINARY_FLOAT_INFINITY BINARY _FLOAT_MAX_NORMAL BINARY _FLOAT_MIN_NORMAL BINARY_FLOAT_MAX_SUBNORMAL BINARY_FLOAT_MIN_SUB NORMAL
„.a także analogiczme stałe typu BINARY_DOUBLE.
12 I Oracle PL/SQL Kieszonkowy słownik języka
Literały DATETIME
System Oracle 9i wprowadza nowe typy danych służące do przechowywania przedziałów czasu. Li terały DATETIME stanowią
kolekcje złożone z lat i miesięcy lub dni, godzin, minut, sekund i ułamków sekund. Tego rodzaju literały należy poprzedzać słowem kluczowym INTERV AL oraz ła11cuchem tekstowym określającym charakter wprowadzonych wartości . Wszystkie przedziały czasowe wprowadzamy w kolejności większy-mniej szy :
poprawna jest deklaracja YEAR TO MONT H (lata i miesiące);
nie można natomiast posłużyć się deklaracją MONT H TO YEAR (miesiące i lata). Poniższa tabela zawiera przykłady literałów
DATETIME:
Literał Rzeczywista wartość
I NTERVAL '1 -3 ' YEAR TO MONTH 1rok i 3miesiące później
I NTERVAL '125-11 ' YEARO) 1251at i 11 miesięcy później TO MONTH
I NTERVAL ' - 18 ' MOHTH
I NTERVAL ' - 48 ' HOUR
I NTERVAL ' 7 23: 15' DAY TO MI NUTE
18 miesięcy wcześniej
48 godzin wcześniej
7 dni, 23 godziny i 15 minut później
I NTERVAL 'l 12: 30 : 10 .2 ' DAY 1dzień, 12godzin, 30 minut i 10.2 TO SECOND sekundy później
I NTERVAL '12: 30 : 10 .2 ' HOUR 12 godzin, 30minut i 10.2 sekundy TO SECOND później
Ograniczniki
Ograniczniki to symbole posiadające specjalne znaczenie: na przykład := (operator przypisania), li (operator konkatenacji) oraz
Język PL/SQL - podstawy I 13
; (ogranicznik polecenia). Poniższa tabela opisuje wszystkie ograniczniki w języku PU SQL:
Ogranicznik Opis
+
* I
**
11
: =
<> !=
Koniec polecenia lub deklaracji
Operator dodawania
Operator odejmowania
Operator mnożenia
Operator dzielenia
Operator potęgowania
Operator konkatenacji
Operator przypisania
Operator równości
Operatory nierówności
·= ; Operatory nierówności
< Operator .mniejsze od"
<=
>
>=
( i
« i »
Q . i '
nq ' i '
„
Operator .mniejsze lub równe"
Operator • większe od"
Operator • większe lub równe"
Ograniczniki wyrażeń i list
Ograniczniki etykiet
(przec:inek) Separator elementów listy
(apostroQ Ogranicznik literału
Ogranicznik literału zdefiniowany przez programistę
Ogranicznik literału NCHAR zdefiniowany przez programistę
(cudzyslów) Ogranicznik literału tekstowego
14 I Oracle PL/SQL Kieszonkowy słownik języka
Ogranicznik
=>
I* i *I
Komentarze
Opis
ldentylfikator zmiennej macierzystej
ldentylfikator atrybutu
(kropka) Identyfikator komponentu (np. rekord pole lub pakiet.element)
ldentylfikator łącza bazodanowego
Operator asocjacji
(dwie kropki) Operator zakresu (wykorzystywany w pętli FOR)
Prefiks wiersza komentarza
Ograniczniki komentarza wielowierszowego
Komentarze to fragmenty kodu, które mają za zadanie zwiększać jego czytelność . Treść komentarzy jest ignorowana przez kompilator.
Wiersz komentarza rozpoczyna się od podwójnego dywizu (--) i koilczy znakiem k.011ca wiersza. Wszystkie znaki pomiędzy operatorem -- a koilcem wiersza są ignorowane przez kompilator.
Komentarz wielowierszowy rozpoczyna się sekwencją / *, a koilczy sekwencją */ (tego rodzaju ograniczniki mogą też służyć do oznaczania komentarza jednowierszowego). Poniższy blok kodu demonstruje zastosowanie obydwu rodzajów komentarzy:
OECLARE -- Owa dywi zy oznaczaj a poj edynczy wiersz komentarza / * Ta sekwencja oznacza rozpoczec i e komentarza
wielowierszowego jego zakonczeni e wymaga wprowadzeni a sekwencj i */
Język PL/SQL - podstawy I 15
Komentarzy wielowierszowych nie można osadzać w innych komentarzach wielowierszowych - należy więc zachować ostroż
ność przy komentowaniu wierszy, które już zawierają komentarze. Oto przykład :
OECLARE /* Ta sekwencja oznacza rozpoczecie komentarza wi el owi erszowego
/* Taki e osadzeni e komentarza jest niepoprawne ! */ jego zakonczeni e wymaga wprowadzeni a sekwencj i */
/* Ta sekwencja oznacza rozpoczecie komentarza wi el owi erszowego -- Taki e osadzenie komentarza jest dopuszcza l ne . jego zakonczeni e wymaga wprowadzeni a sekwencj i */
Pragmy
Słowo kluczowe PIRAGMA służy do uzupełniania kodu o specjalne dyrektywy kompilatora. PU SQL przewiduje pięć rodzajów pragm:
AUTONOMOUS_TRANSACT/ON Ta pragma informuje kompilator, że dana funkcja, procedura, blok anonimowy najwyższego poziomu, metoda obiektu lub wyzwalacz powinien zostać uruchomiony w odrębnej przestrzeni transakcji. Więcej na ten temat powiemy w dziale Integracja z bazą danych.
EXCEPTION_INIT Ta pragma nakazuje kompilatorowi skojarzenie podanego kodu błędu z identyfikatorem zadeklarowanym jako EXCEPTION (wyjątek) w bieżącym programie lub dowolnym dostępnym pakiecie. Więcej na ten temat powiemy w dziale Obsłu
ga wyjątków.
16 Oracle PL/SQL Kieszonkowy słownik języka
INLINE Ta pragma nakazuje kompilatorowi zastąpienie wywołania
podprogramu kopią jego kodu. Więcej na temat optymalizacji powiemy w dziale Kompilator optymalizujący.
RESTRICT_REFERENCES Ta pragma określa tzw. stopień czystofci programu, czyli stopień uniezależnienia jego działania od operacji na tabelach bazodanowych oraz zmiennych pakietu. Więcej na ten temat powiemy w dziale Wywoływanie funkcji PUSQL-owych w wyrażeniach SQL-owych.
SERIALLY_REUSABLE Ta pragma informuje system, że dane pakietu nie powinny zostać zachowane pomiędzy kolejnymi wywołaniami. Rezultatem jej zastosowania jest zmniejszenie zapotrzebowania aplikacji na pamięć operacyjną w sytuacji, gdy dane pakietu są
potrzebne tylko podczas wywołania wybranego komponentu, a nie w trakcie całej sesji. Więcej na ten temat powiemy w dziale Pakiety.
Polecenia Każdy program PU SQL-owy składa się z polece1i. Każde polecenie kończy ogranicznik w postaci średnika. Kompilator języka PUSQL ignoruje wszystkie znaki ko11ca wiersza z wyjątkiem tych, które kończą komentarze jednowierszowe (rozpoczęte sekwencją --).
Struktura blokowa
Każdy program PUSQL-owy jest blokiem złożonym ze standardowego zbioru elementów identyfikowanych za pośrednictwem słów kluczowych (patrz ilustracja I). Blok wyznacza zakres
Język PL/SQL - podstawy I 17
zadeklarowanych w nim elementów oraz sposób obsługi i propagacj i wyjątków. Bloki mogą być anonimowe lub nazwane. Bloki nazwane dzielimy na funkcje, procedury, pakiety i wyzwalacze.
Nagłówek błotu
IS
Se tej a dekłaracj 1 ]
BEGI N Sekcja wykonania
EXCEPTI ON Sekcja obs ług1 vyHt kóv
ENO:
/lustracja I. Struktura bloku w języku PUSQL.
Oto przykład bloku anonimowego:
DECLARE dzi si aj DATE DEFAULT SYSDATE:
BEGI N - - wyswi et l da t e . DBMS_OUTPUT. PUT_ LI NE ( ' Dzi si aj mamy ' 11 dzi si aj ) ;
END ;
Analogiczny blok nazwany ma następującą postać :
CREATE OR REPLACE PIROCEOURE wyswi etl_dat e I S
dzi si aj DATE DEFAULT SYSDATE: BEGI N
- - wyswi et l da t e . DBMS_OUTPUT. PUT_ LI NE ( ' Dzi si aj mamy ' 11 dzi si aj ) ;
END wyswi etl _dat e ;
18 I Oracle PL/SQL Kieszonkowy słownik języka
Poniższa tabela zawiera opis sekcji wchodzących w skład bloku kodu w języku PUSQL:
Sekcja Opis
Nagłówek Wymagany w blokach nazwanych. Określa nazwę programu. Bloki anonimowe są pozbawione nagłówka -zaczynają się od słowa kluczowego DECLARE Oeśli zawierają sekcję deklaracji) lub BEGIN (w przeciwnym wypadku).
Deklaracje Sekcja opcjonalna. Zawiera deklaracje zmiennych, kursorów, typów oraz programów lokalnych wykorzystywanych w sekcjach wykonania oraz obsługi wyjątków.
Wykonanie Sekcja opcjonalna w specyfikacjach pakietów oraz typów. Zawiera polecenia wykonywane w chwili wywołania danego bloku.
Obsługa wyjątków Sekcja opcjonalna. Zawiera logikę obsługi błędów, które mogą wystąpić w sekcji wywołania.
Zmienne i dane programu Większość programów PU SQL-owych służy do komunikacji z bazą danych. Obróbka danych zawartych w bazie wymaga deklarowania w programach zmiennych oraz struktur danych, a następnie przetwarzania ich z użyciem poleceń języka PUSQL.
Zmienna to instancj a struktury danych zadeklarowanej w bloku kodu (lokalnie lub w ramach pakietu). Wartości zmiennych mogą ulegać zmianom - chyba że dana zmienna została zadeklarowana z użyciem słowa kluczowego CONSTANT (wówczas nazywamy ją stalą).
Poniższa tabela opisuje rozmaite rodzaje zmiennych w programach PUSQL-owych:
Zmienne i dane programu I 19
Rodzaj Opis
Wartość skalarna Zmienna o pojedynczej wartości (np. liczba, data lub wartość boolowska).
Wartość złożona Zmienna złożona z kilku odrębnych wartości (np. rekord, kolekcja lub instancja typu obiektowego). Więcej na temat tych zmiennych powiemy w działach Rekordy w PUSQL-u, Kolekcje w PUSQL-u oraz Mechanizmy obiektowe.
Wskażnik Logiczny wskażnik wybranej wartości lub kursora.
LOB Zmienna zawierająca identyfikator typu wielkoobiektowego (ang. large object; LOB).
Zmienne skalarne
Zmienne skalarne dzielą się na cztery grupy: liczby, znaki, daty oraz wartości boolowskie . W ramach poszczególnych grup możliwe jest ograniczanie rozmiarów oraz zakresu wartości zmiennych.
Typy liczbowe
Zmienne liczbowe mogą przechowywać liczby rzeczywiste, całkowite
oraz zmiennoprzecinkowe. Istnieje wiele typów danych służących do zapisywania liczb stało- i zmiennoprzecinkowych (m.in. NUMBER, DEC, DECIMAL, NUMERIC, FLOAT, REAL oraz DOUBLE PRECISION). Maksymalna precyzja wartości typu NUMBER to 38 cyfr (co odpowiada zakresowi 1.0E-129-9.999E12S).
Deklaracje typu NUMBER można rozszerzać o wymaganą precyzję oraz skalę:
NUHBER(precyzj a • ska 1 a)
gdzie precyzja to wymagana liczba cyfr, zaś skala to liczba cyfr znaczących na prawo (skala dodatnia) lub na lewo (skala ujemna)
20 I Oracle PL/SQL. Kieszonkowy słownik języka
od przecinka. Dopuszczalne wartości parametru skala to -84 -127. Poniższa tabela przedstawia przykłady rozmaitych precyzji i skal typu NUMBER:
Deklaracja Wartość przypisana Wartość zapisana
NUMBER 6.02 6.02
NUMBER(4) 8675 8675
NUMBER(4) 8675309 Błąd
NUMBER(12,5) 3.14159265 3.14159
NUMBER(12,-5) 8675309 8700000
System Oracle udostępnia wiele typów danych służących do przechowywania 32-bitowych liczb całkowitych: BINARY_INTEGER, INTEGER, INT, SM ALLINT, NATURAL, NATURALN, POSITIVE, POSITIVEN, SIGNTYPE oraz PLS_INTEGER. W wersjach systemu starszych od Oracle Database l Og wszystkie te typy (z wyjątkiem PLS_INTEGER) były obsługiwane przez wspólną bibliotekę arytmetyczną (napisaną w języku C na potrzeby implementacji typu NlJMBER). Typ PLS_INTEGER (oraz - poczynając od systemu Oracle Database 1 Og - wszystkie inne typy całkowitoliczbowe) korzystają ze zoptymalizowanej arytmetyki maszynowej.
Całkowitoliczbowe typy binarne służą do przechowywania liczb całkowitych z przedziału -2"+ I - 231- 1. Ich podtypy to: NATURAL (od O do 231
- l ) oraz POSITIVE (od 1 do 231- l ), wraz
z wariantami NOT NULL (NATURALN i POSITIVEN). SIGNTYPE ogranicza się do trzech wartości (-1, O, 1 ), zaś
PLS_INTEGER to alias typu BINARY _INTEGER.
SIMPLE_INTEGER - nowy typ wprowadzony w systemie Oracle Database I l g - ma ten sam zakres, co BINARY _INTEGER, lecz
Zmienne i dane programu I 21
nie zezwala na wprowadzanie wartości NULL i nie powoduje wystąpienia wyjątku w przypadku przekroczenia zakresu: 2147483647+1 daje -2147483648 (wartość ujemna!). Korzystanie z typu SIMPLE_INTEGER może znacząco przyspieszyć działanie
kompilowanego kodu PUSQL-owego.
Liczby zmiennoprzecinkowe zgodne ze standardem IEEE 754 są dostępne zarówno w SQL-u, jak i w PU SQL-u. Ich podtypy BINARY_FLOAT (pojedyncza precyzja) orazBINARY_DOUBLE (podwójna precyzja) cechują się niewielkim zapotrzebowaniem na pamięć operacyjną·; są więc często stosowane w aplikacjach naukowych lub inżynieryjnych, tam, gdzie trzeba wykonywać wiele obliczeil arytmetycznych lub porównywać wartości liczbowe z nieskończonością lub wartością NaN. W przeciwieilstwie do rodziny NUMBER, obydwa wymienione podtypy korzystają
z precyzji binarnej (nie dziesiętnej); należy więc unikać ich stosowania w aplika cjach finansowych, wymagających precyzyjnych operacji na ułamkach dziesiętnych.
Poniż.sza tabela przedstawia typy liczbowe języka PL/SQL zgodne z typami ANSI i IBM:
• precyzja to precyzja danego podtypu,
• skala to skala danego podtypu,
• precyzja_binarna to precyzja binarna danego podtypu.
Typ danych PL/SQL Kompatybilność Typ danych Oracle Database
DEC (precyzja, skala) ANSI NUMBER (precyzja, skala)
DECIMAL (precyzja, skala) IBM NUMBER (precyzja, skala)
DOUBLE PRECISION ANSI NUMBER
FLOAT lprecyzja_binama) ANSI, IBM NUMBER
INT ANSI NUMBER(38)
22 I Oracle PL/SQL. Kieszonkowy slownik języka
Typ danych PL/SQL Kompatybilność Typ danych Oracle Database
INTEGER ANSI, IBM NUMBER(38)
NUMERIC (precyzja, skala) ANSI NUMBER (precyzja, skala)
REAL ANSI NUMBER
SMALLINT ANSI, IBM NUMBER(38)
BINARY FLOAT IEEE754 BINARY FLOAT
BINARY DOUBLE IEEE754 BINARY DOUBLE
Typy znakowe Typy znakowe służą do przechowywania danych tekstowych. Podobnie, jak w przypadku typów liczbowych, wyróżniamy
szereg podtypów:
Rodzina Opis
CHAR Łańcuch alfanumeryczny o stałej długości. Dopuszczalne rozmiary to 1-32767 bajtów (więcej niż bazodanowy limit 4000 znaków).
VARCHAR2 Łańcuch alfanumeryczny o zmiennej długości. Dopuszczalne rozmiary to 1-32767 maków (więcej niż bazodanowy limit 4000 znaków).
LONG Łańcuch alfanumeryczny o zmiennej długości. Dopuszczalne rozmiary to 1-32760 maków. Typ LONG służy głównie do zachowania kompatybi lności z poprzednimi wersjami systemu. Oo przechowywania długich łańcuchów alfanumerycznych zaleca się obecnie stosowanie typu CLOB.
RAW Łańcuch binarny o zmiennej długości. Dopuszczalne rozmiary to 1-32767 znaków (więcej niż bazodanowy limit 2000 znaków). Typy RAW nie podlegają konwersji na inne zestawy znaków.
Zmienne i dane programu I 23
Rodzina Opis
LONG RAW Łańcuch binarny o zmiennej długości. Dopuszczalne rozmiaiy to 1-32760 znaków. Typ LONG RAW służy głównie do zachowania kompatybilności z poprzednimi wersjami systemu. Do przechowywania długich łańcuchów binarnych zaleca się obecnie stosowanie typów BLOB i BFILE.
ROWID Łańcuch binarny o stałej długości. Każdy wiersz w bazie danych ma swój własny fizyczny adres (zwany ROWID). ROWID dzieli się na cztery sekcje, wyrażone w formacie base64:
UROWID
OOOOOOPPPPBBBBBB'vlfłNIN
Gdzie: • 000000 to numer obiektu, • PPPP to numer pliku {bezwzględny lub względny),
• BBBBBB to numer bloku w pliku, • WWW to numer wiersza w bloku.
Uniwersalny ROWID. Łańcuch szesnastkowy o zmiennej długości określający logicmy, fizyczny lub zewnętrzny (tj. niepochodzący z systemu Oracle) identyfikator wiersza. Dopuszczalna długość to 4000 ba~ów.
Typy znakowe Unicode
Standardowe zestawy znaków WE8MSWIN1252 oraz WE8IS08859P2 nie uwzględniają niektórych języków (np. chiilskiego i greckiego). Obsługa dodatkowych języków wymaga stosowania dwóch zestawów znaków: bazodanowego zestawu znaków oraz zestawu Unicode (znanego również pod nazwą narodowego zestawu znala5w - ang. national character set, NLS).
Do zapisywania danych w formacie Unicode służą dwa typy NLS: NCHAR oraz NVARCHAR2. Wartości NCHAR to łailcuchy
tekstowe o stałej długości (do 32767 znaków), zaś wartości
NY ARCHAR2 to ła11cuchy o zmiennej długości (również do 32767 znaków).
24 I Oracle PL/SQL Kieszonkowy słownik języka
Daty i godziny
Do zapisywania dat i godzin służą typy DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE oraz TIMESTAMP WIT H LOCAL TIME ZONE. Istnieją ponadto dwa specjalne typy, służące do przechowywania przedziałów czasowych: INTERVAL YEAR TO MONTH oraz INTERV AL DAY TO SECOND.
Zmienne typu DATE obejmują datę oraz godzinę. Dopuszczalne są wartości z przedziału 1 stycznia4712 p.n.e. - 31 grudnia 9999 n.e. Wartość DAT!E składa się z wieku, roku, miesiąca, dnia, godziny, minuty oraz sekundy. Typ DATE nie obsługuje ułamków sekund (większą precyzję zapewniają typy T IMESTAMP). W braku zdefiniowanej przez użytkownika godziny przyjmowana jest wartość domyślna 00:00:00 (północ) .
Wartości TIMESTAMP służą do przechowywania dat i godzin z dokładnością do ill łamków sekund. Domyślna dokJadność to 6 cyfr po przecinku; można jednak zmieniać ją w zakresie 0-9 cyfr po przecinku, korzystając z następującej składni :
OECLARE moja_godz i na_dekl TIM ESTAMP(9) ; moja_godz i na_domysl na TIMESTAMP; --domys l na do kl adnosc
--(6 mi ejsc po przeci nku)
Typ TIMEST AMP WITH TIME ZONE przypomina T IMEST AMP, lecz obejmuje również przesunięcie względem tzw. czasu uniwersalnego UTC (zasadniczo tożsamego z czasem Greenwich). Podobnie, jak w przypadku typu TIMESTAMP, domyślna dokładność (do 6 cyfr po przecinku) może zostać zmieniona w zakresie 0-9 cyfr:
OECLARE moja_godzi na_dekl TIM ESTAM P(9) WITH TIME ZONE; moja_godzi na_domysl na TIMESTAMP WITH TIME ZONE:
Zmienne i dane programu I 25
Typ TIMESTAMP WITH LOCAL TIME ZONE rówmez uwzględnia przesunięcie względem strefy UTC. Różnica między tym typem a wymienionym wyżej typem TIM EST AMP WIT H TIME ZONE polega na sposobie zapisu danych w bazie. Wartości
TIMESTAMP WIT H LOCAL TIME ZONE podlegają konwersji na strefę czasową odpowiednią dla bazy danych i zostają w niej zapisane bez przesunięcia, zaś dane odczytywane z bazy są konwertowane do lokalnej strefy czasowej sesji.
Przesunięcie względem strefy UTC może zostać wyrażone
w godzinach i minutach, lub też w postaci kodu strefy czasowej (nazwy stref umieszczono w perspektywie słownika danych V$TIMEZONE_NAMES), wraz z opcjonalnym kodem przesunięcia letniego. Oto przykład:
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT= '' DO-Mon-YYYY HH24:MI:SS.FF TZR' :
DECLARE moja_data TIMESTAMPC4l WITH TIME ZONE;
BEGIN moja_data := '31 -0EC-2008 07:32:45.1234 US /Paci fic';
Wartości INTERVAL YEAR TO MONTH określają przedział czasu wyrażony w latach i miesiącach :
DECLARE moj_przedzi al INTERVA L YEAR TO MONTH:
BEGIN moj_przedzi al := INTERVAL '1-6' YEAR TO MONTH:
Wartości INTERVAL DAY TO SECOND określają przedział czasu wyrażony w dniach, godzinach, minutach, sekundach oraz ułamkach sekund:
DECLARE moj_przedzi al INTERVA L OAY TO SECOND;
26 I Oracle PL/SQL Kieszonkowy słownik języka
BEGIN moj_przedzi al := INTERVAL '2 10 :32 :15 .678' DAY TO SECOND:
Typ boolowski
Typ BOOLEAN obejmuje trzy wartości : TRUE, FALSE oraz NULL. Zmienne boolowskie wykorzystuje się przeważnie w strukturach kontrolnych (np. w wyrażeniach warunkowych IF„.THEN oraz w pętlach).
Poniższe tabele przedstawiają rezultaty logicznych operacji AND, OR i NOT na rozm aitych wartościach boolowskich, zgodnie ze stosowaną w językUJ PUSQL logiką trójwartościową:
AND
TRUE FALSE NULL
OR
TRUE FALSE NULL
NOT(TRUE)
FALSE
TRUE
TRUE FALSE NULL
TRUE
TRUE TRUE TRUE
NOT(FALSE)
TRUE
FALSE
FALSE FALSE FALSE
FALSE
TRUE FALSE NULL
NULL
NULL
FALSE NULL
NULL
TRUE NULL
NULL
NOT(NULL)
NULL
Zmienne i dane programu I 27
Typy LOB
PUSQL obsługuje szereg typów wielkoobiektowych (ang. large object; LOB), zdolnych przechowywać obiekty o rozmiarach do 4 GB. W przeciwiel'istwie do zmiennych skalarnych, zmienne typu LOB nie zawierają danych obiektu, a jedynie wskaf,Jziki do danych. Obsługa typów LOB odbywa się za pośrednictwem wbudowanego w system Oracle pakietu DBMS_LOB. Oto poszczególne rodzaje typów LOB:
BFILE Wskaźnik pliku dyskowego. Dane typu BFILE są przeznaczone wyłącznie do odczytu i nie pod legają zapisaniu w bazie danych.
BLOB Wskaźnik dużego obiektu binarnego zapisanego w bazie danych.
CLOB Wskaźnik dużego obiektu alfanumerycznego zapisanego w bazie danych.
NCLOB Wskaźnik dużego obiektu alfanumerycznego Unicode zapisanego w bazie da~1ych .
Niejawne konwersje typów Gdy PUSQL stwierdza konieczność konwersji typów danych, podejmowana jest próba przeprowadzenia jej w sposób automatyczny. Ilustracja 2 przedstawia niejawne konwersje obsługiwane
przez PUSQL. Należy pamiętać, że nie wszystkie wartości typu źródłowego mogą zostać skonwertowane na typ docelowy -przykładowo, próba konwersji wartości BINARY_FLOAT_NAN na typ liczbowy spowoduje wystąpienie wyjątku INY ALID NUMBER.
28 I Oracle PL/SQL Kieszonkowy słownik języka
Wartośc i NULL
Wartości nieznane są w języku PL/SQL reprezentowane przez słowo kluczowe NULL. Ponieważ NULL oznacza w istocie brak wartofci, nie jest on równy jakiejkolwiek innej wartości (nawet innemu NULL). Większość funkcji zwraca NULL, gdy przekażemy do nich argument NULL (wyjątek stanowią funkcje NYL, NYL2, CONCAT oraz REPLACE). Z uwagi na niemożność porównywania ze sobą wartości NULL, sprawdzenie, czy dana zmienna zawiera NULL, wymaga zastosowania operatorów IS NULL oraz IS NOT NULL.
Oto przykład zastosowania składni IS NULL:
BEGI N IF moja_zmienna IS NULL THEN
Deklaracje zmiennych
Zmienne muszą być deklarowane w sekcji deklaracji bloku (lub pakietu - w przypadku zmiennych globalnych). Zadeklarowanie zmiennej powoduje zarezerwowanie dla niej miejsca w pamięci oraz nadanie jej nazwy. Oto składnia deklaracji zmiennej:
nazwa_zmi ennej [ CONSTANTJ typ_danych [NOT NULU [ [ : = I OEFAULT }wartoś ć_początkowa ] ;
Zmienne i dane programu I 29
~ • • • • • •
~ • • 21
" • • • • • •
~ • • •
~ • • • • • • „ 9 • • • • • • • • • • • •
m ~~ • • • • • • • • • •
~1 • • • • • • • • • • ~· ~ • • • • • • • • • • ~ -I~ • • • • • • • • •
~g • • • • • • • • • "'"' e;
!!I !! • • • • • • • • •
a ~ • • • • • "' e; ~\;;I
"' ~ ~ • • • • S!
~ • • • • • • • • • • • • • • • • "' ~ ~
• • • • • • • • • • • • • • • •
I • • • • • • • • • • • • • • • • ~
~ ~ • • • • • • • • • • • • • • •
ot ~ I $.- im ~ ~ r::~ ! ro~ rolli ~! ~ I a ~ ;o ~ F!\;; !~ !§ )2\;; "' ~ !li ~ - ~ ~" 9 ;! ~
/lustracja 2. Niejawne komversje typów danych obsługiwane przez język PUSQL.
30 Oracle PL/SQL. Kieszonkowy słownik języka
Deklaracje z ograniczeniami
Deklaracjom zmiemnych mogą towarzyszyć ograniczenia zwią
zane z rozmiarami, skalą lub precyzją danych przechowywanych w deklarowanej zmiennej. Oto garść przykładów :
sprzedaz i d_pracowni ka numer_dz i al u tytul_ks i azki
NUM BER<l5 ,2): VA RCHAR2(9): NUM BER: VA RCHAR2:
zmienna ograniczona zmienna ograniczona zmienna bez ograni czen dekl aracj a ni epoprawna
Zmienne ograniczoJJe wymagają mmeJ pamięci operacyjnej, mz zmienne pozbawione ograniczeń. Niektóre typy danych wymagają podania ograniczeń (przykładowo, deklaracji zmiennej typu V ARCHAR2 musi towarzyszyć wartość określająca maksymalny rozmiar ła11cucha tekstowego).
Stałe
S łowo kluczowe CONSTANT umieszczone w deklaracji zmiennej oznacza, że jej wartość domyślna (która staje się wymagana) nie może ulec zmianie. Oto przykład :
mini ma l ne_zamowi eni e NUMB ER(l) CONSTANT : = 5:
Wartości d omyślne
Zadeklarowanie zn:tiennej w1ąze się z wprowadzeniem do meJ wartości NULL. 1 Pod tym względem PL/SQL odróżnia się od języków, takich jak C czy Ada, gdzie nie dochodzi do automatycznej inicjalizacji zmiennych. Aby przypisać nowej zmiennej wartość inną niż NULL, można posłużyć się operatorem przypisania(:=) lub słowem kluczowym DEFAULT:
1 Istnieje jeden wyjąlek od tej reguły: tablica a'ocjacyjna, która nigdy nie może być r<lwna NULL. Nowo 7.adeklarowane tablice a'ocjacyjne są puste (pozbawione elementów skladowych), lecz nie mają wartości NULL.
Zmienne i dane programu 31
l icznik BINARY_INTE•GER :=O; priorytet VARCHAR2(8) OEFAU LT 'NISKI' ;
Ograniczenie NOT NULL umieszczone w deklaracji zmiennej oznacza, że zmienna ta nie może przyjmować wartości NULL -w takim wypadku wymagane jest wprowadzenie wartości domyślnej.
Deklaracje dowiązane
Atrybut %TYPE u możliwia dowiązanie typu danych wybranej zmiennej skalarnej do typu innej zmiennej lub do wiersza w tabeli bazodanowej. Atrybut %ROWTYPE pozwala na dowiązanie
deklaracji rekordu do kursora lub tabeli (więcej na ten temat w dziale Rekordy w PUSQL-u).
Poniższy blok kodu zawiera ki lka przykładów dowiązań :
OECLARE calkowi t a_sprzedaz NUMBERC20,2); - - dowi azanie do zm i ennej PL/SQL. mi es i eczna_sprzedaz ca l kowita_sprzedaz%TY PE:
- - dowi azanie do ko l umny bazodanowej v_nazwprac pracown i cy .nazwiskoXTYPE:
CURSOR mojkursor IS SELECT * FROM pracowni cy;
dowi azanie do kursora mojrekord mojkursor%ROWTY PE:
Klauzula NOT NUL L w deklaracji zmiennej dowiązanej (ale nie w definicji kolumny bazodanowej) oznacza, że w deklaracji typu źródłowego musi znaleźć się wartość domyślna. Zauważmy, że
wartość domyślna zmiennej dowiązanej może odbiegać od wartości domyślnej jej typ u źródłowego:
32 I Oracle PL/SQL Kieszonkowy słownik języka
ca l kowi ta_sprzedaz NUM BER<20,2) NOT NULL DEFAU LT O; miesieczna_sprzedaz calkowita_sprzedaz%TYP E DEFAULT 10;
Podtypy definiowane przez programistę
PUSQL pozwala na definiowanie własnych, nieograniczonych podtypów skalarny,ch. Każdy podtyp stanowi alias wybranego źródłowego typu da~1ych :
CREATE OR Rf PLACE PACKAGE typy_standa rdowe IS
- - dekl arujemy typy global ne SUBTY PE kwota_t IS NUMBER:
END typy_standardowe;
CREAH OR REPLACE PIROCEOURE l i cz_pieniadze IS
- - ko rzys t amy z zadeklarowanego wyzej typu gl obal nego kredyt typy_st andardowe . kwota_t;
Typ ograniczony stanowi podzbiór typu źródłowego: przykładowo, POSITIVE to ograniczony podtyp BINARY_INTEGER, uwzględniający wyłącznie liczby dodatnie. Oto deklaracja typu POSITIVE w pakiecie STANDARD:
SUBTYPE POSITIV[ IS BINARY_INTEG ER RANGE 1 . . 2147483647;
Możliwe jest też definiowanie własnych podtypów ograniczonych:
PACKAGE typy_st anda rdowe IS
SUBTY PE pi eni adze_t IS NUMBE RC 15,2): END:
Zmienne i dane programu I 33
Wyrażenia warunkowe i sekwencyjna kontrola przepływu
PL/SQL udostępnia wyrażenia warunkowe (IF, CASE) oraz sekwencyjne struktury kontrolne (GOTO, NU LL) .
Wyrażenia warunkowe
Istnieje kilka niezaJeżnych wariantów wyrażeń IF-T HEN-ELSE oraz CASE.
lf·THEN
I F wa runek TH EN polecenia do wykonani a
END IF;
Przykład :
IF typ_kl ienta='VIP' THEN generuj_raport( ' oferta_specjal na') ;
END IF;
lf· THEN-ELSE
I F wa runek TH EN TRUE - po 1 ecen i a do wykonan i a
ELSE FALSE/NULL - polecenia do wykonani a
END IF;
Przykład :
IF typ_kl ienta='VIP' THEN generuj_raport( ' oferta_specjal na') ;
ELSE
34 I Oracle PL/SQL. Kieszonkowy słownik języka
generuj_raport( ' ofert a_standardowa'); END ! F;
lf· THEN-ELSIF
IF wa runek· ! THEN pol ecenia·!
ELSI F warunek-N THEN pol ecenia-N
IELSE polecenia ELSE J
END ! F;
Przykład :
IF typ_kl ienta='V! P' THEN generuj_raport( ' ofert a_specja l na') ;
ELSIF kl i en t_pr i oryte t owy THEN generuj_raport( ' ofert a_rozszerzona');
ELSE generuj_raport( ' ofert a_standardowa');
END ! F;
Polecenie CASE
Istnieją dwa rodzaje poleceń CASE: proste i przeszukiwane.
Proste polecenie CASE przypomina polecenie IF-THEN-ELSIF: zaczyna się od słowa kluczowego CASE, po którym następuje wyrażenie porównywane z każdą z wartości zawartych w kolejnych klauzulach W HEN. Po odnalezieniu pasującej wartości
system wykonuje polecenia umieszczone w odpowiedniej klauzuli WHEN; następnie zaś kontynuuje wykonanie programu, poczynając od klauzuli END CASE. Oto przykład :
CASE i d_reg i onu WHEN ' NE ' TH EN
Wyrażenia warunkowe i sekwencyjna kontrola przepływu I 35
kierownik:= 'JAN'; WHEN 'SE' THEN
kierownik:= 'STEFAN'; ELSE kierownik ::= 'ROMAN ' :
END CASE:
Jeżeli wyrażenie podane po słowie kluczowym CASE ma wartość
NULL, wówczas jedyną wykonywaną klauzulą jest klauzula ELSE (nie można posługiwać się klauzulą WHEN NULL, gdyż wartości NULL nie podlegają „porównywaniu" z innymi wartościami NULL).
Zarówno polecenia CASE, jak i wyrażenia CASE (opisane w kolejnym dziale) powinny zawierać klauzulę ELSE, wykonywaną, gdy żadna z podanych klauzul WHEN nie odpowiada wyrażeniu wprowadzonemu po słowie kluczowym CASE (w przeciwnym razie system wygeneruje wyjątek).
Przeszukiwane polecenie CASE nie zawiera wyrażenia kontrolnego - w jego strukturze każda klauzula WHEN stanowi pełne wyrażenie boolowskie. System wykona kod pierwszej klauzuli, której warunek zwróci wartość TRUE; następnie zaś będzie
kontynuował wykonywanie programu, poczynając od klauzuli END CASE:
CASE WHEN id_regionu = 'EAME' THEN
kierownik := 'PIOTR'; WHEN dzia l = 'SPRZEDAZ' THEN
kierownik := 'ANNA'; ELSE kierownik ::='ROBERT':
END CASE:
36 I Oracle PL/SQL Kieszonkowy słownik języka
Wyrażeni e CASE
Istnieją dwa rodzaje wyrażell CASE: proste i przeszukiwane. Wyrażenia CASE można umieszczać wszędzie tam, gdzie dopuszczalne jest wprowadzenie wyrażenia zwracającego wartość (zarówno w kodzie PUSQL-owym, jak i w zapytaniach SQL-owych).
Proste wyrażenie C ASE pozwala na uzależnienie wartości wynikowej od wartości pewnej zmiennej wejściowej . Poniższy przykład ukazuje zastosowanie wyrażeni a CASE w połączeniu
z pakietem DBMS_OUTPUT do wyświetlenia wartości zmiennej boolowskiej. Proced ura DBMS_OUTPUT.PUT_LINE w swojej standardowej wersj i nie obsł uguje typów boolowskich - nasz program przekształca zatem zawartość zmiennej na łallcuch
tekstowy:
DECLARE bool ean_true BOOLEAN := TRUE : bool ean_fal se BOOLEAN := FALSE: bool ean_nul l BOOLEAN:
FUNCTION bool ean_do_varchar2 (f l aga IN BOOLEAN) RETURN VARCHAR2 IS
BEGIN RETU RN
CASE f l aga
END; END;
WH EN TRUE THEN 'True' WH EN FALSE THEN ' Fal se ' ELSE ' NULL'
BEGIN OBMS_OUTPUT.PUT_ LINE (bool ean_do_varchar2
(bool ean_true )) ; OBMS_OUTPUT.PUT_ LINE (bool ean_do_varchar2
(bool ean_fa l se) ):
Wyrażenia warunkowe i sekwencyjna kontrola przepływu I 37
OBMS_OUTPUT. PUT_LINECboo l ean_do_varchar2 Cbool ean_nul 1 )) :
END :
Przeszukiwane wyrażenie CASE bada wartości logiczne zbioru podwyrażell i w momencie natrafienia na podwyrażenie prawdziwe, zwraca przypisaną mu wartość wynikową. Poniższy
program oblicza wysokość premii w oparciu o zarobki pracownika:
OECLARE pobory NUMB ER : = 20000: i d_pracownika NUM BER : = 36325 :
PROCEOURE udzi el_premi i ( i d_p rac IN NUM BER. s t awka IN NUM BER> IS
BEGIN OBMS_OUTPUT. PUT_LINE ( id_prac): OBMS_OUTPUT. PUT_LINE (s t awka):
END:
BEGIN udz i el_premi i ( i d_p racowni ka.
END:
CASE WHE N pobory >= 10000 ANO pobory <= 20000 THEN 1500 WHE N pobory > 20000 ANO pobory <= 40000 THEN 1000 WHE N pobory > 40000 THE N 500 ELSE O
END):
Sekwencyjne struktury kontrolne
PL/SQL obsługuje polecenia GOTO oraz NULL, służące do sekwencyjnego stero wania logiką aplikacji.
38 I Oracle PL/SQL Kieszonkowy słownik języka
GOTO Polecenie GOTO powoduje bezwarunkowy przeskok do podanej etykiety. Po etykiecie powinno następować przynajmniej jedno wykonywalne polecenie (może być nim NULL). Składnia GOTO jest następująca:
GOTO etyk i et a :
Oto przykład :
BEGIN
END
GOTO drugi_napis:
DBHS_OUTPUT. PUT_LINE ( 'Ta li ni jka nigdy nie zostani e wykonana.'):
<<drugi_napis>> DBMS_OUTPUT.PUT_ LIN EC' Tu jestesmy!'):
Z poleceniem GOTO wiąże się kilka ograniczeil:
• GOTO pozwala na opuszczenie wyrażenia IF, pętli LOOP lub bloku zagnieżdżonego, lecz nie umożliwia przeskoku do wnętrza wyrażenia IF, pętli LOOP lub bloku zagnieżdżonego.
• GOTO nie umożliwia przeskoku z jednego rozgałęzienia
wyrażenia IF do innego (nie można np. przeskoczyć z klauzuli THEN do klauzuli ELSE).
• GOTO nie umożliwia opuszczenia podprogramu ani przeskoku do innego podprogramu.
• GOTO nie umożliwia przeskoku z sekcji obsługi wyjątków do sekcji wykonania w bloku PUSQL-owym.
• GOTO nie umożliwia przeskoku z sekcji wykonania do sekcji obsługi wyjątków w bloku PUSQL-owym (choć można to zrobić za pomocą polecenia RAJSE).
Wyrażenia warunkowe i sekwencyjna kontrola przepływu I 39
Korzystanie z GOT O prowadzi do zagmatwania logiki aplikacji; należy więc unikać jego stosowania, gdy nie ma po temu wyraźnej przyczyny.
NULL
NULL jest wykonywalnym poleceniem PUSQL-a, które nie pociąga za sobą żadnej czynności. Przydaje się w połączeniu
z poleceniem GOTO (po każdej etykiecie musi następować przynajmniej jedno polecenie wykonywalne); może też służyć do zwiększania przejrzystości struktur IF-THEN-ELSE:
IF : raport .wybor = 'SZCZEGOL' THEN generuj_raport_szczegol owy;
ELSE NULL:
ENO IF;
Pętle
Polecenie LOOP umożliwia wielokrotne wykonanie podanego bloku kodu. Istnieją trzy rodzaje pętli: pętle proste (nieskończone), pętle FOR oraz pętle WHILE.
Do bezpośredniego opuszczenia pętli służy polecenie EXIT , natomiast polecenie CONTINUE (wprowadzone w systemie Oracle Database 1 lg) powoduje natychmiastowe przejście do kolejnej iteracji pętli .
Pętle proste
LOOP pol ecenia_wykonywa lne
ENO LOOP :
40 I Oracle PL/SQL Kieszonkowy słownik języka
Pętla prosta powinna zawierać polecenie EXIT lub EXIT WHEN (w przeciwnym razie będzie wykonywana w nieskończoność) .
Z pętli prostych korzystamy, gdy dana sekwencja poleceń powinna zostać wykonana przynajmniej jeden raz:
LOOP FETCH f irmy_cur INTO rek_firmy; EXIT WHEN firmy_cur%ROWCOUNT > 5 OR
f irmy_cur%NOTFOUND: obsl uga_fi rmy(rek_fi rmy);
END LOOP :
Liczbowa pętla FOR
FOR i nde ks_pętli I N [REVERSE] naj ni ższa_wartość . . najwyższa_wa rtość LOOP
polecenia_wykonywa lne END LOOP :
Środowisko uruchornieniowe PUSQL-a automatycznie deklaruje indeks pętli jako zmienną typu PLS_INTEGER (nie wolno samodzielnie deklarować indeksu). Wartości najniższa_wartofć i najwyższa_wartofć mogą być wyrażeniami, lecz ich rezultaty zostają obliczone tylko raz (w chwili otwarcia pętli). Słowo kluczowe REVERSE powoduje odwrócenie indeksacji (od najwyższej do najniższej wartości indeksu).
BEGIN FOR licznik IN 1 . . 4 LOO P
DBMS_OUTPUT. PUT( l icznik ) : END LOOP: DBMS_OUTPUT. NEW_LINE:
FOR licznik IN REVERS E 1. .4 LOO P
Pętle I 41
DBMS_DUTPUT. PUT( l iczni k) ; EN D LOOP; OBMS_OUTPUT. NEW_LINE;
END;
Powyższy kod generuje następujący rezultat:
1234 4321
Kursorowa pętla FOR
FOR i ndeks_pętli IN [nazwa_kursora I (wyrażen i e SELECT) J LOOP
pol ecenia_wykonywalne END LOOP
Środowisko uruchomieniowe PUSQL-a au tomatycznie deklaruje indeks pętli jako rekord typu nazwa_kur.wra%ROWTYPE (nie wolno samodzielnie deklarować indeksu). Kursorowa pęt.la FOR automatycznie otwiera kursor i wczytuje wszystkie zawarte w nim wiersze. Możliwe jest bezpośrednie osadzenie wyrażenia SELECT w pętli FOR, lub też posłużenie się zadeklarowanym wcześniej kursorem :
FOR re k_p racownika IN pracownicy_cur LOOP
IF rek_p racownika . s tanowi sko=' Programi sta Oracl e ' THEN
daj_podwyzke <(rek_pracowni ka . i d_pracowni ka. 30 ) EN D I F;
END LOOP;
Kursorowa pętla FOR stanowi elegancką deklaratywną konstrukcję programistyczną (nakazujemy bazie danych dostarczyć wymagane rekordy, lecz nie precyzujemy, w jaki sposób ma to nastą-
42 I Oracle PL/SQL Kieszonkowy słownik języka
pić). Oracle Database I Og (oraz pozmeJSZe wersje systemu) umożliwiają automatyczną optymalizację takich wyrażeil, przekształcając je w zapytania zbiorcze (BULK COLLECT). Jeśli
w ramach pętli wykonywane są operacje DML-owe, konieczne może okazać się przepisanie kodu z użyciem polecenia FORALL. Więcej na ten temat w dziale 'Zapytania zbiorcze.
Pętla WHILE
WHILE wa runek LOOP
polecenia_wy konywalne END LOOP :
Z pętli WHILE należy korzystać wówczas, gdy nie jesteśmy
pewni, czy dany blok poleceil powinien zostać wykonany przy-. . . naJmllleJ raz:
WHILE NOT koniec_an.al i zy LOOP
prowadz_anal i ze ; wczytaj_kol ejny_rekord : IF kursor_anal izy%NOT FOUNO ANO nastepny_etap IS NULL THEN
koni ec_anal izy : = TRUE: END I F:
END LOOP :
Emulacja pętli REPEAT UNTIL
PUSQL nie obsługuje konstrukcji REPEAT UNT IL, ale potrafi ją emulować. Poniższa składnia jest tożsama z pętlą REPEAT UNTIL:
Pętle I 43
LOOP pol ecenia_wy konywalne EXIT WHEN war unek_bool ows ki
END LOOP:
Z emulacji pętli REPEAT UNTIL należy korzystać, gdy zachodzi potrzeba ponownego oszacowania warunku po każdej iteracji pętli.
Polecenie EXIT
EXIT [ WHEN warunek J:
Pominięcie klauzuli WHEN w poleceniu EXIT spowoduje bezwarunkowe opuszczenie pętli; w przeciwnym razie pętla zostanie przerwana tylko w irazie spełnienia podanego warunku . Polecenie EXIT ma charakter opcjonalny i może pojawić się w dowolnym miejscu pętli.
Polecenie CONTINUE (Oracle Database 11g)
Polecenie CONTINUE przerywa bieżącą iterację pętli rozpoczyna kolejną iterację. Oto jego składnia:
CONTINUE etykieta [ WH EN warunek J:
Opcjonalna nazwa etykiety informuje system, którą z pętli należy
przerwać - jej pominięcie powoduje przerwanie iteracji pętli
o najwyższym stopniu zagnieżdżenia.
Polecenie CONTINUE ma (podobnie, jak EXIT) charakter opcjonalny i może pojawić się w dowolnym miejscu pętli. CONTINUE potrafi przekazać kontrolę na zewnątrz pętli, lecz nie pozwala na opuszczenie bieżącej procedury, funkcji lub metody.
44 I Oracle PL/SQL Kieszonkowy słownik języka
Poniższy kod wykorzystuje CONTINUE do przerwama iteracji pętli FOR:
DECLARE TYPE dz i en_tab_t IS TABLE OF VARCHAR2(10); dz i en_tab dzien_tab_t := dzi en_tab_t (' Ni edziel a '
. ' Poni edzial ek', 'Wtorek' . 'Sroda'
. 'Czwartek' . ' Pi atek' , 'Sobota') : BEGIN « pet 1 a_dn i » FOR l icznik IN 2 . . 6 LOOP
-- Pomi n srody CONTINUE pet l a_dni WH EN dzien_tab( l i cznik)='Sroda ' ; DBMS_OUTPUT. PUT_LINE (dzien_tab( l icznik)) ;
END LOOP; END;
Oto rezultat:
Poni edz ial ek Wtorek Czwartek Pia t ek
W kolejnym przykładzie spróbujemy przekazać kontrolę z pętli wewnętrznej do kolejnej iteracji pętli zewnętrznej:
DECLARE BEGIN
<< petl a_zewnetrzna>> FOR l iczni k_zewnetrzny IN 1 . . 3 LOOP
DBMS_OUTPUT. PUT_LINE Cl i cznik_zewnetrzny) ; <<pe t la_wewnetrzna>> FOR l icznik_wewnetrzny IN 10 .. 15 LOOP
CONTINUE pet l a_zewnetrzna WHEN l i cznik_zewnetrzny >l ANO l icznik_wewnetrzny = 12:
OBMS_OUTPUT. PUT_LINE(' . . . ' I l l icznik_wewnetrzny) ; END LOO P:
Pętle 45
ENO LOOP; ENO ;
Rezultat wygląda następująco:
1 . . . 10 . . . 11 . . . 12 . . . 13 . . . 14 . . . 15 2 . . . 10 . . . 11 3 . . . 10 . . . 11
Etykiety pętli
Pętle można uzupełniać o etykiety (podobnie, jak w przypadku polecenia GOTO). E tykieta pętli musi pojawiać się bezpośrednio
przed rozpoczynającym ją poleceniem.
Poniższy przykład ukazu je wykorzystanie etykiet do kwalifikowania zmiennych wewnątrz pętli, a także do opuszczania pętli zagnieżdżonej :
«petl a_ l at» FOR rok IN 1. . 20 LOOP
<<pet l a_miesiecy>> LOO P
IF pet l a_l at. rok > 10 THEN
46 I Oracle PL/SQL. Kieszonkowy słownik języka
EXIT pet la_lat: ENO IF :
ENO LOOP petl a_miesiecy: ENO LOOP pet l a_ l at:
Integracja z bazą danych PL/SQL jest ściśle zintegrowany z językiem SQL oraz obsługują
cymi go bazami danych Oracle. W programach PUSQL-owych można wprowadzać polecenia SQL-owe (UPDATE, INSERT, DELETE, MERGE i SELECT); można też - za pośrednictwem dynamicznego SQL-a - wykonywać polecenia języka Data Definition Language (DOL). PU SQL obsługuje kontrolę transakcji za pomocą poleceil COMMIT , ROLLBACK oraz pozostałych
elementów składni języka Data Control Language (DCL).
Sekwencje w PL/ SQL-u
Sekwencje służą do automatycznego generowania kluczy w bazach danych Oracle. Aby zapisać w zmiennej języka PUSQL wartość NEXTVAL lub CURRY AL danej sekwencji, należy wybrać z tabeli DUAL odpowiednią pseudokolumnę:
SELECT moja_sekwenc.j a . NEXTVAL I NTO moja_ zm i en na FROM dua 1 :
Poczynając od wersji Oracle Database I l g, pseudokolumny sekwencji mogą pojawiać się wszędzie tam, gdzie wymagane jest wprowadzenie wyrażenia zwracającego wartość liczbową:
moj a_zmi enna := moj .a_sekwencj a . NE XTVAL:
Integracja z bazą danych I 47
Kontrola transakcji
Bazy danych Oracle realizują transakcyjny model interakcji. Język PL/SQL obsługuje większość elementów modelu transakcyjnego (lecz istnieją pewne wyjątki - nie można np. wykonać polecenia ROLLBACK FORCE). Transakcja rozpoczyna się z chwilą
wprowadzenia pierwszej modyfikacji danych i kończy się wydaniem polecenia COMMIT lub ROLLBACK. Transakcje są niezależne od bloków kodu PUSQL-owego: pojedynczy blok może zawierać wiele trans akcji, zaś pojedyncza transakcja może zostać rozdzielona na wiele bloków. PUSQL obsługuje polecenia COMMIT, ROLLBACK, SA VEPOINT, SET TRANSACTION oraz LOCK TABLE.
COM MIT
COHM IT [ WORKJ !koment arz J;
COMMIT utrwala zmiany wprowadzone w bazie danych i czyni je widocznymi dl.a pozostałych sesji bazodanowych. Słowo
kluczowe WORK ma charakter opcjonalny Gest więc rzadko używane). Opcjonalny komentarz może składać się z maksymalnie 50 znaków i służy jedynie rozstrzyganiu wątpliwości związa
nych z dwufazowym przenoszeniem transakcji rozproszonych. Polecenie COMMIT FORCE (również związane z transakcjami rozproszonymi) nie jest obsługiwane przez PUSQL.
ROLLBACK
RO LLBACK [ WORKJ [TO [ SAVEPOI NT}lazwa_punkt u_kontro 1 nego J;
ROLLBACK wycofuje zmiany wprowadzone w bazie danych do początku bieżącej transakcji lub do wybranego punktu kontrolnego. Punkty kontrolne tworzymy za pomocą polecenia SA VEPOINT. Wycofanie transakcji do punktu kontrolnego wiąże się
48 I Oracle PL/SQL Kieszonkowy słownik języka
z usunięciem wszystkich punktów kontrolnych zdefiniowanych po wybranym punkcie.
SAVEPOINT
SAV E PO I NT nazwa_punkt u_kont ro 1 n ego
SA VEPOINT tworzy w bieżącej transakcji punkt kontrolny. W ramach pojedynczej transakcji można zdefiniować wiele punktów kontrolnych. Jeżeli nowy punkt kontrolny ma taką samą nazwę, jak jeden ze zdefiniowanych wcześniej punktów kontrolnych, wówczas poprzedni punkt jest ignorowany, a transakcja może zostać wycofana tylko do nowo zdefiniowanego punktu.
SET TRANSACTION
SET TRANSACTION REAIO ONLY: SET TRANSACTION I SO LATI ON LEVEL SERI ALI ZABLE: SET TRANSACTION USE ROLLBACK SEGMENllazwa_segmen t u
Polecenie SET TRANSACTION obsługuje trzy tryby kontroli :
• READ ONLY: ten tryb oznacza rozpoczęcie transakcji w trybie „tylko do odczytu" i informuje bazę danych, że na czas trwania transakcji konieczne jest zachowanie spójności odczytów, tj . zagwarantowanie, że widoczne będą jedynie te zmiany, które uległy finalizacji przed rozpoczęciem bieżącej transakcji. Do zakończenia transakcji służą polecenia COMMIT oraz ROLLBACK. W transakcji oznaczonej jako READ ONL Y można stosować tylko operacje LOCK TABLE, SELECT, SELECT INTO , OPEN, FETCH, CLOSE, COMMIT i ROLLBACK. Inne operacje (np. INSERT lub UPDATE) spowodują wygenerowanie wyjątku ORA-1456.
Integracja z bazą danych I 49
• ISOLATION LEVEL SERIALIZABLE: ten tryb również wymusza spójność odczytów, lecz jednocześnie pozwala na modyfikowanie danych.
• USE ROLLBACK SEGMENT: jeżeli baza danych korzysta z segmentów cofnięć (w przeciwieństwie do automatycznej kontroli cofnięć), wówczas opcja USE ROLLBACK SEGMENT nakazuje zastosowanie segmentu o podanej nazwie. Przykładowo, jeśli dysponujemy dużym segmentem cofnięć o nazwie seg_ du zy, możemy nakazać bazie danych jego wykorzystanie, wydając następujące polecenie:
SET TRANSACTI ON USE RO LLBACK SEGMENT seg_duzy ;
LOCK TABLE
LOCK TABLE l ist a_tabel I N t ryb_bl okady MOOE [NOWAI TJ ;
To polecenie wyłącza domyślny mechanizm blokad na poziomie wierszy i blokuje jedną lub więcej tabel bazodanowych, zgodnie z zawartością parametru lista_tabel (nazwy tabel należy rozdzielać przecinkami). tryb_bu>kady jest wartością wybraną ze zbioru : ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE, SHARE, SHARE ROW EXCLUSIVE oraz EXCLUSIYE. Słowo kluczowe NOW AIT oznacza, że baza danych nie powinna oczekiwać na zwolnienie istniejących blokad, lecz wygenerować wyjątek ORA-00054 (zasób zajęty i wybrano opcję NOW AIT ) - domyślnym zachowaniem jest bezterminowe oczekiwanie na dostęp do wybranych zasobów.
Transakcje autonomiczne
Transakcja autonomiczna oznacza wykonanie wskazanej sekwencji poleceil w odrębnej (niezależnej) przestrzeni transakcji. Transakcje autonomiczne mogą zostać zatwierdzone lub wycofane bez
50 I Oracle PL/SQL. Kieszonkowy słownik języka
wpływu na transakcję główną. Zmiany wprowadzone przez transakcję autonomiczną są widoczne z poziomu transakcji głów
nej (nawet, jeśli następują po jej rozpoczęciu). Zmiany zatwierdzone przez transakcję autonomiczną stają się widoczne dla wszystkich pozostałych transakcji w trybie natychmiastowym. System zarządzania bazą danych zawiesza wykonywanie transakcji głównej na czas il:rwania transakcji autonomicznej:
PROC EDURE gl owna IS BEGIN
UP DATE . . . -- Tu zaczyna s i e transakcja gl owna . DELETE . . . at_proc; -- Wywa lanie transakcji autonomicznej . SELECT . . . INSERT . . . COMMIT;
END ; Tu konczy s i e transakcja glowna .
PROCEDURE at_proc l.S PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN -- Zawi eszenie transakcji gl ownej . SELECT INSERT UP DATE DELETE
- Tu rozpoczyna sie transakcja autonomiczna.
COMMIT; - Tu konczy sie transakcja autonomi czna . END; -- Tu wznawiana jest transakcja glowna .
Zmiany wprowadzone w transakcji głównej nie są widoczne dla transakcji autonomicznej. Jeżeli transakcja główna blokuje zasoby, których wymaga transakcja autonomiczna, wówczas dochodzi do zakleszczenia (rozwiązaniem jest opcja NOW AJT wykorzystana w połączeniu z poleceniem UPDATE wewnątrz transakcji autonomicznej). Transakcje autonomiczne mogą obejmować m.in. funkcje, procedury (samodzielne lub wchodzące w skład pakietu), wyzwalacze, anonimowe bloki PUSQL-owe najwyższe-
Integracja z bazą danych 51
go poziomu oraz metody obiektów. Aby zadeklarować dany blok kodu jako autonomiczny, należy uzupełnić go o dyrektywę
PRAGMA AUTONOMOUS_TRANSACTION; ponadto przy każdym wyjściu z bloku musi znajdować się polecenie COMMIT lub ROLLBACK.
Kursory w PL/SQL-u Każde polecenie SQL-owe w systemie Oracle dysponuje prywatnym obszarem pamięci, zawierającym informację o samym poleceniu oraz o zwracanych przezeil danych. Mianem kursora określamy nazwę definiującą prywatny obszar wyrażenia SQL-owego. Kursory dzielą się na statycvie (przypisane do wyrażeń znanych w chwili kompilacji) oraz dynamiczne (odpowiadające wyrażeniom konstruowanym podczas wykonywania programu).
Kursory statyczne służą do obsługi wyrażeń języka DML (SELECT, INSERT, UPDATE, DELETE, MERGEoraz SELECT FOR UPDATE). M:ożna je deklarować w sposób jawny (z wykorzystaniem nazw) lub w postaci wyrażeń SQL-owych.
Kursory dynamiczne obsługują wszystkie rodzaje wyrażeń SQLowych, w tym wyrażenia języka DOL (CREATE, TRUNCATE, ALTER) oraz DCL (GRANT, REVOKE). Implementacja kursorów dynamicznych odbywa się z wykorzystaniem polecenia EXECUTE IMMEDIATE.
Kursory jawne
Kursory jawne to wyrażenia SELECT zadeklarowane z użyciem słowa kluczowego DECLARE wewnątrz bloku kodu lub specyfikacji pakietu. Korzystanie z tych kursorów odbywa się za pośred
nictwem poleceil OPEN, FETCH i CLOSE.
52 I Oracle PL/SQL. Kieszonkowy słownik języka
Deklarowanie kursorów jawnych Kursor jawny musi zostać zadeklarowany w sekcji deklaracji bloku lub pakietu. Istnieją trzy rodzaje deklaracji kursorów jawnych:
• Kursor bezparametrowy:
CURSOR f irmy_cur IS SELECT i d_firmy FROM firmy;
• Kursor z listą parametrów:
CURSOR f irmy_cur (i d_i n IN NUMBER) IS SELECT nazwa FROM firmy WH ERE i d_f irmy = i d_i n;
• Kursor o nagłówku zawierającym klauzulę RETURN zamiast wyrażenia SELECT:
CURSOR f irmy_cur (i d_i n IN NUMBER) RETURN firmy%ROWTYPE;
Ostatni z przytoczonych przykładów ukazuje, że deklaracja kursora może być niezależna od jego implementacji: deklarację można umieścić w specyfikacji pakietu, zaś implementację
w jego ciele. Więcej na ten temat w dziale Pakiety.
Otwieranie kursorów jawnych
Do otwarcia kursora jawnego wykorzystujemy następujące poleceme:
OPEN nazwa_kursora [(argument [ ,argument . . . J ) J ;
nazwa_kursora jes t nazwą podaną w jego deklaracji. Jeżeli
deklaracja kursora zawiera listę parametrów, wówczas otwierając kursor, należy podać odpowiadające im argumenty.
Kursory w PL/SQL-u I 53
Przed odczytaniem danych z kursora jawnego należy go otworzyć.
Otwarcie kursora wiąże się z jego automatycznym przeparsowaniem oraz uruchomieniem skojarzonego z nim zapytania. Polecenie OPEN tworzy plan wykonania, dowiązuje zmienne języka macierzystego oraz parametry kursora do odpowiednich elementów wyrażenia SQL-owego, pobiera dane z bazy i definiuje iterator odczytu (wskazujący na pierwszy rekord kursora).
W kursorowych pętlach FOR polecenie OPEN jest wykonywane automatycznie, w c!hwili otwarcia pętli. Próba ponownego otwarcia kursora, który został już wcześniej otwarty, spowoduje wystąpienie błędu ORA-06511.
Wczytywanie danych z kursorów jawnych
Polecenie FETCH wprowadza dane bieżącego wiersza do wskazanych zmiennych lokalnych. Aby wczytać wszystkie dane z kursora, należy wykonać FETCH na każdym z jego wierszy. Oto składnia polecenia FETCH:
FETCH nazwa_ku rsora I NTO rekord_] ub_l i st a_zmi ennych
nazwa_kursora jest nazwą nadaną kursorowi w jego deklaracji.
Zamykanie kursorów jawnych
Po wczytaniu wszystkich danych z kursora należy go zamknąć. Zamknięcie kursora umożliwia mechanizmom optymalizacyjnym PL/SQL-a zwolnienie zajmowanej przezell pamięci operacyjnej. Do zamknięcia kursora jawnego służy polecenie CLOSE:
CLOS E nazwa_ku rsora :
nazwa_kursora jest nazwą nadaną kursorowi w jego deklaracji.
Zadeklarowanie kursora wewnątrz lokalnego bloku anonimowego, procedury lub funkcji spowoduje jego au tomatyczne zamknięcie
54 I Oracle PL/SQL Kieszonkowy słownik języka
w chwili opuszczenia danego bloku. Kursory zadeklarowane na poziomie pakietu muszą być zamykane ręcznie (w przeciwnym razie pozostaną otwarte aż do końca sesji). Próba zamknięcia kursora, który nie jest otwarty, spowoduje wystąpienie wyjątku INYALID_CURSOR.
Atrybuty kursorów jawnych
Kursorom mogą towarzyszyć cztery atrybuty: ISOPEN, FOUND, NOTFOUND oraz ROWCOUNT. Do ich obsługi służy ogranicznik %. Aby odwołać się do wybranego atrybutu kursora, należy
wpisać:
nazwa_kursora%at rybut
nazwa_kursora jest nazwą nadaną kursorowi w jego deklaracji.
Poniższa tabela opis u je rolę poszczególnych atrybutów:
Atrybut Opis
%1SOPEN TRUE, jeśli kursor jest otwarty. FALSE, jeśli kursor nie jest otwarty.
%FOUND INVAUD _ CURSOR, jeśl i kursor nie został otwarty. NULL przed pierwszym poleceniem FETCH. TRUE, jeśli rekord został poprawnie odczytany. FALSE, jeśli nie zwrócono żadnego wiersza. INVAUD _ CURSOR, jeśl i kursor został zamknięty.
%NOTFOUND INVAUD CURSOR, jeśl i kursor nie został otwarty. NULL pr1ed pierwszym poleceniem FETCH. FALSE, jeśli rekord został poprawnie odczytany. TRUE, jeśli nie zwrócono żadnego wiersza. INVAUD _ CURSOR, jeśl i kursor został zamknięty.
%ROWCOUNT INVAUD _ CURSOR, jeśl i kursor nie został otwarty. Liczł>a wierszy zwróconych przez kursor. INVAUD _ CURSOR, jeśl i kursor został zamknięty.
Kursory w PL/SQL-u I 55
Atrybuty kursorów są zazwyczaj odczytywane w pętli pobierającej dane. Oto przykład :
DECLARE pracownik_rek pracownicy_pkg . pracownicy_cur%ROWTYPE;
BEGIN OP EN pracowni cy_p kg . pracownicy_c ur;
LOOP FETCH pracownicy_pkg . pracownicy_cur i nto pracownik_rek; EXI T WH EN pracowni cy_pkg .pracowni cy_cur%NOTFOUND
OR pracowni cy_pkg .pracownicy_c ur%ROWCOUNT > 10 ;
UPDATE kar ty_pracy SET pracownik_i d = pracowni cy_rek .pracowni k_id WHE RE godzi na_rozpoczecia < SYSDATE ;
EN D LOOP; CLOSE pracowni cy_pkg .pracowni cy_cur;
END;
Kursory domniemane
Umieszczając wyrażenie SQL-owe bezpośrednio w sekcji wykonania lub sekcji obsługi wyjątków bloku PUSQL-owego, powodujemy utworzenie kursora domniemanego. PUSQL dopuszcza tworzenie kursorów domniemanych dla wyrażeń INSERT, UPDAT E, DELETE, MERGE oraz SELECT INTO. W przeciwieilstwie do kursorów jawnych, kursory domniemane nie posiadają deklaracji i nie muszą być otwierane lub zamykane; nie trzeba też stosować na nich polecenia FETCH.
Obsługa atrybutów '%FOUND i %NOTFOUND w kursorach domniemanych odbiega od analogicznego mechanizmu dla kursorów jawnych. Jeżeli wyrażenie SQL-owe nie zwróciło żadnych wierszy, PUSQL natychmiast generuje wyjątek NO_DATA_FOUND i przekazuje kontrolę do sekcji obsługi wyjątków . Jeżeli wyraże-
56 I Oracle PL/SQL Kieszonkowy słownik języka
nie zwróciło więcej niż jeden wiersz, wygenerowany zostaje wyjątek TOO_MANY _ROWS.
Atrybuty kursorów domniemanych są obsługiwane za pośrednictwem specjalnego k:ursora SQL:
BEGIN UPDATE czynnosci SET os t atnia_operacja : = SYSDATE WHE RE UIO = i d_uzytkownika;
IF SQL%NOTFOUN D THE N INSERT INTO l og_czynnosci (ui d, osta t ni a_operacja )
VALU ES (i d_uzytkownika . SYSDATE): END I F;
END;
Poniższa tabela przestawia atrybuty kursorów domniemanych:
Atrybut
SQL%1SOPEN
SQL%FOUND
SQL%NOTFOUND
SQL%ROWCOUNT
SQL%BULK ROWCOUNT
Opis
Zawsze FALSE, gdyż kursor jest otwierany automatycznie i zamykany natychmiast po uruchomieniu wyrażenia.
NULL przed wyrażeniem. TRUE, jeśli wprowadzono, scalono, zmodyfikowano lub usunięto jeden lub więcej wierszy, lub też jeśli wybrano dokładnie jeden wiersz. FALSE, jeśli nie wprowadzono, scalono, zmodyfikowano, usunięto lub wybrano ani jednego wiersza.
NULL przed wyrażeniem.
TRUE, jeśli nie wprowadzono, scalono, zmodyfikowano, usunięto lub wybrano ani jednego wiersza. FALSE, jeśli wprowadzono, scalono, zmodyfikowano lub usunięto jeden lub więcej wierszy.
Uczba wierszy odczytanych przez kursor.
Tablica asocjacyjna, zawierająca l iczbę wierszy odczytanych przez wyrażenia wchodzące w sktad operacji zbiorczej (więcej na ten temat w dziale Zapytania zbiorcze).
Kursory w PL/SQL-u I 57
Umieszczenie w poleceniu INSERT, UPDATE lub DELETE klauzuli RETURNING spowoduje zwrócenie danych wygenerowanych przez wyrażenie (dzięki czemu możemy uniknąć wprowadzania kolejnego wyrażenia SELECT). Oto przykład:
BEGIN UPDATE czynnosci SET ostatnia_operacja : = SYSDATE WHERE UI D = i d_uzytkownika RETURNING ostatnia_operacja , czas_t rwani a INTO zegar. czas;
Klauzula SELECT FOR UPDATE
Baza Oracle domyślnie blokuje tylko te wiersze, które są poddawane modyfikacjom. Aby zablokować wszystkie wiersze w zbiorze wynikowym kursora, należy uzupełnić wyrażenie SELECT o klauzulę FOR UPDATE. Klauzula FOR UPDATE nie wymaga wprowadzania modyfikacji w danych zwróconych przez kursor -blokuje jedynie całą zawartość kursora w chwili jego otwarcia. Do zwolnienia blokady dochodzi w chwili wydania polecenia COMMIT lub ROLLBACK. Tego rodzaju blokada nie wpływa na zachowanie innych wyrażell SELECT - chyba że im również towarzyszą klauzule FOR UPDATE. Oto stosowna składnia:
SELECT . . . FROM „ .
FOR UPDATE [OF nazwy_kolumn l [NOWAI TJ ;
nazwy_kolumn to lista nazw kolumn (rozdzielonych przecinkami), które mają zostać zablokowane (nazwy te muszą pojawiać się
również w klauzuli SELECT). Opcja NOWAIT informuje system Oracle, by nie czekać na zwolnienie istniejących blokad (domyś
lnym zachowaniem jest bezterminowe oczekiwanie na dostęp do danych).
58 I Oracle PL/SQL Kieszonkowy słownik języka
Poniższy przykład ukazuje blokowanie kolumn w tabeli inwentarza (zwierzaki) (dla porównania - otwarcie kursora psy_goncze_ w_ofe rc i e_cur nie blokuje tabeli ras psów):
OECLARE CURSOR psy_goncze_w_ofercie_cur IS
SELECT zwierzak.liczba, zwierzak . hodowca, pies . rozmiary FROM rasy_psow pies, i nwentarz zwierzak
WH ERE pies.rasa= zwierzak.rasa ANO pies . klasa= "GONCZY" FOR UP DATE OF zwierzak.liczba, zwierzak . hodowca;
BEGIN
Klauzula WHERE CURRENT OF
Polecenia UPDATE i DELETE mogą wykorzystywać klauzulę
WHERE CURRENT OF, jeśli odnoszą się do kursora zadeklarowanego z użyciem klauzuli FOR UPDATE. Klauzula WHERE CURRENT OF powoduje zaktualizowanie (przez polecenie UPDAT E lub DELETE) wiersza, na który w danej chwili wskazuje kursor. Oto składnia:
[UPOATE (OELETEJ . . . WHERE CURRENT OF nazwa_kursora
Wykorzystanie WHERE CURRENT OF sprawia, ze nie trzeba powtarzać klauzuli WHERE w poleceniu SELECT:
OECLARE CURSOR wip_cur IS
SELECT nr_konta, da ta_utworzenia FROH wip WH ERE data_utworzenia < SYSOATE - 7
FOR UPDATE ; BEGIN
FOR wip_rek IN wip_cur LOO P
INSERT INTO l og_kont (nr_konta, data_zamowienia )
Kursory w PL/SQL-u I 59
VALUES(wip_rek .nr_konta . wip_rek .data_wprowadzenia); DE LETE FROM wi p
WHE RE CURRENT OF wip_cur: END LOOP:
END:
Kursory dynamiczne
Do tworzenia kursorów dynamicznych służy polecenie EXECUTE IMMEDIATE wraz z poleceniami OPEN FOR, FETCH oraz CLOSE. EXECUTE IMMEDIATE obsługuje zapytania jednowierszowe oraz polecenia języka DOL, natomiast polecenia OPEN FOR, FETC H i CLOSE umożliwiają operacje na dynamicznych zapytania·ch wielowierszowych. Oto ich składnia:
EXECUTE IMHEDIATEwyrażen i e_sql
[I NTO (zmienna [ . zmienna . . . J I rekord)) [USI NG [IN I OUT I I N OUTJargument_dowiązania
[. [] N I OUT li I N OUTJargument_dowiązania .. . J J [CRETURNING I RETURNJ I NTOargument_dowiązania
[ . a rgument_dC>wiązania J . . . J :
wyrażenie_sql jest łańcuchem tekstowym (w systemie Oracle Database I lg moż.e też być obiektem CLOB, co pozwala na wykonywanie wyrażeń dłuższych niż 32 tysiące znaków). Polecenie EXECUTE IMMEDIATE przeparsowuje wyrażenie i uruchamia je w odrębnej transakcji. Na końcu składni EXECUTE IMMEDIATE musi znaleźć się średnik, lecz nie wolno2 wprowadzać osobnego średnika, jeśli w EXECUTE IMMEDIATE korzystamy z predefiniowanego wyrażenia SQL-owego:
2 Chyba że mamy do czynienia z blokiem anonimowym lub wyrnżeniem CREATE ORREPLACE.
60 I Oracle PL/SQL. Kieszonkowy słownik języka
EXECUTE IMMEDIATE ' TRUNCATE TABLE foo' ;
wyr_sql := ' UP DATE pracownicy SET pobory= :nowe_pobory WH ERE i d_pracownika = :nr_pracownika' ;
EXECUTE IMMEDIATE wy r_sql USING 75000 , 123
Polecenie OPEN FOR zapisuje zapytanie wielowierszowe w zmiennej kursorowej, umożliwiając pobieranie danych za pośrednictwem FETCH. Do zamknięcia kursora służy polecenie CLOSE:
DECLARE TY PE cv_typ IS REF CURSOR ; cv cv_typ; l nr_konta NUMBER; lstan_konta NUMBER;
BEGIN OP EN cv FOR
'SELECT nr_konta. s t an_konta FROM konta
WHE RE s t an_konta < 500'; LOO P
FETC H cv INTO l nr_konta. lstan_konta ; EXIT WH EN cv%NOTFOUND; -- Da l sza obr obka danych
EN D LOOP; CLOSE cv;
END;
DBMS SQL Wbudowany pakiet DBMS_SQL umożliwia osadzanie w programach dynamicznych wyrażeń SQL-owych. Zazwyczaj łatwiej
korzystać w tym celu z tzw. natywnego dynamicznego SQL-a (NDS); istnieją jed.nak sytuacje, w których nieodzowne okazuje się sięgnięcie po pakiet DBMS_SQL:
Kursory w PL/SQL-u I 61
Metoda 4 dynamicznego SQL-a W chwili pisania programu nie jest znana liczba e lementów danych do pobrania przez wyrażenie SELECT ani też liczba zmiennych, do których należy wprowadzić owe dane. Ten najbardziej skomplikowany z możliwych scenariuszy zastosowania dynamicznego SQL-a wymaga wyjątkowo elastycznego kodu. W obsłudze metody 4 bardzo przydaje się procedura DBMS_SQL.DESCRIBE_COLUMNS.
Bardzo duże wyrażenia SQL-owe Parsowanie wyrażenia liczącego więcej niż 32 tysiące znaków wymaga zastosowania specjalnych typów kolekcji udostępnianych przez pakiet DBM_SQL (oraz zawarty w nim program PARSE). Do takich sytuacji może dochodzić np. gdy generujemy wyrażenia SQL dla tabel zawierających bardzo wiele kolumn.
System Oracle Database I l g wprowadza (w ramach pakietu DBMS_SQL) dwie nowe funkcje: TO_REFCURSOR oraz TO_CURSOR_NUMBER, umożliwiające konwersję kursorów DBMS_SQL na kursory natywne (i na odwrót). Więcej informacji na temat pakietu DBMS_SQL można znaleźć w książce Programowanie w języku PUSQL.
SQL injection oraz zmienne dowiązane Zjawisko znane jako SQL injection (dosł. „wstrzykiwanie SQL-a") polega na umyślnym wprowadzeniu do dynamicznego wyrażenia
SQL-owgo szkodliwego kodu. Najlepszą obroną przed tego rodzaju atakami jest wykorzystanie tzw. zmiennych dowiązanych (zmienne te są też zalecane z uwagi na fakt, iż odciążają parser). Dowiązywanie zmiennych do wyrażell SQL-owych polega na umieszczaniu w tych wyrażeniach specjalnych etykiet (prefiksowanych dwukropkiem), a następnie przekazywaniu wartości do
62 I Oracle PL/SQL Kieszonkowy słownik języka
gotowego wyrażenia za pomocą klauzuli USING . Przeparsowane wyrażenie trafia do puli wspólnej i jest wykorzystywane we wszystkich późniejszych wywołaniach, zwiększając tym samym wydajność kodu. Oto przykład :
EXECUTE IMMEDIATE ' INSERT INTO kadry . reg i ony (i d_regi onu . nazwa_regionu ) VA LU ES ( : r_i d, : r_nazwa ) ' USING i d, nazwa :
Zmienne kursorowe
Zmienna kursorowa to struktura danych wskazująca na kursor, który z kolei wskazuje na konkretny zbiór wynikowy. Zmienne kursorowe u łatwiają pobieranie wierszy z kursorów w aplikacjach typu klient-serwer; można też za ich pomocą ukrywać drobne modyfikacje w zapytaniach.
Oto definicja typu zmiennej kursorowej (REF _CURSOR):
TYPE nazwa_kursora IS REF CURSOR [RETURN typ_rekordu l :
Brak klauzuli RETURN powoduje zadeklarowanie tzw. słabej zmiennej kursorowej. Zmienne oparte na słabym typie REF CURSOR można kojarzyć z zapytaniami w trakcie działania programu. Deklaracja uzupełniona o klauzulę RETURN oznacza silny REF CURSOR - taka zmienna może odpowiadać tylko kursorom, których zbiory wynikowe pasują do struktury danych zdefiniowanej po słowie kluczowym RETURN.
Wykorzystanie zmiennej kursorowej wymaga wcześniejszego utworzenia typu RiEF CURSOR oraz zadeklarowania zmiennej opartej na tym typie. Poniższy przykład demonstruje zastosowanie obydwu rodzajów zmiennych:
Kursory w PL/SQL-u I 63
OECLARE - - Tworzymy typ ku rsora oparty na tabeli f irm TY PE firma_typcur IS REF CURSOR
RETURN firmy%ROWTY PE;
Dekl arujemy zmienna typu firma_typcur firmy_cur firma_typcur;
- - Teraz tworzymy typ s l aby TY PE dowol ny_typcur IS RE F CURSOR; zmienna_ogol nego_zas t osowania dowol ny_typcur ;
Otwarcie zmiennej kursorowej wymaga wprowadzenia polecenia OPEN:
OPEN nazwa_kursora FOR wyrażeni e_select ;
Na zmiennych kursorowych można wykonywać operacje FETCH i CLOSE w sposób analogiczny do kursorów jawnych; zastosowanie zmiennych kursorowych wiąże się jednak z pewnymi ogra-. . . mczemanu:
• Zmiennych kursorowych nie wolno deklarować na poziomie pakietu, gdyż nie są one trwałe (można natomiast deklarować je w procedurach i funkcjach wchodzących w skład pakietu).
• W zmiennych kursorowych nie można zapisać wartości NULL; nie można też stosować w odniesieniu do nich operatorów porównawczych (tj. sprawdzać, czy są sobie równe lub czy zawierają NU LL) .
• Zmiennych kursorowych nie można zapisywać w kolumnach bazodanowych ani kolekcjach.
• Zmienne kursorowe nie mogą pełnić roli argumentów w zdalnych wywołaniach procedur (mechanizm RPC).
64 Oracle PL/SQL Kieszonkowy słownik języka
Wyrażenia kursorowe
Wyrażeniem kursorowym nazywamy kursor pełniący rolę koluinny w klauzuli SELECT kursora jawnego. Oto składnia wyrażenia kursorowego:
CURSOR (podza pyt anie )
Wyrażenia kursorowe pozwalają na ograniczenie ilości zbędnych
danych w zapytaniach przeprowadzających złączenia tabel. Do otwarcia wyrażenia kursorowego dochodzi w sposób automatyczny, w chwili odczytania danych z jego kursora macierzystego za pomocą FETCH. Wyrażenia kursorowe można zagnieżdżać. Zagnieżdżony kursor ulega zamknięciu w następujących sytuacjach:
• bezpośrednie polecenie zamknięcia zagnieżdżonego kursora (CLOSE),
• zamknięcie kursora macierzystego,
• ponowne uruchomienie kursora macierzystego,
• wyjątek podczas odczytywania wierszy z kursora macierzystego.
Oto przykład zastosowania wyrażeń kursorowych:
OECLARE TY PE refcursor IS REF CURSOR: CURSOR zamowi eni a_cur IS
SELECT z .da ta_z l ozeni a , z . status CURSORCSEL ECT p. przet l umaczona_nazwa
. zp . cena_jednostkowa
. zp . i l osc FROM oe . zamowione_produkty zp
. oe . op i sy_produktow p WHE RE zp . i d_produktu = p. i d_produkt u
ANO zp . i d_zamowienia = z . i d_zamowi eni a)
Kursory w PL/SQL-u 65
FROM oe . zamowi eni a z WH ERE data_zl ozenia BETWEEN TO_OATEC'Ol -Jan-09')
ANO TO_OAT EC'31-Jan-09'): zda ta oe . zamow·i eni a . data_zl ozen i a%TYPE: zsta t us oe . zamowi eni a. status_zamowi eni a%TYPE: zm_cur pnazwa cena ilosc
BEGIN
refcursor : oe . opi sy_produktow . przetl umaczona_nazwa%TYPE: oe . zamow·i one_produkty . cena_j ednostkowa%TYP E: oe . zamow·i one_produkty . i 1 osc%TYPE:
OP EN zamowi eni a_cur: LOOP
FETCH zamowi eni a_cur INTO zdata . zstatus. zm_cur: EXIT WH EN zamowienia_cur%NOT FOUNO: LOOP
FETCH zm_cur INTO pnazwa. cena. i l osc: EXIT WHE N zm_cur%NOTFOUNO: OBMS_OUTPUT. PUT_LINECzdata l I ' , ' I lzstatus
11 ' . ' 11pnazwa 11 ' . ' 11cena 11 ' . ' 11 i 1 osc): END LOOP:
EN D LOOP: CLOSE zamowienia_cur:
END:
Obsługa wyjątków
PUSQL udostępnia programistom elastyczny mechanizm generowania i przechwytywania wyjątków . Każdy blok PUSQL-owy może zawierać odrębną sekcję obsługi wyjątków, przechwytującą
błędy, które wystąpiły podczas wykonywania danego bloku (oraz - jeśli trzeba - dokonującą ich eskalacji). W razie stwierdzenia błędu, system natychmiast przerywa wykonywanie poleceń
zawartych w sekcji wykonania i przechodzi do sekcji obsługi
wyjątków. Każdemu wyjątkowi towarzyszy numer i komunikat (niektóre wyjątki mogą też mieć własne nazwy).
66 Oracle PL/SQL. Kieszonkowy słownik języka
Deklarowanie wyjątków
System Oracle zawiera szereg predefiniowanych wyjątków,
dostępnych w pakiecie STANDARD oraz niektórych innych pakietach (np. UTL_FILE). Poniższa tabela zawiera listę najczę
ściej spotykanych standardowych wyjątków Oracle. Aby zadeklarować nowy wyjątek, należy wpisać:
OECLARE nazwa_wyj ątku EXC EPTION:
Numer błędu Nazwa wyjątku
ORA-00001 DUP VAL ON INDEX
ORA-00051 TIMEOUT ON RESOURCE
ORA-00061 TRANSACTION BACKED OUT - -ORA-01001 INVALID CURSOR
ORA-01012 NOT LOGGED ON - -ORA-01017 LOGIN DENIED
ORA-01403 NO DATA FOUND - -ORA-01410 SYS INVALID ROWID - -ORA-01422 TOO MANY ROWS - -ORA-01476 ZERO DIVIDE
ORA-01725 USERENV COMMMITSCN ERROR - -ORA-01722 INVALID NUMBER
ORA-06500 STORAGE ERROR
ORA-06501 PROGRAM ERROR
ORA-06502 VALUE ERROR
ORA-06504 ROWTYPE MISMATCH
Obsługa wyjątków I 67
Numer błędu Nazwa wyjątku
ORA-06511 CURSOR ALREADY OPEN - -ORA-06530 ACCESS INTO NULL - -ORA-06531 COLLECTION IS NULL
ORA-06532 SUBSCRIPT OUTSIDE LIMIT - -ORA-06533 SUBSCRIPT BEYOND COUNT - -ORA-06548 NO DATA NEEDED - -ORA-06592 CASE NOT FOUND - -ORA-30625 SELF IS NULL
Wyjątek może zostać zadeklarowany tylko raz w ramach danego bloku, lecz bloki zagnieżdżone mogą ponownie deklarować wyjątki o nazwach pokrywających się z nazwami wyjątków w bloku macierzystym. W takim przypadku o obsłudze wyjątków decyduje ich zakres: najpierw brane są pod uwagę wyjątki zadeklarowane w bloku zagnieżdżonym, a następnie - wyjątki z bloku macierzystego.
Do wygenerowania wyjątku zadeklarowanego przez programistę
służy polecenie RA ISE. Wszystkim takim wyjątkom towarzyszy kod błędu I oraz komunikat „User-defined exception" - chyba że wykorzystamy pragmę EXCEPTION_INIT:
OECLARE nazwa_wyjątku EXC EPTION: PRAGHA EXC EPTION_ INIT •azwa_wyjątku • numer_błędu ) :
numer _błędu musi być wartością literalną (nie można zastąpić jej nazwą zmiennej). Dopuszczalne jest wykorzystanie numerów powiązanych z błędami systemu Oracle (np. -955 - „obiekt już istnieje") lub też numerów z zakresu -20000 - -20999 (wyjątki
68 I Oracle PL/SQL Kieszonkowy słownik języka
zdefiniowane przez programistę). Przykładowo, aby wykonać wyrażenie dynamicznego SQL-a zawarte w zmiennej sql _wyr, ignorując przy tym e wentualne wyjątki ORA-00955, wpiszemy:
DECLARE Dbi ektlstni ej e EXCEPTION PRAGHA EXCE PTION_INIT(Obi ekt l stni eje , -955): sql_wy r VARCHAR2(100 l : = ' CREATE TABLE mojdual AS SELECT *
FROH dua l ' : BEGIN
EXECUTE IMMED IATE sql_wyr; -- Ignorujemy bl edy ORA-955 EXCEPTION WHEN Obi ektls t ni eje TH EN NULL: END:
Generowanie wyjątków
Wyjątek może zostać wygenerowany na trzy sposoby:
• przez środowisko uruchomieniowe PL/SQL-a,
• przez polecenie RAISE,
• przez wywołanie wbudowanej funkcji RAISE_APPLICATION_ ERROR.
Polecenie RAISE ma następującą składnię:
RAISE nazwa_wyjątku :
nazwa_wyjątku jest nazwą przypisaną wyjątkowi w jego deklaracji, lub też nazwą jednego z wyjątków w pakiecie STANDARD. Umieszczenie polecenia RAISE w sekcji obsługi wyjątków przy jednoczesnym pominięci u nazwy wyjątku powoduje eskalację
bieżącego wyjątku :
RAI SE;
Obsługa wyjątków I 69
Powyższa składnia jest poprawna tylko w sekcji obsługi wyjątków.
Funkcja RAISE_APPLICATION_ERROR ma następujący
nagłówek:
RA!SE_APPLICATION_ERROR ( numer BINARY_I NTEGER. komun i kat VARCHAR2. zachowaj_stos BOOLEAN OE FAULT FALSE) :
numer jest numerem błędu (liczbą z przedziału -20000 - -20999); komunikat to komunikat o błędzie, zaś przełącznik zachowaj_stos decyduje o zachowaniu bądź skasowaniu dotychczasowej zawartości stosu.
Poczynając od systemu Oracle Database I Og Release 2, możemy korzystać z funkcji DBMS_UTILITY.FORMAT_ERROR_ BACKTRACE, ułatwiającej ustalenie, w którym miejscu stosu wywołań wystąpił błąd. We wcześniejszych wersjach systemu jedynym sposobem na wyświetlenie całego stosu i ustalenie numeru błędnej linijki była eskalacja wyjątku na zewnątrz aplikacji.
Zakres Zakres sekcji obsługi wyjątków to fragment kodu „obsługiwany" przez daną sekcję. W ramach sekcji obsługi wyjątków przechwytywane są tylko te wyjątki, do których doszło w obsługiwanym
przez nią kodzie (zazwyczaj jest to sekcja wykonania bieżącego bloku PUSQL-owego). Wyjątki wygenerowane w sekcji deklaracji lub sekcji obsługi wyjątków są automatycznie eskalowane do wyżej położonego bloku. PUSQL umożliwia wydzielenie dowolnej sekwencji poleceń i umieszczenie jej w odrębnym bloku, ułatwiając tym samym kontrolowanie zakresu obsługi wyjątków.
70 I Oracle PL/SQL Kieszonkowy słownik języka
Eskalacja
Wyjątki wygenerowane w ramach danego bloku podlegają eskalacji do wyżej położonego bloku, jeśli nie zostaną obsłużone
w lokalnej sekcji obsługi wyjątków, lub też jeśli zostaną przezeń
ponownie wygenerowane. Gdy dochodzi do wygenerowania wyjątku, PUSQL sprawdza najpierw, czy w lokalnej sekcji obsługi wyjątków znajduje się odpowiedni kod obsługi . Jeśli nie, wyjątek trafia do wyżej położonego bloku - i tak dalej, aż zostanie obsłużony lub wyrzucony na zewnątrz aplikacji, co pociąga za sobą (I) zatrzymanie programu oraz (2) automatyczne wycofanie wszystkich otwartych transakcji .
Wyjątki przechwycone przez sekcję obsługi wyjątków nie podlegają dalszej eskalacji. Aby przechwycić dany wyjątek, wyświetlić stosowny komunikat o błędzie, a następnie dokonać eskalacji wyjątku do bloku macierzystego, należy skorzystać z polecenia RAISE:
PROC EOURE usun_dzial (nr_dz ial u_in IN NUMBER) IS
wciaz_sa_pracowni cy EXC EPTION: PRAGHA EXC EPTION_INI T(wci az_sa_pracowni cy . -2292) :
BEGIN DELETE FROM dzialy
WH ERE nr_dzial u = nr_dz ial u_i n: EXCEPTION
WHEN wciaz_sa_pracownicy THEN
OBMS_OUTPUT. PUT_LINE (' Prosze najpierw usunac rekordy pracownikow . ') :
RO LLBACK: RAIS E: -- Eskalacja biezacego wyjatku.
END:
Obsługa wyjątków I 71
Klauzula WHEN OTHERS
Klauzula WHEN OT HE RS w sekcji obsługi wyjątków przechwytuje wszystkie wyjątki, których nie obsłużono w żadnej z poprzedzających ją klauzul WHEN. Jeśli zdecydujemy się z niej skorzystać, musimy umieścić ją na samym końcu sekcji obsługi wyjątków. Oto odpowiednia składnia:
EXCEPTION WHEN OTHERS TH EN
SQLCODE, SQLERRM i DBMS_UTILITY.FORMAT_CALL_STACK SQLCODE, SQLEIRRM i DBMS_UTILITY.FORMAT_CALL_ STACK to wbudowane funkcje i procedury, które zwracają kody błędów oraz komuni katy odpowiadające wyjątkom. Umieszczenie ich w klauzuli WHEN OTHERS pozwala na wyświetlenie dodatkowych informacji o wykrytych błędach.
Korporacja Oracle radzi unikać SQLERRM, gdyż w pewnych sytuacjach funkcja ta może obciąć fragment komunikatu o błędzie. Lepiej posłużyć się procedurą FORMAT_CALL_STACK, jak w poniższym przykładzie:
CREATE TAB LE bl edy_t est (widget_nazwa VARCHAR2(100 ) . wi dget_i losc NUMB ER . CONSTRA INT bez_ma lych_i l osci CHECK
(wi dget_i l osc > 1000 )) : BEGIN
INSERT INTO bl edy_t es t (wi dget_nazwa . wi dget_i l osc) VALUES ( 'Atena' . 2) :
EXCEPTION WHEN OTHERS THE~
IF SQLCOOE = -2290
72 I Oracle PL/SQL Kieszonkowy słownik języka
END ;
ANO OBMS_UTILITY .FORMAT_ERROR_STACK LIKE '%BEZ_MALY CH_ILOSCI%'
THEN OBMS_OUTPUT.PUT_LINE (' Zbyt ma l o wi dgetow . ') ;
ELSE OBMS_OUTPUT.PUT_LINE (' Ni eobsl uzony wyja tek'
11'SQLcode=' 11 SQLCOOE); OBMS_OUTPUT.PUT_LINE (OBMS_UTILITY .FORMAT_CAL L_
STACK); ENO IF;
Po uruchomieniu powyzszego programu Ujrzymy następujący
rezultat:
Zbyt ma l o wi dgetow.
W systemie Oracle Database I Og Release I (oraz nowszych) funkcja DBMS_UTILITY .FORMAT _ERROR_BACKTRACE wyświetla pełny stos wywołań, nawet jeśli zostanie wywołana
w bloku wyższego poziomu.
Wyjątki a DML
Wystąpienie wyjątku w bloku PUSQL-owym nie oznacza automatycznego wycofania bieżącej transakcji, nawet jeśli dany blok wykonał polecenie INSERT, UPDATE lub DELETE. Wycofanie transakcji wymaga wprowadzenia w sekcji obsługi błędów polecenia ROLLBACK ..
Jeśli jednak wyjątek opuści aplikację (tj . ulegnie eskalacji z bloku najwyższego poziom u), wówczas większość środowisk uruchomieniowych (w tym SQL*Plus) wycofa wszystkie niezakończone transakcje w ramach danej sesji.
Obsługa wyjątków I 73
Rekordy w PL/SQL-u Rekord to struktura danych złożona z elementów zwanych polami. Wykorzystanie rekordu wymaga zdefiniowania jego struktury oraz zadeklarowania zmiennej będącej rekordem. Wyróżniamy trzy rodzaje rekordów: rekordy tabelowe, rekordy kursorowe oraz rekordy zdefiniowane przez programistę.
Deklarowanie rekordów Rekordy można definiować w sekcji deklaracji bloku PU SQLowego lub (globalnie) w ramach specyfikacji pakietu.
Rekordy tabelowe i kursorowe nie wymagają odrębnych definicji, gdyż są tożsame z wybranymi strukturami danych. Deklarowanie zmiennych na podstawie takich rekordów wymaga posłużenia się atrybutem %ROWTYPE. Pola rekordu odpowiadają polom w wybranej tabeli lub wyrażeniu SELECT stanowiącym źródło danych kursora:
OECLARE - - Tu dekl arujemy rekord oparty na t abel i f i rm f i rmy_rek fir111Y~ROWTY PE
CURSOR f ir111Y_i nfo_cur IS SELECT f . i d_f irlJIY , SUM(o . obroty_brut to) brutto
FROM fi rl!IY f, ob roty o WH ERE f . id_f i rmy = o. id_f i rmy :
Tu dekl arujemy rekord oparty na kursorze f i rmy_i nfo_rek f i r111Y_i nfo_cur%ROWTY PE :
Rekordy definiowane przez programistę wymagają jawnej deklaracji TYPE, jak w poniższym przykładzie:
7 4 I Oracle PL/SQL Kieszonkowy słownik języka
OECLARE TY PE personali a_typ IS RECOROC
prefiks VARCHAR2(15) i mie VARCHAR2(30) drugi e_ i mi e VARCHAR2 (30) nazwi sko sufi ks
VARCHAR2(30) VARCHAR2(10) ) :
TY PE pracowni k_typ IS RECOROC i d_pracownika NUMBER<l Ol NOT NULL
i d_prze l ozonego NUMBER<l Ol nr_dzia l u dzi a ly .numer%TY PE stanowi sko VARCHAR2(20) pe rsonal ia persona l i a_typ data_za trudni eni a OATE := SYSOATE okres_probny BOOLEAN) ;
De kl arujemy zmi enna t ego typu. nowy_rekord_pracownika pracownik_typ;
BEGIN
Pola rekordów Aby odwołać się do pola w ramach danego rekordu, należy
wprowadzić jego nazwę po kropce:
nazwa_rekordu .nazwa_pola
Przykładowo :
pracownik . i mi e
Możliwe jest odczytywanie i zapisywanie danych w poszczególnych polach rekordów. Pola mogą pojawiać się po obu stronach operatora przypisania:
Rekordy w PL/SQL-u 75
BEGIN ubezpi eczeni e_poczatek :=
nowy_rekord_pracowni ka .da t a_zatrudni eni a+30; nowy_rekord_pracowni ka . okres_probny : = FALSE:
Operacje na rekordach
Możliwe jest przepisanie całej zawartości danego rekordu do innego rekordu o tym samym typie; nie można natomiast porównać ze sobą dwóch rekordów. Poniższa operacja jest prawidłowa:
adres_wysy lki_rek := adres_kl i enta_rek
... natomiast poniższa operacja spowoduje wystąpienie błędu :
IF adres_wysylki_re k = adres_kl i enta_rek -- bl ad
THEN
END IF:
Porównanie dwóch rekordów wymaga porównania zawartości ich poszczególnych póL
Istnieją cztery sposoby na zapisanie danych w rekordzie:
• Umieszczenie wartości w polu za pomocą operatora przypisama:
nowy_rekord_pracowni ka .data_zat rudnienia : = SYSDATE:
• Wczytanie danych do rekordu lub do wybranych pól za pomocą wyrażenia SELECT łNTO:
SELECT i d_p racownika, dzial , stanowisko, data_zatrudni eni a , wyksztal cenie
! NTO nowy_rekord_pracowni ka
76 Oracle PL/SQL Kieszonkowy słownik języka
FROM pracowni cy WH ERE nazwisko= 'LI'
• Wczytanie danych do rekordu lub do wybranych pól za pomocą wyrażenia FETCH INTO:
FETCH pracowni cy_cur INTO nowy_rekord_pracownika: FETCH pracowni cy_cur
INTO nowy_rekord_pracownika . id_pracownika , nowy_reko r d_pracowni ka .nazwisko:
• Przepisanie wszystkich pól rekordu do mnego rekordu tego samego typu :
IF ponowne_za t rudni eni e THEN nowy_rekord_pracownika := reko rd_bylego_pracownika :
ENO IF:
Powyższa operacja działa tylko dla rekordów zadeklarowanych w oparciu o wspólną definicję TYPE.
Rekordy a DML
Dane z rekordów zadeklarowanych z użyciem atrybutu %ROWTYPE można wprowadzać do bazy danych na następujące sposoby:
• Wprowadzenie danych do tabeli przy użyciu słowa kluczowego VALUES:
OEC LARE rekord_pracownika pracownicy%ROWTYPE:
BEGIN SELECT pracownicy_seq . NEXTVAL
INTO rekord_pracowni ka .nr_pracownika FROM dual:
INSERT INTO pracowni cy VALUES (rekord_pracowni ka): ENO:
Rekordy w PL/SQL-u 77
• Aktualizacja wiersza przy użyciu wyrażenia SET ROW:
FOR rekord_pracownika IN pracowni cy_cur LOOP
modyfikuj_rekord(rekord_pracowni ka);
UPDATE pracownicy SET ROW = rekord_pracownika WH ERE nr_pracownika = rekord_pracownika. nr_pracownika:
END LOOP:
Powyższe techniki umożliwiają optymalizację kodu, lecz należy
pamiętać, że zmienne typu %ROWTYPE nie mogą być dowiązy
wane do wyrażeń dynamicznego SQL-a.
Rekordy zagnieżdżone
Rekordy zagnieżdżone to rekordy zawarte w polach innych rekordów. Zagnieżdżanie rekordów stanowi sposób normalizacji struktur danych oraz umożliwia maskowanie ich złożoności . Oto przykład :
OECLARE - - defi ni ujemy rekord TYPE te l efon_typ IS RECO RO
prefiks VARC HAR2(3), kierunkowy VARCHAR2(3) , nume r VARCHAR2(4) , rozszerzenie VARCHAR2 (4));
defi ni ujemy rekord zl ozony z re kordow TYPE kontakt_typ IS RECO RO (
t elefon_domowy telefon_typ , t elefon_praca te lefon_typ, t elefon_komor kowy te l efon_typ);
deklarujemy zmi enna zawierajaca rekordy zagniezdzone te l efony_pracownika kontakt_typ ;
BEGIN
78 Oracle PL/SQL Kieszonkowy słownik języka
Kolekcje w PL/SQL-u PUSQL obsługuje trzy rodzaje kolekcji: tablice asoCJaCyJne, tabele zagnieżdżone oraz tablice VARRA Y.
Tablice asocjacyjne Jednowymiarowe, nieograniczone kolekcje wartości tego samego typu, dostępne tylko w kodzie PL/SQL-owym (nie w bazach Oracle). T ablice asocjacyjne są początkowo rzailkie, tj . nie każdej wartości indeksu odpowiada element tablicy. Istnieją dwie odmiany tablic asocjacyjnych: INDEX BY BINARY _INTEGER (umożliwiające skojarzenie wartości
z indeksem typu BINARY _INTEGER) oraz INDEX BY V ARCHAR2 (tablice indeksowane łańcuchami tekstowymi).
Tabele zagnieżdżone Jednowymiarowe, nieograniczone kolekcje wartości tego samego typu, dostępne zarówno w kodzie PUSQL-owym, jak i w bazach Oracle (jako kolumny tabel). Tabele zagnieżdżone są początkowo gęste (każdej z kolejnych wartości indeksu odpowiada element tabeli); mogą jednak stać się rzadkie na skutek kasowania wybranych elementów.
Tablice VARRAY Tablice o zmiemnych rozmiarach - jednowymiarowe, ograniczone kolekcje wartości tego samego typu, dostępne zarówno w kodzie PUSQL-owym, jak i w bazach Oracle. Tablice V ARRA Y nigdy nie są rzadkie. W przeciwieństwie do tabel zagnieżdżonych, zapisywanie i odczytywanie tablic V ARRA Y z bazy danych uje zaburza kolejności ich elementów.
Poniż.sza tabela zawiera krótkie porównanie wszystkich trzech rodzajów kolekcji:
Kolekcje w PL/SQL-u I 79
Cecha Tablica Tabela VARRAY asocjacyjna zagnieżdżona
Liczba wymiarów 1 1 1
Dostępna Nie Tak Tak w SQL-u?
Czy może pelnić Nie Tak (zazwyczaj Tak (zazwyczaj funkcję kolumn zapisywana zapisywana w tabeli? w odrębnej tabeli) w jednej z kolumn
istniejącej tabeli)
Stan niezainicjali- Pusta (nie może Równa NULL; Równa NULL; zowany być równa NULL); poszczególne poszczególne
elementy niezdefi- elementy nie elementy nie niowane podlegają odczy- podlegają
towi odczytowi
lnicjalizacja Automatyczna Za pośrednictwem Za pośrednictwem (w chwili konstruktura, konstruktura, deklaracji) operacji przypisa- operacji przypisa-
nia lub odczytania nia lub odczytania danych z bazy danych z bazy
Indeksacja BINARY INTEGER Dodatnie liczby Dodatnie liczby elementów (-2147483647 .. całkowite całkowite
wPUSQL-u 2147483647) lub z przedziału 1 „ z przedziału 1 „ łańcuchy tekstowe 2147483647; 2147483647; (VARCHAR2) o elementy nie elementy nie maksymalnej podlegają odczy- podlegają odczy-długości 30 towi, jeśl i nie towi, jeśli nie znaków. zostały zainicjali- zostały zainicjali-
zowane za po- zowane za po-średnictwem średnictwem konstruktora lub konstruktora lub funkcji EXTEND funkcji EXTEND
80 I Oracle PL/SQL. Kieszonkowy słownik języka
Cecha Tablica Tabela VARRAY asocjacyjna zagnieżdżona
Rzadka? Tak Początkowo - nie, Nie lecz może stać się rzadka w wyniku kasowania ele-mentów
Ograniczona? Nie Może zostać Tak rozszerzona
Wprowadzanie Przypisanie Za pośrednictwem Za pośrednictwem nowych wartości wartości do konstruktora lub konstruktora lub do kolekcji wybranego funkcji EXTEND funkcji EXTEND.
indeksu Nie wolno prze-kroczyć maksy-malnej wielkości kolekcji.
Zmniejszanie Automatyczne Funkcja TRIM Funkcja TRIM kolekcji
Czy dopuszczalne Nie Tak (ale tylko Nie są porównania? w systemie Oracle
Database 1 Og oraz póżniejszych)
Czy zapisywanie Nie dotyczy Nie Tak i odczytywanie (tablica asocja-kolekcji z bazy cyjna nie może danych zachowuje zostać zapisana kolejność w bazie danych) elementów?
Deklarowanie kolekcji Kolekcje są implementowane jako typy danych. Podobnie jak w przypadku typów definiowanych przez programistę, należy
Kolekcje w PL/SQL-u I 81
posłużyć się definicją TYPE (wczytaną z bazy danych lub umieszczoną bezpośrednio w kodzie PUSQL-owym):
Oto składnia definicji typu dla tablicy asocjacyjnej :
TYPE nazwa_typu I S TABLE OF typ_e l e11entu CNOT NULU I NDEX BY CBI NARY_INTEGER I VARCHAR2m(l ksy11a l ny_rozmiar )J :
Oto składnia definicji typu dla tabeli zagnieżdżonej :
CCREATE COR REPLACE JJ TYP En azwa_typu CIS I ASJ TABLE OF typ_e l ementu CNOT NULU :
Oto składnia definicji typu dla tablicy VARRA Y:
CCREATE COR REPLACe JJ TYPEnazwa_typu CIS I ASJ VARRAY VARY I NG ARRA Y lnaksy11a 1 na_l iczba_e l ementów ) OF typ_e 1 ementu CNOT NULU :
Słowo kluczowe CREATE oznacza, że definicja kolekcji powinna zostać zapisana w bazie danych. Opcjonalna klauzula OR REPLACE umożliwia modyfikowanie istniejących typów przy jednoczesnym zachowaniu ich praw dostępu. nazwa_typu to dowolny poprawny identyfikator typu, zaś maksymalna_liczba_elementów to górne ograniczenie rozmiarów danej kolekcji. typ_elementu określa typ danych, które będą zapisywane w kolekcji: dopuszczalne są typy skalarne (z kilkoma wyjątkami), obiektowe oraz wskaźnikowe (REF). Jeżeli elementy kolekcji są obiektami, wówczas nie mogą same zawierać atrybutów stanowiących kolekcje. Zabrania się używania następujących typów: BOOLEAN, NCHAR, NCLOB, NVARCHAR2, REF CURSOR, TABLE oraz VARRA Y.
Klauzula NOT NULL oznacza, że do kolekcji nie wolno wprowadzać elementów równych NULL (natomiast sama kolekcja może być równa NULL, 0 ile nie zostanie zainicjalizowana).
82 I Oracle PL/SQL. Kieszonkowy słownik języka
lnicjalizacja kolekcji
Inicjalizacja tablicy asocjacyjnej jest trywialna: zadeklarowanie tablicy oznacza jej automatyczne zaincjalizowanie. Inicjalizacja tabeli zagnieżdżonej lub tablicy V ARRA Y może przebiegać na jeden z dwóch sposobów: jawnie (za pośrednictwem konstruktora) lub automatycznie ( poprzez odczytanie danych z bazy lub przez skopiowanie danych z innej kolekcji).
Konstruktor to wbudowana funkcja o nazwie pokrywającej się z nazwą kolekcji: jej zadaniem jest utworzenie kolekcji z listy przekazanych doil elementów. Poniższy przykład ukazuje definicję zagnieżdżonej tabeli kolorów oraz jej inicjalizację za pomocą trzech wartości przekazanych do konstruktora:
OECLARE TY PE kol ory_tabel a_t IS TAB LE OF VARCHAR2(30): kol ory_tabel a kol ory_tabel a_t :=
kolory_tabela_t('CZERWONY'. 'ZIELONY'. 'NIEBIESKI ' ): BEGIN
W kolejnym przykładzie zdefiniujemy zagnieżdżoną tabelę kolorów oraz zainicjalizu jemy ją danymi odczytanymi z bazy:
-- Tworzymy tabel e zagniezdzona zapi sywana w bazi e danych CREATE TYPE kolory_tabela_t IS TABLE OF VARCHAR2(32l:
- - TworZYTI\Y tabele, w ktorej jedna z kol ullfl jest tabela zagniezdzona CREATE TAB LE pa l ety_barw (typ_palet y VARCHAR2( 12l . kol ory kol ory_tabel a_tl NESTEO TAB LE kol ory STORE AS
pal ety_barw_kol ory_tab:
Wprowadzamy dane do tabeli INSERT I NTO pa 1 ety J ba rw
VALUES(' RGB '. kol ory_tabel a_t ('CZERWONY' , 'ZIELONY' .
Kolekcje w PL/SQL-u I 83
' NIEBIESKI ')): INSERT I NTO pa 1 ety J ba rw
VALUES('CMYK' . kolory_tabela_t('JASNONIEBIESKI' . 'ZOLTY' . ' FIOLETOWY'. 'CZARNY') l :
In i cj al i zuj emy kol ekcj e kolorow wa rtosci ami z t abe l i OECLARE
kol ory_pods t awowe ko l ory_t abe l a_t: BEG IN
SELECT kol ory INTO kolory_podstawowe FROH palety_barw
WHERE typ_palet y= 'RGB':
END:
Ostatni przykład ukazuje inicjalizację tabeli poprzez przepisanie doli danych z innej kolekcji:
OECLARE kol ory_pods t awowe kolory_tabel a_t :=
kolory_tabela_t('CZERWONY' ,'ZIELONY' , ' NIEBIESKI ') : moje_kol ory kolory_tabe l a_t:
BEG IN moje_kol ory := ko l ory_podstawowe: moje_kol ory(2) := ' ZLOTY':
Dodawanie i usuwanie elementów
Dodawanie elementów do tablicy asocjacyjnej polega na wprowadzaniu danych odpowiadających wybranym wartościom indeksu. Aby dodać nowy element do tabeli zagnieżdżonej lub tabeli VARRA Y, należy najpierw powiększyć kolekcję za pomocą fu nkcji EXTEND, a następnie wprowadzić doli dane za pomocą jednej z metod opisanych w poprzednim dziale.
84 I Oracle PL/SQL Kieszonkowy słownik języka
Funkcja DELETE pozwala na kasowanie elementów tabeli zagnieżdżonej niezależnie od ich umiejscowienia. Funkcja TRIM również usuwa elementy, lecz tylko te, które znajdują się na samym końcu koJ.ekcji. Operowanie na pojedynczej kolekcji z użyciem zarówno DELETE, jak i TRIM może prowadzić do nieoczekiwanych rezultatów - należy więc unikać łączenia tych metod.
Operacje na tabelach zagnieżdżonych
Do operacji na tabelach zagnieżdżonych służą funkcje opisane w poniższej tabeli. Większość z nich wprowadzono dopiero w systemie Oracle Database 1 Og (wcześniejsze wersje systemu obsługiwały jedynie funkcje CAST i MULTISET). Należy pamiętać, że funkcja COLLECT jest dostępna tylko w wyrażeniach SQL-owych (nie można posługiwać się nią np. podczas wprowadzania danych do zmiennych języka PUSQL).
Funkcja
=
<>
[NOT] IN 0
Typ rezultatu
BOOLEAN
BOOLEAN
BOOLEAN
Opis
Porównuje dwie tabele zagnieżdżone, zwracając wartość prawdy, jeśli są one tego samego typu, mają taką samą liczebność oraz zawierają identyczne elementy.
Porównuje dwie tabele zagnieżdżone, zwracając wartość prawdy, jeśli różnią się pod względem typu, liczebności lub elementów.
Zwraca wartość prawdy [fałszu], jeśli tabela zagnieżdżona z lewej strony operatora IN zawiera się w l iście tabel wymienionych w nawiasach.
Kolekcje w PL/SQL-u I 85
Funkcja Typ rezultatu Opis
CARDINAUTY(x) NUMBER Zwraca liczbę elementów w kolekcji VARRAY lub tabeli zagnieżdżonej. Zwraca NULL, jeśl i dana kolekcja jest równa NULL (tzn. nie została zainicjalizowana).
CAST (k AS t) Typt Zmienia typ danych kolekcji k na t (funkcja stosowana w połączeniu
z COLLECT lub MUL TISET).
COLLECT Tabela Funkcja używana w połączeniu z CAST zagnieżdżona celem przekształcenia kolumny
w kolekcję.
MULTISET Tabela Funkcja używana w połączeniu z CAST zagnieżdżona celem przekształcenia podzapytania
w kolekcję.
xMULTISET Tabela Wykonuje operację MINUS na tabelach EXCEPT zagnieżdżona zagnieżdżonych x i y, zwracając tabelę
[OISTINCT] y zagnieżdżoną zawierającą elementy występujące w x, ale nie wy. Wszystkie trzy tabele muszą być tego samego typu. Słowo kluczowe DISTINCT powoduje wyeliminowanie duplikatów wartości ze zwróconej tabeli.
xMULTISET Tabela Wykonuje operację INTERSECT na INTERSECT zagnieżdżona tabelach zagnieżdżonych x i y, zwracając [OISTINCT] y tabelę zagnieżdżoną zawierającą ele-
menty występujące zarówno w x, jak i wy. Wszystkie trzy tabele muszą być tego samego typu. Słowo kluczowe DISTINCT powoduje wyeliminowanie duplikatów wartości ze zwróconej tabeli.
86 I Oracle PL/SQL Kieszonkowy słownik języka
Funkcja Typ rezultatu Opis
x MUL TISET UNION Tabela Wykonuje operację UNION na tabelach [DISTINCT] y zagnieżdżona zagnieżdżonych x i y, zwracając tabelę
zagnieżdżoną zawierającą elementy występujące w x lub wy. Wszystkie trzy tabele muszą być tego samego typu. Slowo kluczowe DISTINCT powoduje wyeliminowanie duplikatów wartości ze zwróconej tabeli.
SET(x) Tabela Zwraca tabelę x oczyszczoną z duplika-zagnieżdżona tów wartości.
x IS [NOT] A SET BOOLEAN Zwraca wartość prawdy [fałszu] , jeśli tabela zagnieżdżona x nie zawiera dupli-katów wartości.
x IS [NOT] EMPTY BOOLEAN Zwraca wartość prawdy [fałszu] , jeśli tabela zagnieżdżona x jest pusta.
e [NOT] MEMBER BOOLEAN Zwraca wartość prawdy [fałszu] , jeśli
[OF] X rezultat wyrażenia e jest elementem tabeli zagnieżdżonej x.
y [NOT] BOOLEAN Zwraca wartość prawdy [fałszu] , jeśli
SUBMUL TISET tabela zagnieżdżona y zawiera wyłącznie [OF] X elementy występujące w tabeli zagnież-
dżonej x.
Z funkcji CAST korzystamy w połączeniu z funkcjami COLLECT i MULTISET. MULTISET operuje na podzapytaniach, zaś COLLECT - na kolunrnach w wyrażeniach SQL-owych:
CREATE TYPE l is ta_emai l_t AS TABLE OF VARCHAR2 C64) ;
-- COLLECT operuje na kol umni e SELECT CASTCCO LLECTCemai l_kl i enta) AS l i st a_emai l_t ) FROM oe . kl i enci
Kolekcje w PL/SQL-u I 87
- - co jest rownowazne : SELECT CASTCMULTISETCSELECT emai l_kl ienta
FROM oe . kl ienci ) AS l i sta_emai l_t)
FROM dua 1:
Poniższy kod ukazuje zastosowanie innych funkcji operujących na tabelach zagnieżdżonych :
OECLARE TYPE typ_zagni ezdzony IS TAB LE OF NUMB ER: tzl typ_zagni ezdzony := typ_zagni ezdzony( l .2 .3): tz2 typ_zagni ezdzony := typ_zagni ezdzony(3,2 .1 ): tz3 typ_zagni ezdzony := typ_zagniezdzony(2,3 .l ,3): tz4 typ_zagni ezdzony := typ_zagni ezdzony( l .2 ,4): odpowiedz typ_zagni ezdzony:
BEGIN odpowiedz :=t zl HULTISET UN ION tz4: -- Cl .2 .3.1 .2 .4) odpowiedz :=t zl HULTISET UN ION tz3: -- Cl .2 .3.2,3 .1 ,3) odpowiedz :=t zl HULTISET UN ION OISTINCT tz3: - - Cl . 2.3) odpowiedz :=t z2 HULTISET INTERSECT tz3: - - (3 ,2.1) odpowiedz :=t z2 HULTISET INTERSECT OISTINCT tz3: (3 ,2. 1) odpowiedz :=t z3 HULTISET EXCEPT tz2: - - (3) odpowiedz :=t z3 HULTISET EXCEPT OISTINCT tz2: - - () odpowiedz :=SETCtz3) : - - (2 ,3,1) IF Ctzl IS A SET) ANO Ct z3 IS NOT A SET) THEN
OBMS_OUTPUT. PUT_LINE C' t zl ni e zawiera dupl ikatow') : OBMS_OUTPUT. PUT_LINE C' . .. ale tz3 - tak . '):
END I F: IF Ctz3 MU LTISET EXCEPT OISTINCT tz2) IS EMPTY THEN
OBMS_OUTPUT. PUT_LINE C'zbi or pusty') : END I F: IF 3 MEMBER OF Ctz3 HULTISET EXCEPT tz2) THEN
OBMS_OUTPUT. PUT_LINE C'3 jest element em rezul tatu') : END I F: IF tzl SUBMU LTISET tz3 THE N
OBMS_OUTPUT. PUT_LINE C' t zl j est podzbiorem tz3'): END I F:
88 I Oracle PL/SQL Kieszonkowy słownik języka
IF SET(tz3 ) IN ( tzl. tz2. tz3) THEN DBMS_DUTPUT. PUT_LINE(
'rezul tat wyrazenia wystepuje na l isci e tabel '); END I F;
END;
Operacje na kolekcjach Niektóre wbudowane metody można stosować dla dowolnych rodzajów kolekcji. Wywołanie jednej z metod opisanych w poniż
szej tabeli wymaga posłużenia się następującą składnią:
nazwa_kolekcji .na zwa_met ody [ (argumenty)]
Metoda Opis
COUNT Funkcja zwracająca liczbę elementów kolekcji. Jeśli kolekcja nie została zainicjalizowana, generowany jest wyjątek (w takim wypadku lepiej posłużyć się funkcją CARDINALllY).
DELETE [(i[Jl)] Procedura usuwająca z tabeli zagnieżdżonej lub tablicy asocjacyjnej element i lub elementy od i do j. Wywołanie DELETE bez żadnych argumentów spowoduje usunięcie wszystkich elementów kolekcji. Niedostępna dla tablic VARRAY.
EXISTS(t) Funkcja zwracająca wartość prawdy, jeśl i wskazana kolekcja zawiera element i. Jeżeli element i nie wchodzi w skład wskazanej kolekcji lub też jeśl i kolekcja nie została zainicjalizowana, zwracana jest wartość fałszu.
EXTEND [(n[;l )] Procedura rozszerzająca kolekcję on elementów inicjalizowanych wartością i. Parametry n oraz i są opcjonalne (wartością domyślną n jest 1 ).
FIRST Funkcja zwracająca element o najniższym indeksie lub NULL w przypadku pustej (lecz zainicjalizowanej) kolekcji.
Kolekcje w PL/SQL-u I 89
Metoda
LAST
LIMIT
PRIOR(t)
NEXT{I)
TRIM[(n)]
Opis
Funkcja zwracająca element o najwyższym indeksie lub NULL w przypadku pustej (lecz zainicjalizowanej) kolekcji.
Funkcja zwracająca maksymalną liczbę elementów, jakie można zapisać w danej tablicy VARRAY. Dla tablic asocjacyjnych oraz tabel zagnieżdżonych zwracana jest wartość NULL.
Funkcja zwracająca indeks elementu poprzedzającego element i. Jeśli i jest równe lub mniejsze od FIRST, zwracana jest wartość NULL.
Funkcja zwracająca indeks elementu następującego po elemencie i. Jeśl i i jest większe lub równe COUNT, zwracana jest wartość NULL.
Procedura usuwająca ostatnie n elementów kolekcji (tzn. n elementów o najwyższych indeksach). Wartością domyślną parametru n jest 1. Jeżeli n jest równe NULL, funkcja TRIM nie wprowadza żadnych zmian. Funkcja niedostępna dla tablic asocjacyjnych.
Funkcja EXISTS zwraca wartość boolowską, natomiast wszystkie pozostałe funkcje zwracają wartości BINARY _INTEGER, chyba że zostaną wywołane na kolekcjach indeksowanych łańcuchami tekstowymi (w takim wypadku zwracają wartości V ARCHAR2). Wszystkie argumenty są typu BINARY_INTEGER. Na tablicach V ARRA Y lub niezainicjalizowanych tabelach zagnieżdżonych
można wywoływać tylko funkcję EXISTS - pozostałe z wymienionych metod wygenerują wyjątek COLLECTION_IS_NULL.
Do kasowania e lementów tabel zagnieżdżonych służą metody DELETE i TRIM. Metoda DELETE (w przeciwieństwie do TRIM) nie zmniejsza samej kolekcji, lecz pozostawia puste miejsca po usuniętych elementach, co może skutkować trudnymi do wytropienia błędami, jeśli w ramach danej kolekcji korzystamy z obydwu
90 I Oracle PL/SQL Kieszonkowy słownik języka
metod. (TRIM kasuje elementy, które zostały już wcześniej „skasowane" za pomocą DELETE.)
Oto przykłady zastosowania niektórych wymienionych metod:
OECLARE TYPE typ_popul acji IS
TABLE OF NUMBER INDEX BY VARCHAR2(64) ; popul acja_ kontynentu typ_popul acji; ile NUMBER; nazwa_ kontynentu VARCHAR2(64);
BEGIN popul acja_ kontynentu('Austral i a') := 30000000 ; - - tworzymy nowy element popul acja_ kontynentu('Antarktyda') : = 1000 ; - - modyf ikuj emy is t ni ejacy element popul acja_ kontynentu('Antarktyda') : = 1001 ; nazwa_ kontynen t u := popul acja_kontynentu. FI RST; OBMS_OUTPUT. PUT_LI NE (nazwa_kontynentu) ; OBMS_OUTPUT. PUT_LI NE (
popul acja_kontynent u(nazwa_ kont ynentu)); nazwa_kontynentu := popul acja_kontynentu. LAST; OBMS_OUTPUT. PUT_LI NE (nazwa_kontynentu) ; OBMS_OUTPUT. PUT_LI NE (
popul acja_kontynent u(nazwa_ kont ynentu)); END ;
Po uruchomieniu tego programu ujrzymy następujący rezultat:
Ant arktyda 1001 Aus t ra l ia 30000000
Poniżej znajduje si ę garść przykładów operaCJI na tabelach zagnieżdżonych :
Kolekcje w PL/SQL-u I 91
OECLARE TY PE kol ory_tab_t IS TABLE OF VARCHAR2(30): moja_l ista kol ory_tab_t :=
ko 1 ory_tab_t<(' CZERWONY' . 'ZIELONY' . 'NI EBI ESKI '): el ement BINARY_INTEGER:
BEGIN OBMS_OUTPUT. PUT_LINEC'moja_l ista l i czy '
l lmoja_l ista .COUNTl l 'elementy ' ) : moja_l ista . OE LETE(2) : - - kasujemy el ement numer 2 OBMS_OUTPUT. PUT_LINE('moja_l ista l i czy
I lmoja_l ista.COUNTI I ' elementy'):
FOR element IN moja_l is ta . FIRST . . moja_l ista. LAST LOO P
IF moja_l i s ta . EXISTS(element ) TH EN
OBMS_OUTPUT. PUT_LINE(moja_l ista(el ement )
ELSE
I I Poprzedni= ' l lmoja_l i s t a. PRIOR(el ement) I I ' Nastepny= ' ll moja_l i sta . NEXT(e l ement )):
OBMS_OUTPUT. PUT_LINE(' El ement ' I I element I I ' zosta l skasowany . Poprzedni= ' I lmoja_lista . PRIOR(element ) I I ' Nastepny= ' l lmoja_l i sta . NE XT(element )) :
END IF : END LOOP:
END:
Powyższy program generuje następujący rezultat:
moja_l i sta l iczy 3 e lementy moja_l i s t a l iczy 2 e lementy CZERWONY Poprzedni = Nastepny= 3 Element 2 zosta l skasowany . Poprzedni= 1 Nastepny= 3 NIEBIESKI Poprzedni= 1 Nastepny=
92 I Oracle PL/SQL Kieszonkowy słownik języka
Kolekcje a prawa dostępu
Skorzystanie z kolekcji utworzonej w danym schemacie (tj. przez danego użytkownika bazy danych) wymaga posiadania prawa EXECUTE dla tego schematu. PUSQL dopuszcza tworzenie synonimów dla typów deklarowanych przez programistę.
Kolekcje zagnieżdżone
Kolekcje zagnieżdżone to kolekcje wchodzące w skład innych kolekcji. Zagnieżdżanie kolekcji umożliwia osadzanie w programach PUSQL struktur charakterystycznych dla programów obiektowych. Oto przykład:
CREATE TYPE ks i azk i IS TABLE OF VARCHAR2(64); CREATE TYPE nasze_ksiazki IS TABLE OF ks iazki;
Zapytania zbiorcze
Kolekcje stanowią nieodzowny element mechanizmu zapytań
zbiorczych, umożliwiającego znaczne przyspieszenie komunikacji z bazą danych: zamiast wysyłać do bazy szereg odrębnych zapyta11, możemy przesłać doil kolekcję, w której umieszczono wszystkie interesujące nas zapytania. System zarządzania bazą danych przetworzy jej zawartość i zwróci nową kolekcję, zawierającą
zbiory wynikowe poszczególnych wyrażeń. Do obsługi zapytań
zbiorczych służą polecenia FORALL oraz BULK COLLECT INTO.
Oto składnia FORA.LL:
FORALL i ndeks_zbi orczy I N [do 1 ne_ograniczen i e . . gorne_og ran i czen i e I NOIC ES OF kol ekcj a CBETWEEN dol ne_ogran iczen ie ANO
gorne_ograniczen ie J VALUES OF kol ekcj a J
Kolekcje w PL/SQL-u I 93
[SAVE EXCEPTIONSJ wyrażeni e_sq l ;
Wartości indeksu indeks_zbiorczy mogą być wykorzystywane tylko w wyrażeniu_sql, jako indeks kolekcji. FORALL przesyła
kolekcję zapyta1] SQL-owych do serwera jako pojedynczą całość. Przykładowo, aby skasować wszystkie konta zawarte w kolekcji nieakt ywne, wpiszemy:
FORALL i IN nieaktywne . FIRST . . ni eaktywne . LAST OELETE FROM konta WHE RE nr_konta = nieaktywne(i);
Jeżeli kolekcja nie jest indeksowana kolejnymi wartościami (tzn. występują w niej luki), należy posłużyć się klauzulą INDICES OF:
FORALL i IN I NO ICES OF ni eaktywne OELETE FROM konta WHE RE nr_konta = nieaktywne(i);
Jeżeli interesują nas wartof ci kolekcji liczbowej (nie zaś jej indeksy), wówczas należy wykorzystać klauzulę V ALUES OF:
FORALL i IN VALUES OF niekatywne_l i sta - - nieaktywne_l i sta to ko l ekcja i ndeksow tabel i nieaktywne - - odpowiadajacych kontom. ktore nal ezy skasowac OELETE FROM konta WHE RE nr_konta = nieaktywne(i);
Klauzule INDICES OF i V ALUES OF umożliwiają ograniczenie zbioru elementów branych pod uwagę w wyrażeniu FORALL. Klauzula INDICES OF służy do odczytywania indeksów elementów zdefiniowanych w kolekcji sterującej, zaś rolą klauzuli V ALUES OF jest odczytywanie wartofci tych samych elementów.
W razie wystąpienia wyjątku system zarządzania bazą danych przerywa przetwarzanie kolekcji zapytań. Zastosowanie klauzuli SA VE EXCEPTIONS umożliwia kontynuowanie operacji pomimo stwierdzenia błędu - w takim wypadku wszystkie błędy
94 I Oracle PL/SQL Kieszonkowy słownik języka
zostaną zapisane w specjalnym atrybucie kursora %BULK_EXCEPTIONS. Każdy rekord błędu składa się z dwóch pól: EXCEPTION_[NDEX oraz EXCEPTION_CODE (zawierających numer iteracji pętli FORALL, w której doszło do wystąpienia wyjątku, a także jego identyfikator SQLCODE). Jeżeli
w trakcie przetwarzania zapytań nie wystąpi żaden wyjątek, metoda SQL%BULK_EXCEPTIONS.COUNT zwróci wartość O. Oto przykład :
DECLARE TYPE l i sta_nazwi sk IS TAB LE OF VARCHAR2(32): tabl i ca_nazwisk l is ta_nazwisk := l ista_nazwisk( ' Pr i byl '
. 'Oawes' . ' Feuerste i n' , 'Genni ck' . ' Pr i by l ' , 'Beresniewiec z '
. 'Dawes' . ' Dye'): l i czba_bl edow NUMBER: wyjatek EXC EPTION: PRAGHA exception_init(wyjatek. -24381 ):
BEGIN FORALL i ndeks IN tabl ica_nazwi sk. FIRST .. tabl i ca_nazwisk. LAST
SAVE EXC EPTIONS INSERT INTO autorzy(nazwisko) VALUES
( tabl ica_nazwis k(i ndeks)) : - - nazwisko jest kl uczem gl ownym tabel i autorow
EXC EPTION
END :
WH EN othe rs THEN l i czba_bl edow := SQLXBULK_EXC EPTIONS. COUNT: OBMS_OUTPUT. PUT_LINE(' Li czba bledow : ' l i
1 i czba_bledow) : FOR i ndeks IN l . . l iczba_bl edow LOOP
DBMS_OUTPUT. PUT_LI NE ( ' Blad ' li i ndeks I I wystapil podczas iteracj i ' 11
SQL%BULK_EXCEPTIONS(i ndeksl .ERRO R_INDEXl : DBMS_OUTPUT. PUT_LI NE ( 'Kod bl edu : ' I I
SQLERRM (SQL%BULK_EXCEPTIONS(i ndeks) .ERRO R_CODEll :
END LOOP:
Kolekcje w PL/SQL-u I 95
liczba bl edow : 2 Blad 1 wystapil podczas i te racji 5 Kod bl edu: ORA-00001: uni que cons t ra i nt ( . ) vi olated Blad 2 wystapil podczas i te racji 7 Kod bl edu: ORA-00001: uni que cons t ra i nt ( . ) vi olated
Klauzula BULK COLLECT INTO ma następującą składnię:
BULK CO LLECT INTOli.sta_nazw_kolekcji ;
... gdzie lista_nazw _kolekcji jest listą rozdzielonych przecinkami nazw kolekcji (po jednej dla każdej kolumny w wyrażeniu SELECT). W klauzuli BULK COLLECT INTO nie można stosować kolekcji rekordów; można natomiast odczytać zbiór obiektów, a następnie „zebrać" je w pojedynczą kolekcję.
Klauzu lę BULK OOLLECT INTO można stosować w wyrażeniach SELECT INT O, FETCH INTO oraz RETURNING INTO:
OECLARE TY PE nazwa_dostawcy_tab IS TAB LE OF
dostawcy .nazwaXTY PE: TY PE transport_dostawcy_tab IS TAB LE OF
dostawcy . czas_transportuXTYPE: d_nazwy nazwa_dostawcy_t ab; d_transport transpor t_dostawcy_tab:
BEGIN SELECT nazwa , czas_transportu
END;
BULK CO LLECT INTO d_nazwy, d_transport FROH dostawcy WH ERE czas_t r anspor t u < 30:
Poniż.sza funkcja kasuje produkty skojarzone z listą kategorii, zaś klauzula RETURNING zwraca listę skasowanych produktów:
96 I Oracle PL/SQL Kieszonkowy słownik języka
FUNCTION kaskadowe_kasowani e_kategori i ( l i sta_ka t egori i l is t akat_t ) RETURN l i staprod_t IS
l i staprod l is t aprod_t BEGIN
FORALL prod IN l i sta_kat egor i i . FIRST . . l is t a_kategori i . LAST DE LETE FROM produkty WH ERE produkt_id IN
l i sta_kat egor i i (prod) RETURNI NG produkt_i d BULK COLLECT INTO lis t aprod:
RETURN l is t aprod : END :
W zapytaniach zlbiorowych możemy korzystać z atrybutu SQL%BULK_ROWCOUNT. Atrybut ten jest tablicą asocjacyjną
zawierającą liczbę rekordów przetworzonych przez wykonanie zapytań . Element n atrybutu SQL%BULK_ROWCOUNT zawiera liczbę wierszy, które przetworzyło zapytanie o numerze n. Oto przykład:
FORALL i IN niekatywne . FIRST . . ni eaktywne . LAST DELETE FROM konta WHE RE nr_konta = nieaktywne(i):
FOR l i cznik IN nieaktywne . FIRST . . ni eaktywne . LAST LOOP
IF SQL%BULK_ROWCOUNT( l i cznik) = O THEN
DBMS_OUTPUT. PUT_LINE ( ' Licznik = ' l l l icznik ll ' : ni e skasowano zadnych wierszy') :
EN D I F: END LOOP :
Atrybut SQL%BULK_ROWCOUNT nie może być przekazany jako argument zewnętrznego programu ani wykorzystany w celu agregacji danych w ramach zewnętrznej kolekcji. Atrybut %ROWCOUNT zawiera sumę wszystkich elementów atrybutu %BULK_ROWCOUNT. Atrybuty %FOUND i %NOTFOUND dotyczą tylko ostatniego z wywołanych zapytań SQL-owych.
Kolekcje w PL/SQL-u I 97
Wbudowane funkcje i pakiety Firma Oracle wyposażyła swój system bazodanowy w liczne wbudowane pakiety oraz funkcje. Niniejszy dział opisuje pakiety i funkcje powszechnie wykorzystywane w programach PUSQL-owych.
Wbudowane funkcje Każdej bazie danych Oracle towarzyszy kilkadziesiąt wbudowanych funkcji . Większość z nich można wykorzystywać zarówno w kodzie PUSQL-owym, jak i w wyrażeniach języka SQL; istnieją jednak pewne wyjątki : przykładowo, funkcja DECODE nie może pojawiać się w kodzie PU SQL-owym (za wyjątkiem wyrażell SQL-owych). Szczegółowe informacje o wbudowanych funkcjach można znaleźć w podręczniku użytkownika systemu Oracle Database, przy okazji opisu pakietu STANDARD (można też samodzielnie zapoznać się z jego zawartością, otwierając plik stdspec.sql urnieszczony w katalogu ORACLE_HOME'rdbms!admi11).
Funkcje konwersji
Nazwa funkcji
ASCll STR(/ańcuch)
CAST (wyrażenie AS typ _danych)
CHARTOROWlD(/ańcucfJ)
CONVERT(/ańcuch, docelowy zestaw znaków, źródlowy J estaw ]naków)
Opis
Konwertuje lańcuch wyrażony przy użyciu
dowolnego zestawu znaków do bazodanowego zestawu ASCII.
Konwertuje wyrażenie do wskazanego typu danych (wszechstronny zamiennik funkcji TO_DATE).
Konwertuje lańcuch do typu danych ROWID.
Konwertuje lańcuch ze żródłowego do docelowego zestawu znaków (domyślnym zestawem źródłowym jest zestaw bazodanowy).
98 I Oracle PL/SQL Kieszonkowy słownik języka
Nazwa funkcji
FROM _ TZ(waltość _ nMESTAMP, strefa_ czasowa)
HEXTORAW(lańcuch)
MULTISET
NUMTODSINTERVAL(n, jednostka)
NUMTOYMINTERVAL(n. jednostka)
RAWTOHEX(lańcuch)
REFTOHEX(wskaźnik)
ROWIDTOCHAR(rowid)
ROWIDTONCHAR(rowid)
TABLE
THE
TO_ BINARY _FLOAT(wyraźenie Lfonnat])
Opis
Dodaje infonnację o strefie czasowej do wartości TIME ST AMP (konwertując ją do typu TIMESTAMP WITH TIME ZONE).
Konwertuje lańcuch zawierający znaki szesnastkowe na jego odpowiednik typu RAW.
Odwzorowuje tabelę bazodanową na kolekcję.
Konwertuje wyrażenie liczbowe n na literał INTERVAL DAY TO SECOND (wartością
parametru jednostka może być DAY, HOUR, MINUTE lub SECOND).
Konwertuje wyrażenie liczbowe n na literał
INTERVAL YEAR TO MONTH (wartością parametru jednostka może być YEAR lub MONTH).
Konwertuje wartość typu RAW na jej szesnastkowy odpowiednik.
Konwertuje wskażnik na łańcuch szesnastkowy.
Konwertuje wartość rowid na łańcuch VARCHAR2(18).
Konwertuje wartość rowid na łańcuch NVARCHAR2(18).
Odwzorowuje kolekcję na tabelę bazodanową
(odwrotność MULTISET).
Odwzorowuje pojedynczą wartość kolumny na wirtualną tabelę bazodanową.
Konwertuje wyrażenie liczbowe lub tekstowe do typu BINARY FLOAT z opcjonalnym uwzględnieniem -podanego fonnatu.
Wbudowane funkcje i pakiety I 99
Nazwa funkcji
TO_ BINARY _ DOUBLE(wyrażenie [,fonnat])
TO CHAR, TO =NCHAR(wyrażenie ll.fonnat])
TO_ GLOB, TO _NCLOB(c)
TO_ DA TE (wyrażenie [,fonnat])
TO_ DSINTERVALVańcuch)
TO_LOB(c)
TO_ MUL Tl_ BYTEVańcuch)
TO_ NUMBER(wyrażenie [,fonnat])
TO_RAW(b)
TO_ SINGLE_ BYTEVańcuch)
Opis
Konwertuje wyrażenie liczbowe lub tekstowe do typu BINARY _DOUBLE z opcjonalnym uwzględnieniem podanego formatu.
Konwertuje wyrażenie na łańcuch tekstowy (odpowiednio - VARCHAR2 lub NVARCHAR2) z opcjonalnym uwzględnieniem podanego formatu.
Konwertuje cz wartości VARCHAR2, NVARCHAR2 lub NCLOB do typu GLOB (lub NCLOB).
Konwertuje łańcuch tekstowy do typu DATE z opcjonalnym uwzględnieniem podanego formatu.
Konwertuje łańcuch tekstowy z typu CHAR, VARCHAR2, NCHAR lub NVARCHAR2 do typu INTERVAL DAY TO SECOND.
Konwertuje cz typu LONG lub LONG RAW do typu LOB.
Konwertuje (w miarę możliwości) jednoba~owe znaki, z których składa się łańcuch wejściowy, na ich wieloba~owe odpowiedniki.
Konwertuje wyrażenie tekstowe lub liczbowe (np. BI NARY _FLOA 1) do typu NUMBER z opcjonalnym uwzględnieniem podanego formatu.
Konwertuje b z typu BLOB do typu RAW.
Konwertuje wieloba~owe znaki, z których składa się łańcuch wejściowy, na ich jednobajtowe odpowiedniki.
1 OO I Oracle PL/SQ:L. Kieszonkowy słownik języka
Nazwa funkcji
TO_ TlMESTAMP(wyrażenie [,fonnat])
TO_ TlMESTAMP _ TZ(wyrażenie [,fonnat])
TO_ YMINTERVAL(fańcuch)
TRANSL.ATE ... USING(fańcuch USING CHAR_ CS)
UNISTR(fańcuch)
Opis
Konwertuje wyrażenie tekstowe do typu TIMESTAMP z opcjonalnym uwzględnieniem podanego fonnatu.
Konwertuje wyrażenie tekstowe do typu TlMESTAMP WITH TIME ZONE z opcjonalnym uwzględnieniem podanego formatu.
Konwertuje łańcuch tekstowy z typu CHAR, VARCHAR2, NCHAR lub NVARCHAR2 do typu INTERVAL YEAR TO MONTH.
Konwertuje lańcuch z bazodanowego zestawu znaków do narodowego zestawu znaków. Umożliwia zachowanie kompatybilności ze standardem ANSI - naśladuje
funkcjonalność TO_ CHAR oraz TO _NCHAR.
Konwertuje lańcuch złożony z kodów Unicode (np. x00e5) na literał tekstowy Unicode, wyrażony przy użyciu bazodanowego zestawu znaków.
Funkcje operuj ące na łańcuchach tekstowych
Funkcja
ASCII (pojedyczy _znak)
ASCll STR(fańcuch)
Opis
Zwraca wartość typu NUMBER, stanowiącą kod podanego znaku w bazodanowym zestawie znaków.
Konwertuje łańcuch tekstowy (wyrażony przy użyciu dowolnego zestawu znaków) na zestaw ASCII. Wszystkie znaki niewchodzące w skład zestawu ASCII zostają zastąpione kodami Unicode (\XXXX).
Wbudowane funkcje i pakiety I 101
Funkcja
CHR(kod)
CHR(kod USING NCHAR_ CS)
COMPOSE(/ańcuch)
Opis
Zwraca łańcuch VARCHAR2 o długości 1, odpowiadający położeniu danego kodu w wykorzystywanym zestawie znaków. CHR przydaje się w pracy nad łańcuchami zawierającymi znaki narodowe.
Zwraca łańcuch NVARCHAR2 o długości 1 z narodowego zestawu znaków.
Zwraca znonnalizowaną postać wejściowego
łańcucha Unicode.
CONCAT(fańcuchf, fańcuch2) Konkatenuje obydwa łańcuchy wejściowe.
CONVERTVańcuch, docelowy _zestaw _znaków)
DECOMPOSEVańcuchf [CANONICAL])
GREATESTVańcuchf , fańcuch2, ... )
INITCAP(/ańcuch)
Konwertuje łańcuch tekstowy do wskazanego zestawu znaków, z możliwością opcjonalnego podania zestawu źródłowego: CONVERT (tańcu eh 1, docelowy _zestaw_ znaków, źródfowy _zestaw _znaków).
Zwraca łańcuch, w którym wszystkie złożone znaki zostały rozłożone na ich elementy składowe (przeciwieństwo COMPOSE). Klauzula CANONICAL gwarantuje odwracalność tej operacji za pośrednictwem funkcji COMPOSE.
Wybiera spośród łańcuchów tekstowych ten, który zajmowałby wśród nich ostatnie miejsce, gdyby uszeregowano je w kolejności rosnącej
(przeciwieństwo LEAST).
Zmienia format łańcucha wejściowego, zapisując pierwszą literę każdego z wyrazów wersalikami, zaś pozostałe części wyrazów - małymi literami . • Wyrazem" jest każdy ciąg znaków alfanumerycznych ograniczony odstępami lub znakami niealfanumerycznymi (np. # lub j . Przykładowo - INITCAP('jakis napis') zwróci: 'Jakis Napis'.
102 I Oracle PL/SQ:L. Kieszonkowy słownik języka
Funkcja
INSTR(lańcuch1 , lańcuch2 [[, pozycja _początkowa'] , n])
LEAST(/ańcuch1 , lańcuch2, ... )
LENGTH(lańcuch)
LOWER(string)
LPAD(/ańcuch,
d/ugość _po_ wypelniem'u, [, lańcuch _ wypelniaiący])
L TRIM(lańcuch [, lańcuch _obcięcia])
Opis
Zwraca pozycję wystąpienia łańcucha numer 2 w łańcuchu numer 1 Oeśl i łańcuch 2 nie występuje w łańcuchu 1, zwracana jest wartość O). pozycja _początkowa oznacza znak, od którego należy zacząć poszukiwanie łańcucha 2 (domyślna wartość to 1 ). Ujemna wartość pozycji spowoduje przeszukanie łańcucha 1 od kolica. n to numer szukanego wystąpienia lalicucha 2 w łańcuchu 1 (domyślna wartość to 1 ).
Wybiera spośród łańcuchów tekstowych ten, który zajmowałby wśród nich pierwsze miejsce, gdyby uszeregowano je w kolejności rosnącej
(przeciwieństwo GREATEST).
Zwraca l iczbę znaków w łańcuchu. Warianty LENGTHB, LENGTHC, LENGTH2 oraz LENGTH4 zwracają - odpowiednio - l iczbę ba~ów, l iczbę
znaków Unicode, l iczbę elementów kodu USC2 oraz l iczbę elementów kodu USC4. W przypadku przekazania argumentu NULL funkcja LENGTH również zwraca NULL. Przekazanie argumentu pustego (lecz różnego od NULL) spowoduje zwrócenie wartości O.
Konwertuje łańcuch tekstowy do małych liter (przeciwieństwo UPPER).
Zwraca łańcuch wejściowy uzupełniony (z lewej strony) wystarczającą l iczbą znaków łańcucha wypełniającego, by jego całkowita długość stała się równa wskazanej wartości. Domyślną wartością łańcucha wypełniającego jest odstęp.
Usuwa z lewej strony łańcucha wejściowego wszystkie maki zawarte w łańcuchu obcięcia. Domyślną wartością łańcucha obcięcia jest odstęp. Patrz również TRIM oraz RTRIM.
Wbudowane funkcje i pakiety I 103
Funkcja
NCHR(kod)
NLS _INITCAPVańcuch)
NLS _INITCAPVańcuch, 'NLS SORT =nazwa sekwencji_ sortowania')
NLS _ LOWER(lańcuch) oraz NLS_LOWER Vańcuch, 'NLS SORT =nazwa sekwencji_ sortowania')
NLS _ UPPER(lańcuch) oraz NLS _UPPER (lańcuch,
'NLS SORT =nazwa sekwencji_ sortowania')
NLSSORT(lańcuch) oraz NLSSORT Vańcuch, 'NLS SORT =nazwa sekwencji_ sortowania')
Opis
Zwraca łańcuch VARCHAR2 o długości 1, odpowiadający położeniu danego kodu w wykorzystywanym zestawie znaków (funkcjonalność analogiczna do CHR z klauzulą
USING NCHAR_CS).
Zmienia format łańcucha wejściowego, zapisując pierwszą literę każdego z wyrazów wersalikami, zaś pozostałe części wyrazów - małymi literami . • Wyrazem" jest każdy ciąg znaków alfanumerycznych ograniczony odstępami lub znakami niealfanumerycznymi (np. # lub j . Zwracany rezultat jest typu VARCHAR2.
Umożliwia wybór sekwencji sortowania, od której zależy definicja .pierwszej litery• wyrazu (patrz wyżej) . Nazwa sekwencji powinna odpowiadać jednej z wartości wyszczególnionych w dodatku A poradnika Oracle Database G/obaliza6on Support. Konwertuje łańcuch do małych liter zgodnie z kryteriami wybranego języka (patrz NLS _INITCAP).
Konwertuje łańcuch do dużych liter zgodnie z kryteriami wybranego języka (patrz NLS _INITCAP).
Zwraca łańcuch ba~ów, który może zostać wykorzystany do posortowania wartości wejściowej zgodnie ze wskazanymi (lub domyśl
nymi) kryteriami językowymi. Zwrócony łańcuch jest typu RAW.
104 I Oracle PL/SQ:L. Kieszonkowy słownik języka
Funkcja
REGEXP INSTR, REGEXP=LINE, REGEXP REPL.ACE, REGEXP- SUBSTR
REPLACEVańcuch, fańcuch wyszukiwany, fańcuch =zastępczy)
RPAD(fańcuch,
dfugość _po_ wypefnieniu, (, fańcuch _ wypefniający])
RTRIM(fańcuch
[, lań cuch_ obcięcia])
SOUNDEX(fańcuch)
SUBSTR(fańcuch, początek [, dfugość])
TO_ CHAR(dane _w języku_ narodowym)
Opis
Opisy tych funkcji są przedstawione w dziale Wbudowane funkcje obsfugi wyrażeń regularnych.
Zwraca łańcuch wejściowy po zastąpieniu
wszystkich wystąpień łańcucha wyszukiwanego łańcuchem zastępczym.
Zwraca łańcuch wejściowy, lecz uzupełniony
(z prawej strony) wystarczającą liczbą znaków łańcucha wypełniającego, by jego całkowita długość stała się równa wskazanej wartości. Domyślną wartością łańcucha wypełniającego
jest odstęp.
Usuwa z prawej strony łańcucha wejściowego wszystkie znaki zawarte w łańcuchu obcięcia. Domyślną wartością łańcucha obcięcia jest odstęp. Patrz również TRIM oraz L TRIM.
Zwraca łańcuch stanowiący reprezentację
fonetyczną łańcucha wejściowego.
Zwraca podlańcuch rozpoczynający się od podanej pozycji (oraz - opcjonalnie - o podanej długości) . Ujemna wartość parametru początek spowoduje przeszukanie łańcucha wejściowego od końca. Domyślną wartością parametru dfugość jest długość pozostałej części łańcu
cha wejściowego.
Konwertuje dane wejściowe (zapisane w języku narodowym) do bazodanowego zestawu znaków (patrz również TO _NCHAR). Za pomocą TO CHAR można konwertować daty oraz liczby do czytelnej dla użytkownika postaci.
Wbudowane funkcje i pakiety I 105
Funkcja
TO_ MUL TI_ BYTEVańcuch)
TO _NCHAR(dane _wczytane_ z_bazy)
TO_ SINGLE_ BYTEVańcuch)
TRAN SL.A TE(lańcuch, zestaw_ wyszukiwania, zestaw _zastępczy)
TRAN SL.A TE(tekst USll\'IG CHAR_CS) oraz TRAN SL.A TE(tekst USll\'IG NCHAR_CS)
TRIM([LEADING I TRAILING I BOTH] znak FROM lańcuch)
UNISTRVańcuch)
UPPERVańcuch)
Opis
Konwertuje jednobajtowe znaki na ich wielobajtowe odpowiedniki (przeciwieństwo
TO_SINGLE_BYTE).
Konwertuje dane wejściowe (wczytane z bazy) do narodowego zestawu znaków (patrz również TO_CHAR oraz TRANSL.ATE ... USING).
Konwertuje wielobajtowe znaki na ich jednoba~owe odpowiedniki (przeciwieństwo TO_MULTl_BYTE).
Zastępuje w łańcuchu wejściowym każde wystąpienie znaku z zestawu wyszukiwania odpowiednim znakiem z zestawu zastępczego.
Konwertuje dane wejściowe do bazodanowego zestawu znaków (CHAR_ CS) lub do narodowego zestawu znaków (NCHAR _CS). Rezultat jest typu VARCHAR2 lub NVARCHAR2, w zależności od zastosowanego wariantu funkcji.
Zwraca łańcuch wejściowy oczyszczony ze wszystkich odstępów na jego początku i końcu. Opcjonalne klauzule LEADING FROM, TRAIUNG FROM oraz BOTH FROM powodują usunięcie
wszystkich znaków znak - odpowiednio - po lewej, po prawej oraz po obu stronach łańcucha wejściowego. Domyślną wartością argumentu znak jest odstęp.
Zwraca łańcuch wejściowy skonwertowany do zestawu Unicode (przeciwieństwo ASCISTR). Znaki specjalne mogą być reprezentowane w łańcuchu wejściowym za pomocą kodów \XXXX. Zwraca łańcuch wejściowy po skonwertowaniu wszystkich liter do wersalików.
106 I Oracle PL/SQ:L. Kieszonkowy słownik języka
Funkcje operujące na liczbach
Funkcja
ABS(n)
ACOS(n)
ASIN(n)
ATAN(n)
ATAN2(n, m)
BIN_TO_NUM(bt, b2, ... bn)
BITAND(n, m)
CEIL(n)
COS(n)
COSH(n)
EXP(n)
FLOOR(n)
GREATEST(nt, n2, .. n3)
Opis
Zwraca wartość bezwzględną n. Zwraca arcus cosinus n, gdzie n jest wartością z przedziału O- 1. Rezultat należy do przedziału O- ir.
Zwraca arcus sinus n, gdzie n jest wartością z przedziału -1 - 1. Rezultat należy do przedziału -it12 - it12.
Zwraca arcus tangens zn, gdzie n jest dowolną liczbą.
Rezultat należy do przedziału -w2 - it12.
Zwraca arcus tangens zn/m, gdzie n i m są dowolnymi liczbami. Rezultat ATAN2(n, m) jest z definicji tożsamy z rezultatem ATAN(n/m).
Konwertuje wektor bitowy reprezentowany przez wartości b 1 ... bn do liczby całkowitej. Każda z wartości b musi być równa O lub 1.
Przeprowadza binarną operację AND na wartościach
n i m.
Zwraca najmniejszą l iczbę całkowitą większą lub równą n. Zwraca cosinus kąta n, wyrażonego w radianach.
Zwraca cosinus hiperboliczny n. Jeśli n jest l iczbą rzeczywistą, zaś i - pierwiastkiem kwadratowym z -1, wówczas związek między COS a COSH można wyrazić wzorem COS(i*n) = COSH(n).
Zwraca wartość e do potęgi n. Liczba e jest podstawą logarytmów naturalnych (w przybliżeniu - 2, 71828).
Zwraca największą liczbę całkowitą mniejszą lub równą n. Zwraca największą z podanych liczb .
Wbudowane funkcje i pakiety I 107
Funkcja
LEAST(nt, n2, „.n3)
LN(n)
LOG(b, n)
MOD(n,m)
NANVL{n, m)
POWER{n,m)
REMAINDER{n, m)
ROUND{n)
ROUND{n,m)
SIGN(n)
SIN(n)
SINH(n)
SQRT{n)
TAN(n)
Opis
Zwraca najmniejszą z podanych liczb.
Zwraca logarytm naturalny n. Wartość n nie może być ujemna.
Zwraca logarytm o podstawieb zn. Wartość n nie może być ujemna, zaś wartość b musi być większa od 1.
Zwraca resztę z dzielenia n przez m. Do obliczenia reszty stosowany jest wzór n-(m*FLOOR(n/m)), jeśli obydwa argumenty mają ten sam znak, oraz wzór n-(m*CEIL(n/m)) w przeciwnym przypadku.
Zwracam, jeśl i n jest wartością NaN (ang. Not a Number); w przeciwnym razie zwraca n.
Podnosi n do potęgi m. Jeśli n jest ujemne, wówczas m musi być liczbą całkowitą.
Zwraca resztę z dzielenia n przez m. Do obliczenia reszty stosowany jest wzór n-(m*ROUND{n/m)).
Zwraca wartość n zaokrągloną do najbliższej liczby całkowitej.
Zwraca wartość n zaokrągloną dom miejsc dziesiętnych. Wartość m może być ujemna - w takim wypadku liczba n jest zaokrąglana do wskazanego rzędu wielkości .
Zwraca -1, O lub 1, w zależności od tego, czy wartość n jest - odpowiednio - ujemna, zerowa, czy dodatnia.
Zwraca sinus kąta n, wyrażonego w radianach.
Zwraca sinus hiperbolicmy n. Jeśl i n jest liczbą rzeczywistą, zaś i - pierwiastkiem kwadratowym z -1, wówczas związek między SIN a SINH można wyrazić
wzorem SIN{i*n) = i*SINH(n).
Zwraca pierwiastek kwadratowy z dodatniej wartości n.
Zwraca tangens kąta n, wyrażonego w radianach.
108 I Oracle PL/SQ:L Kieszonkowy słownik języka
Funkcja
TANH(n)
TRUNC(n [pl)
Opis
Zwraca tangens hiperboliczny n. Jeśli n jest l iczbą rzeczywistą, zaś i - pierwiastkiem kwadratowym z -1, wówczas związek między TAN a TANH można wyrazić
wzorem TAN(i*n) = i*TANH(n).
Obcina wartość n do m miejsc dziesiętnych. Opcjonalny parametr precyzji p jest domyślnie równy zero -ujemna wartość p powoduje wyzerowanie p liczb znaczących na lewo od przecinka.
Funkcje operujące na wartościach DATETIME
Funkcja
ADO_ MONTHS(data, n)
CAST (wyrażenie AS typ_ danych)
CURRENT DATE
CURRENT TIMESTAMP VJ) -
DBTIMEZONE
EXTRACT(element FROM wyrażenie)
Opis
Dodaje n miesięcy do wartości typu DATE, zwracając wartość typu DA TE.
Konwertuje wejściowe wyrażenie do wskazanego typu danych. Za pomocą CAST możliwe jest konwertowanie łańcuchów tekstowych do typów DATETIME (oraz na odwrót).
Zwraca bieżącą datę, godzinę i strefę czasową sesji jako wartość DA TE.
Zwraca bieżącą datę i strefę czasową sesji jako wartość TIMESTAMP WITH TIME ZONE. Opcjonalny parametr p określa żądaną liczbę miejsc dziesiętnych
(domyślnie 6).
Zwraca przesunięcie czasowe bazy danych względem czasu UTC (rezultat jest zwracany jako łańcuch tekstowy).
Wyodrębnia wskazany element z wartości DAIDIME. Dopuszczalne nazwy elementów to YEAR (rok), MONTH (miesiąc), DAY (dzień) , HOUR (godzina), MINUTE (minuta), SECOND (sekunda), TIMZONE _HOUR (strefa czasowa - godzina), TIMEZONE _MINUTE (strefa czasowa - minuta),
Wbudowane funkcje i pakiety I 109
Funkcja
FROM_ TZ(ts, strefa)
L.AST _DAY(wyrażenie)
LOCALTIMESTAMP(o)
MONTHS BElWEEN (data_ końcowa, data _początkowa)
NEW_ TIME(data, strefa 1, strefa2)
NEXT _DAY(data, dzień_ tygodnia)
NUMTODSINTERVAL (n, jednostka)
NUMTOYMINTERVAL (n, jednostka)
ROUND(data, format)
SESSIONTIMEZONE
Opis TIMEZONE _REGION (strefa czasowa - region) oraz TIMEZONE _ ABBR (skrótowa nazwa strefy czasowej).
Dodaje informację o strefie czasowej do wartości typu TIMESTAMP, zwracając rezultat typu TIMESTAMP WJTH TIME ZONE.
Zwraca numer ostatniego dnia miesiąca wyszczególnionego w wyrażeniu typu DATE.
Zwraca lokalną datę i godzinę jako wartość TIMESTAMP. Opcjonalny parametr p określa żądaną liczbę miejsc dziesiętnych (domyślnie 6).
Zwraca l iczbę miesięcy dzielących podane daty.
Konwertuje wartość DATETIME wyrażoną względem pierwszej z podanych stref czasowych do innej strefy czasowej. Funkcja służąca zachowaniu kompatybilności wstecznej (obecnie lepiej posługiwać się typem TIMESTAMPWITH TIME ZONE).
Zwraca datę pierwszego wystąpienia podanego dnia tygodnia po wskazanej dacie.
Konwertuje n jednostek typu jednostka do wartości INTERVAL DAY TO SECOND. Dopuszczalne jednostki to DAY (dzień), HOUR (godzina), MINUTE (minuta) lub SECOND (sekunda).
Konwertuje n jednostek typu jednostka do wartości INTERVAL YEAR TO MONTH. Dopuszczalne jednostki to YEAR (rok) lub MONTH (miesiąc).
Zaokrągla podaną datę zgodnie ze wskazanym formatem (domyślnie - do najbliższego dnia).
Zwraca przesunięcie czasowe sesji względem czasu UTC (rezultat jest zwracany jako łańcuch tekstowy).
110 I Oracle PL/SQ:L. Kieszonkowy słownik języka
Funkcja
SYSDATE
SYS EXTRACT UTC (data) -
SYSTIMESTAMP
TO_CHAR(data, format}
TO_ DA TEVańcuch, format)
TO DSINTERVAL ąancuch)
TO TIMESTAMP ąancuch, format)
TO TIMESTAMP TZ ąancuch, format)
TO YMINTERVAL ąancuch)
Opis
Zwraca bieżącą datę i godzinę serwera bazodanowego jako wartość DA TE.
Konwertuje wartość typu TIMESTAMP WITH TIME ZONE do typu TIMESTAMP, uwzględniając przesunięcie względem czasu UTC.
Zwraca bieżącą datę, godzinę i strefę czasową serwera bazodanowego jako wartość TIMESTAMP WITH TIMEZONE.
Konwertuje wartość DA TETIME na łańcuch tekstowy przy opcjonalnym zastosowaniu wskazanego formatu (domyślnie jestto format NLS_DATE_FORMATsesji bazodanowej).
Konwertuje łańcuch tekstowy do wartości typu DATE przy opcjonalnym zastosowaniu wskazanego formatu (domyślnie jestto format NLS_DATE_FORMATsesji bazodanowej).
Konwertuje łańcuch tekstowy reprezentujący przedział czasu (wyrażony w dniach, godzinach, minutach i sekundach) do wartości INTERVAL DAY TO SECOND.
Konwertuje łańcuch tekstowy reprezentujący wartość DATETIME do wartości typu TIMESTAMP przy opcjonalnym zastosowaniu wskazanego formatu (domyślnie jest to format NLS_ TIMESTAMP _FORMAT sesji bazodanowej).
Konwertuje łańcuch tekstowy reprezentujący wartość DATETIME do wartości typu TIMESTAMP WITH TIME ZONE przy opcjonalnym zastosowaniu wskazanego formatu (domyślnie jest to format NLS_TIMESTAMP _FORMAT sesji bazodanowej).
Konwertuje łańcuch tekstowy reprezentujący przedział czasu (wyrażony w latach i miesiącach) do wartości
INTERVAL YEAR TO MONTH.
Wbudowane funkcje i pakiety I 111
Funkcja
TRUNC(data, format)
TZ OFFSET (siiefa _czasowa)
Opis
Redukuje precyzję wartości DATETIME zgodnie z podanym fonnatem (domyślnie -zaokrąglając
do pełnych dni).
Zwraca przesunięcie podanej strefy czasowej względem czasu UTC. Zamiast nazwy strefy czasowej można podać słowo kluczowe SESSIONTIMEZONE (strefa sesji) lub DBTIMEZONE (strefa serwera).
Wbudowane funkcje obsługi wyrażeń regularnych
Bazy danych Oracle obsługują wyrażenia regularne za pośrednictwem pięciu wbudowanych funkcji: REGEXP _COUNT (nowość w systemie Oracle Database I lg), REGEXP _INSTR, REGEXP _LIKE, REGEXP _REPLACE oraz REGEXP _SUBSTR. Więcej szczegółów można znaleźć w książce Oracle Regular Expressions Pocket Referen.ce autorstwa Jonathana Gennicka oraz Petera Linsleya.
Metaznaki
Wyrażenia regularne przydają się w pracy z poleceniami uniksowymi , takimi jak grep, sed oraz edytor ex. Są też powszechnie wykorzystywane w języku Perl oraz w wielu innych programach narzędziowych. Stanowią dobry mechanizm przetwarzania danych tekstowych, głównie z uwagi na wykorzystanie tzw. metaznaków. Poniższa tabela opisuje metaznaki dostępne w ramach wyrażeń regularnych:
Wzorzec metaznaku
* +
Opis
Gwiazdka. Oznacza zero lub więcej wystąpień.
Plus. Oznacza jedno lub więcej wystąpień.
112 I Oracle PL/SQ:L. Kieszonkowy słownik języka
Wzorzec metaznaku
?
$
\
{m}
{m,}
{m,n}
I o VI
[::]
[ .. ]
[==)
Opis
Pytajnik. Oznacza zero lub jedno wystąpienie.
Symbol karetki. Oznacza początek wiersza.
Znak dolara. Oznacza koniec wiersza.
Kropka. Oznacza dowolny pojedynczy mak.
Ukośnik odwrotny. Pozbawia specjalnego znaczenia następujący po nim znak.
Nawiasy klamrowe. Oznaczają dokładnie m wystąpień.
Nawiasy klamrowe. Oznaczają przynajmniej m wystąpień.
Nawiasy klamrowe. Oznaczają przynajmniej m wystąpień, lecz nie więcej niż n wystąpień.
Nawiasy kwadratowe. Omaczają dowolny z zawartych w nim elementów.
Pionowa kreska. Operator alternatywy.
Nawiasy okrągłe. Operator grupowania.
Ukośnik odwrotny. Operator referencji (\1 do \9), wykorzystywany w połączeniu z nawiasami okrągłymi jako odwołanie do n-tego wystąpienia danego wyrai.enia. (REGEXP _REPLACE dopuszcza w łańcuchu zastępczym maksymalnie 500 niezależnych odwołań.)
Klasa maków. Przykłady to [:digit:] (cyfry) oraz [:alnum:] (znaki alfanumeryczne).
Zgrupowanie. Zawarte w nawiasach znaki są traktowane jako pojedynczy znak na potrzeby wszelkich operacji związanych z wyrai.eniem regularnym (przykładem jest zbitka 'eh' w języku hiszpańskim).
Klasa ekwiwalencji. Odpowiada wszystkim wariantom znaku bazowego (np. z ogonkami lub akcentami).
Wbudowane funkcje i pakiety I 113
REGEXP COUNT (Oracle Database 11g) Funkcja REGEXP _C OUNT zwraca liczbę wystąpień danego wyrażenia regularnego w wybranej kolumnie, zmiennej lub literale tekstowym:
REGEXP _COUNT <tańcucli_ź ródłowy . wzorzec [.pozycj a , modyfi kator_zgodności J l )
łańcuch_źródlowy to badany łańcuch, wzorzec to wyrażenie regularne, zaś mody:fikator _zgodnofci to modyfikator kryteriów wyszukiwania (patrz dział M odyfikatory zgodnofci) . Oto przykład:
numer_te l efonu : = '\( ?\dC3J\ )?[ \ s . - J?\ dC3J[\s- . J?\dC4J' ; -- zl i czafl1Y l iczbe wystapien numerow tel efonow w opis ie uzytkowni ka: l i czba_tel e fonow := regexp_count (opi s_cl ob, nume r_tel e fonu) ;
REGEXP LIKE Funkcja REGEXP _LłKE sprawdza, czy dana kolumna, zmienna lub literał tekstowy zawiera tekst odpowiadający podanemu wyrażeniu regularnemu. Jeśli tak, zwracana jest wartość prawdy; w przeciwnym razie REGEXP _LIKE zwraca wartość fałszu :
REGE XP _LI KE tłańcuch_źród łowy • wzorzec [.modyf i ka tor _zgodnoś c i J)
łańcuch_źródlowy to badany łańcuch, wzorzec to wyrażenie regularne, zaś modyfikator _zgodnofci to modyfikator kryteriów wyszukiwania. Oto przykład :
IF REGEXP_LIKECnume r_tel e fonu, '' \ (?22\)? ' THEN
-- numer t e l efonu zaczyna si ę od 22 , opcjonal ni e w nawi asach OPLATA_ZAMIEJ SCOWA_WARSZAWA;
END IF;
114 Oracle PL/SQ:L. Kieszonkowy słownik języka
REGEXP INSTR Funkcja REGEXP _ INSTR odnajduje w danym łańcuchu wystą
pienie tekstu odpowiadającego wejściowemu wyrażeniu regularnemu. Zwracana jest pozycja początkowa lub końcowa odnalezionego łańcucha:
REGEXP _I NSTR (łańcucli_źród łowy wzorzec [ , pozycja_początkowa [ , wystąpi en i e [ ,rodzaj_rezul tat u [ ,modyf i kator_zgodnośc i
[,podwyrażen i e ]]]]] )
łańcuch_iródlowy to łańcuch, który ma zostać przeszukany, wzorzec to wyrażenie regularne, pozycja_początkowa to pozycja, od której należy rozpocząć przeszukiwanie ła11cucha źródłowego, wystąpienie to numer interesującego nas wystąpienia wzorca (1 = pierwsze wystąpienie, 2 = drugie wystąpienie itp.), rodzaj_rezultatu to O (zwracana pozycja początkowa) lub 1 (zwracana pozycja końcowa), zaś nwdyfikator_zgodno.\:ci to lista modyfikatorów wyszukiwania. W systemie Oracle Database I lg możliwe jest również podanie podwyrażenia, którego pozycja ma zostać zwrócona (podwyrażenie musi wchodzić w skład poszukiwanego wzorca). Oto przykład :
przys l owi e :='wszystko bo i s i e czasu , l ecz czas boi s i e pi ramid ' ; -- wyswi et l amy pr zys l owie poczynajac od dr ugi ego wystapi eni a -- l ancucha 'czas ' OBMS_OUTPUT. PUT_LI NE (SUBSTR(przys l owi e
, REGE XP _I NSTR(przys l owi e , ' czas' . 1. 2) ));
Uruchomienie powyższego kodu przyniesie następujący rezultat:
czas boi s i e pi rami d
REGEXP SUBSTR Funkcja REGEXP _SUBSTR odnajduje w kolumnie znakowej, zmiennej lub literale tekstowym fragment odpowiadający podanemu
Wbudowane funkcje i pakiety I 115
wyrażeniu regularnemu. Zwrócone zostają wszystkie odnalezione wystąpienia wzorca. Oto skladnia REGEXP _SUBSTR:
REGEXP _SUBSTR 9a ńcuch_źródłowy . wzorzec [ ,pozycj a [ ,wystąpieni e [ ,modyfi kator_zgodności [ , podwyrażen ie ] ] ] ] )
łańcuch_źródlowy to łańcuch, który ma zostać przeszukany, wzorzec to wyrażenie regularne, pozycja to pozycja, od której należy rozpocząć przeszukiwanie łańcucha źródłowego, wystąpie
nie to numer interesującego nas wystąpienia wzorca (I = pierwsze wystąpienie, 2 = drugie wystąpienie itp.), zaś modyfikator _zgodnofci to lista modyfikatorów wyszukiwania. W systemie Oracle Database 11 g możliwe jest również podanie podwyrażenia,
którego pozycja ma zostać zwrócona (podwyrażenie musi wchodzić w skJad poszukiwanego wzorca) . Oto przykład:
-- wczytujemy nagl owe k adresu (az do pierwszego znaku bi alego) numer_mieszkania := REGEXP_SUBSTR<adres, ' [ [ :di gi t: l l+[: space : l ') :
W kolejnym przykładzie spróbujemy wyciąć numer centrali telefonicznej (środkowa grupa cyfr) z numeru telefonu zapisanego w zmiennej c_ rec . c_c lob. Zastosowane przez nas wyrażenie regularne definiuje numer telefoniczny jako grupę trzech cyfr (opcjonalnie zawartych w nawiasach), opcjonalną kropkę, ukośnik, dywiz lub znak biały, kolejną grupę trzech cyfr, kolejną opcjonalną
kropkę, ukośnik, dywiz lub znak biały i wreszcie grupę czterech cyfr. Po odnalezieni u interesującego nas wzorca wycinamy z niego środkowe cyfry, po czym zapisujemy je w zmiennej central a. Oto przykladowe dane, którymi się posłużymy:
SELECT * FROH kont alkty WHERE i d_kontaktu=26:
ID_KONTAKTU NAZWA_KONTAKTU CLOB_KONTAKTU
26 Elwood Bl ues Brat "Jol iet" Jake'a
116 Oracle PL/SQ:L. Kieszonkowy słownik języka
ad res : 1060 W Addi son St Chicago , IL 60613 dom 773-555-5253 klub 312-555-2468
Poniższy blok kodu odnajduje interesujące nas dane:
DECLARE wzo rzec VARCHAR2C45); centrala VARCHAR2C3) ; CURSOR c_cur IS
SELECT cl ob_kontaktu c_clob FROM kontakty WHERE id_kontakt u=26 ;
BEGIN wzo rzec:= '\(?(\d(3})\)?[ \s . - J?(\d(3}) [\s . -J?C\d(4})': - - wczytujemy dr ug i e podwyrazenie z pierwszego - - wys t api eni a wzorca FOR c_rec i n c_c ur LOOP
central a :=REGEXP_SUBSTRCc_rec . c_clob ,wzorzec,l , l,' i ' , 2) ; DBMS_OUTPUT. PUT_LINE C'cent ra l a=' ll central a):
END LOOP; END;
Oto rezultat:
cent ra l a=555
REGEXP REPLACE Funkcja REGEXP _REPLACE zastępuje wystąpienie szukanego wzorca wskazanym łańcuchem tekstowym. W łańcuchu zastęp
czym mogą znajdować się odwołania do wzorca:
REGEXP _REPLAC E hńcuch_źródłowy . wzorzec [ , łańcuch_zastępczy [,pozycj a [ ,wystąp i enie [ , modyfi kator_zgodności }]]})
Wbudowane funkcje i pakiety I 117
łańcuch_źródlowy to łańcuch, który ma zostać przeszukany, wzorzec to wyrażenie regularne, laticuch_zastępczy to łańcuch,
którym należy zastąpić wystąpienie wzorca, pozycja to pozycja, od której należy rozpocząć przeszukiwanie ła11cucha źródłowego, wystąpienie to numer interesującego nas wystąpienia wzorca ( I = pierwsze wystąpienie, 2 =drugie wystąpienie itp.), zaś nuxlyjikator _ zgodnofci to lista modyfikatorów wyszukiwania. Oto przykład :
zmieniamy domene adresu elektronicznego modyf i kujemy caly tekst umieszczony po znaku@ az do wystapienia lancucha ' . com'
OBMS_OUT PUT. PUT_LINE( REGEX P_REPLACE<ema i l . '@.*\ . com'.'@nowa_domena . com')):
Modyfikatory zgodno:ści
Parametr modyfikator _zgodnofci, obecny w funkcjach przetwarzających wyrażenia regularne, może przybrać jedną z poniższych wartości:
Modyfikator Opis
c
n
m
Ignorowanie wielkości liter (domyślna funkcjonal ność zależna od NLS_SORT).
Uwzględnianie wielkości liter (domyślna funkcjonalność zależna
od NLS_SORT).
Metazna.k . (kropka) może odpowiadać znakom końca wiersza.
Potraktowanie parametru /ańcuch źród/owy jako zbioru osobnych wierszy na potrzeby przetwafiania symboli ń oraz $.
Wbudowane pakiety
System Oracle rozbudowuje podstawową funkcjonalność PL/SQL-a o kilkaset wbudowanych pakietów, dostępnych w pro-
118 Oracle PL/SQ:L. Kieszonkowy słownik języka
gramach PUSQL-owych. Nazwy tych pakietów zaczynają się od „DBMS_" oraz „UTL_'', zaś ich zawartość ułatwia realizację
wymagań użytkowników. Poniższa tabela przedstawia niewielki podzbiór najczęściej stosowanych pakietów oraz umieszczonych wewnątrz nich programów. Więcej informacji na temat wbudowanych pakietów PUSQL-owych można znaleźć w przewodniku Oracle Database PUSQL Packages and Types Reference, wchodzącym w skJad dokumentacji systemu Oracle.
Wbudowane pakiety/programy
DBMS_CRYPTO
ENCRYPT
DECRYPT
HASH
MAC
DBMS_DB_VERSlON (brak programów, wyłącznie stałe)
DBMS_ERRLOG
CREATE ERROR LOG - -DBMS_LOCK
SLEEP
DBMS_LOB
Opis
Szyfruje i deszyfruje dane.
Szyfruje dane RAW lub LOB za pomocą szyfrów strumieniowych lub blokowych.
Deszyfruje dane RAW lub LOB.
Generuje wartość haszującą (np. MD5, SHA-1) z danych RAW lub LOB.
Generuje kod MAC (np. MD5, SHA-1) z danych RAW lub LOB.
Informacje o wersji bazy danych (tylko w systemie Oracle Database 10g lub nowszych).
Umożliwia logowanie błędów DML-owych oraz kontynuowanie wykonywania programów w razie wystąpienia takich błędów (tylko w systemie Oracle Database 1 Og Release 2).
Tworzy log błędów w formie tabeli.
Umożliwia blokowanie usług zarządzania.
Wstrzymuje wykonywanie programu na określoną l iczbę sekund (lub ułamków sekund).
Udostępnia interfejs API do obsługi dużych
obiektów (CLOB, BLOB i BFILE).
Wbudowane funkcje i pakiety I 119
Wbudowane pakiety/programy Opis
OPEN Otwiera obiekt LOB.
CLOSE
INSTR, SUBSTR, TRIM, APPEND
CREA TETEMPORARY, FREETEMPORARY, ISTEMPORARY
GETLENGTH
LOADFROMFILE, LOADBLOBFROMFILE
DBMS METADATA
GET XML
GET DOL
SET FILTER
DBMS_OUTPUT
ENABLE
DISABLE
PUT LINE
PUT
NEW LINE
Zamyka obiekt LOB.
Obróbka danych w obiektach LOB.
Obsługa tymczasowych obiektów LOB (korzystanie z obiektów tymczasowych zmniejsza narzut czasowy związany z ich obróbką).
Zwraca długość obiektu LOB.
Wczytuje dane z plików do obiektów LOB.
Przekształca obiekty bazodanowe w skrypty, które mogą zostać wykorzystane celem odtworzenia ich struktury.
Zwraca metadane w formie dokumentu XML.
Zwraca polecenie DOL jako obiekt GLOB.
Definiuje filtr, który ogranicza zestaw obiektów wczytywanych ze słownika danych.
Kieruje dane z programu PUSQL-owego do strumienia wyjścia (zazwyczaj w celu wyświetlenia ich na ekranie).
Aktywuje DBMS OUTPUT i umożliwia kierowanie tekstu do bufora wyjścia.
Dezaktywuje DBMS _ OUTPUT.
Wyświetla komunikat zakończony znakiem końca wiersza.
Wyświetla komunikat (bez maku końca wiersza).
Wyświetla znak końca wiersza.
120 I Oracle PL/SQ:L. Kieszonkowy słownik języka
Wbudowane pakiety/programy
GET LINE
GET LINES
DBMS_RLS
ADO POLICY
DROP POLICY
EXECUTE
DBMS _ SCHEDULER
CREATE JOB
RUN JOB
DROP JOB
DBMS_SQL
OPEN CURSOR
PAR SE
DEFINE COLUMN
BIND VARIABLE
EXECUTE
EXECUTE AND FETCH - -
Opis
Wczytuje pojedynczy wiersz z bufora.
Wczytuje tabl icę wierszy z bufora.
Implementacja bezpieczeństwa na poziomie wierszy (tzn. wirtualnej prywatnej bazy danych).
Definiuje nową politykę bezpieczeństwa dla wskazanej tabeli.
Kasuje politykę bezpieczeństwa dla wskazanej tabeli.
Uruchamia pol itykę bezpieczeństwa, umożli
wiając przetestowanie jej działania.
Zaawansowane mechanizmy kolejkowania zadali (dostępne w systemie Oracle Database 1 Og i nowszych); zastępują pakiet DBMS _JOB.
Tworzy zadanie.
Uruchamia zadanie.
Usuwa zadanie.
Uruchamia dynamiczne wyrażenia SQL-owe, umożliwiające implementację zaawansowanych wymagań biznesowych.
Otwiera kursor.
Parsuje dynamiczne wyrażenie SQL-owe.
Definiuje kolumnę odpowiadającą pojedynczemu typowi danych.
Dowiązuje zmienną do etykiety.
Uruchamia wyrażenie SQL-owe.
Uruchamia wyrażenie SQL-owe i wczytuje pierwszy wiersz rezultatu.
Wbudowane funkcje i pakiety I 121
Wbudowane pakiety/programy
FETCH ROWS
COLUMN VALUE
CLOSE CURSOR
DBMS_UTILITY
COMPILE SCHEMA
EXEC DOL STATEMENT - -FORMAT ERROR STACK - -FORMAT ERROR BACKTRACE - -
FORMAT CALL STACK - -GET TIME
GET CPU TIME - -
HTF
FORM* (np. FORMTEXT, FORMSUBMIT)
TABLE* (np. TABLEDATA, TABLECAPTION)
HTP
HTML OPEN
Opis
Wczytuje jeden lub więcej wierszy rezultatu.
Wyodrębnia wartość kolumny z wczytanego wiersza.
Zamyka kursor.
Rozmaite programy narzędziowe.
Dokonuje rekompilacji modułów wchodzących w skład danego schematu.
Uruchamia polecenie DOL-owe.
Zwraca pelny komunikat o błędzie.
Zwraca stos wywołań wraz z numerem wiersza, w którym wystąptt błąd .
Zwraca bieżący stos wywolań.
Zwraca czas systemu z dokładnością do setnych części sekundy (funkcja przydatna w testowaniu wydajności programów).
Zwraca czas procesora z dokładnością do setnych części sekundy (funkcja przydatna w testowaniu zapotrzebowania programów na moc obliczeniową).
Funkcje służące do generowania kodu HTML (przydatne w aplikacjach sieciowych).
Funkcje służące do obróbki zawartości formularzy HTML.
Funkcje służące do obróbki zawartości tabel HTML.
Procedury slużące do generowania kodu HTML (przydatne w aplikacjach sieciowych).
Otwiera dokument HTML.
122 I Oracle PL/SQ:L. Kieszonkowy słownik języka
Wbudowane pakiety/programy Opis
HTMLCLOSE Zamyka dokument HTML.
un_FILE
FO PEN
ISO PEN
FFLUSH
FC LO SE
GET LINE
PUT LINE
PUT
PUTF
NEW LINE
FGETPOS
FSEEK
FRENAME
FREMOVE
un_MAIL
SEND
SEND ATTACH VARCHAR2 - -SEND ATTACH RAW - -
Wysyła tekst do bufora HTML.
Narzędzia do obróbki plików tekstowych.
Otwiera plik tekstowy w celu odczytu lub zapisu danych.
Sprawdza, czy dany plik jest otwarty.
Opróżnia bufor zapisu, wprowadzając wszystkie dane do pliku.
Zamyka plik.
Wczytuje pojedynczy wiersz tekstu (bez znaku końca wiersza).
Zapisuje w pliku podany tekst oraz znak końca wiersza.
Zapisuje w pliku podany tekst {bez znaku końca wiersza).
Zapisuje sformatowany tekst w pliku.
Zapisuje w pliku znak końca wiersza.
Zwraca bieżącą pozycję wskażnika odczytu w otwartym pliku (w ba~ach).
Przenosi wskażnik odczytu do wskazanego miejsca w pliku.
Zmienia nazwę pliku.
Kasuje plik.
Obsługa poczty elektronicznej (SMTP).
Wysyła wiadomość.
Wysyła wiadomość z załącznikiem tekstowym.
Wysyła wiadomość z załącznikiem binarnym.
Wbudowane funkcje i pakiety I 123
Procedury i funkcje PUSQL umożliwia dzielenie programów na następujące elementy skJadowe:
Procedura Program wykonujący jedno lub więcej poleceil.
Funkcja Program wykonujący jedno lub więcej poleceil i zwracający pewną wartość .
Wyzwalacz Program, którego wywołanie towarzyszy modyfikacji danych zawartych w bazie.
Pakiet Kontener, w skład którego mogą wchodzić procedury, funkcje oraz struktury danych.
Typ obiektowy Odpowiednik klasy - specjalny typ danych, w skład którego mogą wchodzić procedury oraz funkcje.
W poniższych działach opisujemy procedury oraz funkcje. Wyzwalacze, pakiety i typy obiektowe zostaną opisane w dalszej części książki.
Procedury
Procedura to program, który wczytuje zero lub więcej wartości za pośrednictwem listy parametrów, a następnie wykonuje jedno lub więcej poleceil , zgodnie z następującą składnią:
CREAH [OR REPLACEJ PROCEOUREna zwa [ (paramet r [ . parametr J ) J
124 Oracle PL/SQ:L. Kieszonkowy słownik języka
[AUTHI D CC URRE NT_USER I DEFINERJ J US I ASJ
sekcja_deklaracji BEGIN
sekcja_wykonania [EXC EPTIDN
sekcj a_obsług i_wyj ątków ) END [nazwa]:
Aby wywołać zapisaną procedurę, należy podać jej nazwę oraz wymagane przezeń :argumenty:
udzie I _rabatu (i d_nowej_fi rmy. O . 15):
Większość środowisk uruchornieniowych (w tym SQL*Plus) obsługuje również wchodzącą w skład standardu ANSI SQL skład
nię CALL:
CA LL udzie l_rabatu (i d_nowej_f i rmy, 0. 15):
Mimo to, większość programistów korzystających z środowiska
SQL*Plus posługuje się składnią EXECUTE:
EXECUTE udzie l_rabatu(i d_n owej_fi rmy, 0. 15):
Procedurę można też uruchomić w ramach bloku anonimowego:
BEGIN udzie l_raba t u( i d_nowej_firmy):
END :
Funkcje
Funkcja to program, który wykonuje pewną liczbę poleceń i zwraca rezultat za pośrednictwem klauzuli RETURN. Podobnie jak procedury, funkcje mogą przyjmować argumenty. Oto pełna
skJadnia funkcji:
Procedury i funkcje I 125
CREATE [OR REPLACE J FU NCTIO~azwa [ (paramet r [ .paramet r J) J RETURN typ_da nych [AUTHIO CC URRE NT_USER I DEFINERJ J EDETERM I NI ST! Cl [ PARALLEL_ENABLE ~la uzula_pa rtycji J l [ P! PELI NED [US!NGtyp_i mpl ementacji J l ERESULT_CACHE ERELIES_ON ~ista_tabel )]] [AGGREGATE US I NGtyp_implementacji J
US I ASJ [sekcja_dekla racji J
BEGIN sekcja_wykonania
[ EXC EPTION sekcja_obsługi_wyj ątków )
END [nazwa] :
W skład sekcji wykonania funkcji musi wchodzić przynajmniej jedno polecenie RETURN. Klauzula RETURN umieszczona w nagłówku funkcji. określa typ zwracanej wartości.
Informacje o slow.ach kluczowych OR REPLACE, AUTHID, DETERMINISTIC, PARALLEL_ENABLE, PIPELINED oraz AGGREGATE USING można znaleźć w dziale Kompilowanie zapisanych programów PUSQL-owych, zaś opis klauzuli RESULT_CACHE-w dziale Pamięć podręczna rezultatów funkcji.
Funkcja może stanowić zamiennik wyrażenia wszędzie tam, gdzie wymagane jest podanie wartości określonego typu. Wywołanie funkcji może nastąpić w następujących miejscach:
• w poleceniu przypisania:
przychod_08 := ca l kowi ty_p rzychod(2008 , 'C' ) :
• w definicji wartości domyślnej :
DEC LARE przychod_08 NUMB ER DE FAULT calkowi t y_przychod(2008,'C'l :
BEGI N
126 Oracle PL/SQ:L. Kieszonkowy słownik języka
• w wyrażeniu boolowskim:
IF calkowite_obroty(2008, 'C') > 10000 TH EN . . .
• w wyrażeniu SQL-owym:
SELECT imie_kierowni ka , nazwisko_kierowni ka FROM dz i a ly
WHERE calkowi te_obroty(2008,'C') > 1000 :
• na liście argumentów innego programu (poniższy przykJad korzysta ze zdefiniowaniej przez użytkownika fu nkcji ma ksy
ma] ny_ r abat oraz z systemowej funkcji SYSDATE):
udz iel_r aba t u( id_firmy , maksymal ny_rabat(SYSOATE)):
Parametry
Definicjom procedur, funkcji oraz kursorów mogą towarzyszyć listy parametrów. Lista parametrów to zestaw wartości przekazywanych z programu wywołującego do programu wywoływanego.
Każdy parametr składa się z nazwy, typu danych, trybu obsługi
oraz opcjonalnej wartości domyślnej :
nazwa_paramet ru [tryb] [NOCOPYJ typ_danych [ { : = I OE FAU LT J wa rtość J
Typ danych
Typem danych parametru może być dowolny typ PUSQL-owy lub typ zdefiniowany przez programistę. Nie dopuszcza się stosowania typów ograniczonych (np. NUMBER( lO)) - rozmiary parametru określa p rogram wywołujący.
CREATE OR REPLACE PIROCEOURE persona 1 i a_pracowni ka (in_i d prac .prac_ i d%TY PE - - poprawny parametr
Procedury i funkcje 127
,out_nazwi s ko VARCHAR2 ,out_imi e VARCHAR2 C10) l IS
poprawny par ametr bl edny parametr
Długość łańcuchów tekstowych out_nazwi s ko i out_ i mi e zależy od programu wywoEującego :
OECLARE nazwi s ko VARCHAR2C10) ; imie VARCHAR2C1 0 ) :
BEGIN personalia_pracowni kaCl O, nazwi s ko , imie) ;
END;
Tryb obsługi
Tryb obsługi decyduje, czy dany parametr ma służyć tylko do odczytu, czy też do ·odczytu i zapisu:
Tryb
IN
Opis
tylko do odczytu
Zastosowanie
Wartość parametru może być odczytywana wewnątrz podprogramu, lecz nie podlega modyfikacjom.
OUT oraz IN OUT do odczytu i zapisu Wartość parametru może być odczytywana i modyfikowana wewnątrz podprogramu.
Domyślnym trybem obsługi parametrów jest IN.
Tryb OUT różni się od trybu IN OUT. W chwili uruchomienia podprogramu środowisko uruchomieniowe zeruje wszystkie parametry opisane jako OUT (tj . ustawia ich wartość na NULL). Wartości parametrów IN OUT są zachowywane. W razie wystąpienia
błędu wewnątrz podprogramu system automatycznie przywraca
128 I Oracle PL/SQ:L. Kieszonkowy słownik języka
pierwotne wartości parametrów OUT i IN OUT, chyba że definicji danego parametru towarzyszy słowo kluczowe NOCOPY.
Klauzula NOCOPY prosi system o przekazanie parametru przez wskaźnik zamiast przez wartość . Domyślnym trybem pracy środowiska uruchomieniowego PUSQL-a jest sporządzanie kopii wszystkich argumentów przekazywanych do podprogramu (podprogram operuje na kopiach danych wejściowych, a nie na ich rzeczywistych wartościach). W przypadku dużych struktur danych może to doprowadzić do wyraźnego pogorszenia wydajności
aplikacji; czasami należy więc zlecić środowisku wprowadzanie zmian bezpośrednio na wartościach wchodzących w skład kodu wywołującego (tzw. przekazywanie parametru przez wskaźnik) .
Wadą takiego podejścia jest brak możliwości wycofania zmian w przypadku wystąpienia błędu. Zauważmy również, żeNOCOPY stanowi jedynie tzw. wskazówkę, która może - w pewnych okolicznościach - zostać zignorowana przez kompilator (szczegółowy opis działania NOCOPY przedstawiono w książce Programowanie w języku PUSQL).
Wartości d omyślne
Parametrom IN można przypisywać wartofci domy.fine - nie trzeba wówczas każdorazowo określać ich wartości w wywołaniach danej procedUJry lub funkcji. Oto przykład:
CREATE OR REPLACE PIROCEOURE zatrudni eni e ( i d_pracowni ka I N VARCHAR2 ,data_zat rudn i eni a IN DATE : = SYSDATE
- - anal ogi cznie do DE FAULT SYSDATE
IS
, i d_dz ia l u IN NUMBER DEFAULT 1 -- analogiczni e do : = 1 )
Procedury i funkcje I 129
Poniżej przedstawiono kilka możliwych sposobów wywołania procedury zat rudni enie:
-- uzywalJIY obydwu wartosci do111Ys l nych zatrudni enie(nowy_pracowni kl: -- uzywalJIY j ednej wartosci do111Ys l nej zatrudni enie( nowy _pracowni k. ' 12-Jan-2009 ' ) : -- uzywalJIY drug i ej z wa r tosc i do111Ysl nych: notacj a opi sowa zatrudni enie(id_pracowni ka=>nowy_pracownik, i d_dz ia l u=>l 2):
Parametry a argumenty Parametrem nazywamy zmienną, której deklaracja pojawia się w nagłówku procedury lub funkcji. Argument to wartość, która zostaje przypisana t.ej zmiennej w chwili wywołania danego programu. W przypadku opisanej wyżej procedury persona l i a_ pracowni ka, parametry to in_id, out_nazwi sko oraz out _ imi e, zaś argumenty to 10, nazw i ska oraz i mi e.
PL/SQL umożliwia przekazywanie argumentów do procedur i funkcji na dwa sposoby:
Notacja pozycyjna Domyślny sposób przekazywania argumentów. Argumenty są przyporządkowywane parametrom w kolejności , w jakiej pojawiają się w wywołaniu procedury lub funkcji.
Notacja opisowa Umożliwia kojarzenie wprowadzanych argumentów z wybranymi parametrami. Notacja opisowa wymaga uzupełnienia każdego argumentu o nazwę parametru, który ma przyjąć jego wartość. Możliwe jest pominięcie parametrów IN posiadają
cych wartości domyślne.
Poniżej znajduje się przykład wywołania procedury persona l i a_pracown i ka z użyciem obydwu notacji:
130 Oracle PL/SQ:L. Kieszonkowy słownik języka
BEGIN not acja pozycyjna
personal ia_pracowni ka ( l O, nazwi sko , i mi e)
-- not acja op i sowa personal ia_pracowni ka ( i n_i d=>l O
out_nazwi sko=>nazwi sko . out_imie=>imi e ) ;
END;
Obydwie notacje można ze sobą łączyć, lecz argumenty wykorzystujące notację opisową muszą następować po argumentach wykorzystujących notację pozycyjną:
personal i a_pracowni ka(lO , nazwi s ko, out_ imie=>imie);
Wszystkie wersje bazy danych Oracle obsługują notację pozycyjną, natomiast obsługę notacji opisowej i mieszanej wprowadzono dopiero w systemie Oracle Database I l g.
Programy lokalne
Programem lokalnym nazywamy procedurę lub funkcję zdefiniowaną w sekcji deklaracji bloku PL/SQL-owego. Deklaracje programów lokalnych muszą pojawiać się na końcu sekcji deklaracji, po deklaracjach typów, rekordów, kursorów, zmiennych oraz wyjątków. Program zdefiniowany w sekcji deklaracji jest dostępny wyłącznie w sekcjach wykonania oraz obsługi wyjątków danego bloku.
Poniżej znajduje się przykład definicji programów lokalnych:
PROC EOU RE obli czaj_przychody IS
l_suma NUMBER:
Procedury i funkcje I 131
PROCEOURE oblicz_sume ( rok_in IN INTEGERl IS BEGIN
(obl iczenia) ENO;
FUNCTION ponizej_mi nimum (i d_dz ial u IN INTEGERl RETURN BOOLEAN
IS BEGIN
ENO; BEGIN
(obl iczenia)
(l ogika procedury) ENO:
Przy przeładowywaniu programów lokalnych obowiązują takie same ograniczenia, jak w przypadku programów pakietowych.
Przeładowywanie' programów PL/SQL pozwala na zdefiniowanie kilku programów o identycznych nazwach. Mechanizm ten nosi nazwę przeładowania. Programy posiadające wspólną nazwę muszą różnić się w stopniu umożliwiającym kompilatorowi ustalenie, który z nich powinien zostać wywołany .
Oto przykład przeładowania programu w jednym z wbudowanych pakietów systemu Oracle:
PACKAGE OBMS_OUTPUT IS
PROCEOURE PUT_LI NE (a VARCHAR2l: PROCEOURE PUT_Li NE (a NUMBER) : PROCEOURE PUT_Li NE (a OATEl:
ENO:
132 Oracle PL/SQ:L. Kieszonkowy słownik języka
Wszystkie trzy procedury maJą identyczną nazwę - różnią się
jedynie typem parametru.
Skuteczne przeładowywanie programów wymaga spełnienia
jednego z poniższych warunków:
• Parametry muszą należeć do różnych rodzin typów (np.: liczby, typy zna!kowe, typy DATETIME lub wartości boolowskie).
• Programy muszą być odmiennych rodzajów (np. procedura i funkcja o identycznych nazwach oraz identycznych zestawach parametrów).
• Programy muszą różnić się liczbą parametrów.
Poniższe sytuacje są niedopuszczalne:
• Dwie funkcje różniące się jedynie typem rezultatu.
• Dwa programy różniące się typami parametrów w ramach wspólnej rodziny (np. CHAR i V ARCHAR2 lub NUMBER i INTEGER).
• Dwa programy różniące się wyłącznie trybem obsługi parametrów (IN, OUT lub IN OUT).
Poczynając od wersji Oracle Database ! Og, możliwe jest definiowanie programów różniących się wyłącznie typami parametrów liczbowych. System stara się najpierw uruchomić program z parametrem typu PLS_INTEGER (lub BINARY_ INTEGER), a następnie (kolejno) NUMBER, BINARY _FLOAT i BINARY _ DOUBLE. Jeśli zachodzi konieczność zastosowania wydajniejszych typów IEEE 754, należy dokonać konwersj i argumentów za pomocą funkcji TO_BINARY_FLOAT lub TO_BINARY_DOUBLE, lub też uzupełnienia ich nazwy o znaki f lub d (patrz wcześniejszy dział Literały liczbowe).
Procedury i funkcje I 133
Deklaracje wyprzedzające
Wykorzystanie programu w kodzie PUSQL-owym wymaga jego wcześniejszego zadeklarowania. PUSQL obsługuje tzw. rekursję wzajemną: program A może wywołać program B, który z kolei może na powrót wywołać program A. Implementacja takiej rekursji wymaga posłużenia się deklaracją wyprzedzającą,
umieszczoną przed szczegółową definicją danego programu. Deklaracja wyprzedzająca to nagłówek programu, od słowa
PROCEDURE (lub FUNCTION) aż do słowa IS (lub AS):
PROC EOURE obliczeni a( rok_i n IN NUMB ER) IS
I* Dekl aracj a odroczona fun kcji przychod */ FUNCTION przychod ( .. . ) RETURN NUMBE R:
/* Funkcj a zysk_net to moze teraz ko rzystac z fu nkcji przychod */
FUNCTION zysk_net to ( . .. ) RETURN NUM BER IS BEGIN
RETURN przychod( . .. ) - wydatki( . .. ); END :
/* Funkcj a przychod korzys t a z fun kcji zysk_nett o */ FUNCTION przychod ( .. . ) RETURN NUMBE R: IS BEGIN
IF zysk_nett o( .. . ) <O THEN
RETURN O: ELSE RETURN
END IF; END;
BEGIN/* Procedura obl iczeni a*/
END obl i czenia;
134 Oracle PL/SQ:L. Kieszonkowy słownik języka
Funkcje tabelowe
Funkcje tabelowe mogą wchodzić w skład klauzuli FROM w zapytaniu SQL-owym, tak jak gdyby były pełnoprawnymi tabelami bazodanowymi. Nagłówki takich funkcji muszą być zgodne ze standardem SQL (nie można w nich np. stosować parametrów boolowskich) ; ponadto wymagane jest zwrócenie tabeli zagnieżdżonej lub tablicy V ARRA Y o typie zadeklarowanym na poziomie schematu.
Szczególną odmianą funkcji tabelowych są tzw. funkcje potokowe, umożliwiające zwracanie danych wynikowych w trakcie wykonywania obliczerl. Deklaracjom funkcji potokowych musi towarzyszyć słowo kluczowe PIPELINED. Oto prosty przykład zastosowania takiej funkcji:
CREATE OR RE PLACE TYPE num_tab_typ AS TABLE OF NUMBER I
CREATE OR RE PLACE FUNCTION funkcja_potokowa(czynnik IN NUMBE R) RETURN num_tab_typ PIPELINEO AS
BEGIN FOR l iczni k IN 1 . . 1000 LOO P
PIPE ROW (l i cznik*czynnik): END LOOP:
END funkcja_potokowa: I
SELECT COLUHN_VALUE FROM TABLE (funkcja_pot okowa(2)) WHE RE rownum < 5
Pamięć podręczna rezultatów funkcji
System Oracle Database I l g wprowadził nowy rodzaj pa111Jęc1
podręcznej - tzw. pamięć podręczną rezultatów funkcji. Pamięć ta
Procedury i funkcje I 135
wchodzi w skład obszaru SGA i jest dostępna dla wszystkich sesji korzystających z danej funkcji . Związana z nią klauzula RESULT _CACHE najlepiej sprawdza się w przypadku popularnych funkcji (np. takich, z których korzystamy co kilka sekund lub kilka minut), operujących na danych, które nie u legają częstym zmianom. Opcjonalna klauzula RELIES_ON powoduje wymazanie zawartości pamięci podręcznej w przypadku wykonania na danej strukturze danych polecenia DML-owego. Każda instancja środowiska RAC dysponuje własną pamięcią podręczną rezultatów funkcji. Poszczególne instancje mogą przechowywać w swoich pamięciach podręcznych rozmaite rezultaty, lecz system Oracle gwarantuje, że rezultaty te nigdy nie będą ze sobą sprzeczne.
Wywołanie funkcji z nowym zestawem argumentów powoduje zapisanie w pamięci podręcznej zarówno tych argumentów, jak i zwróconego wyniku. Jeśli fu nkcja zostanie ponownie wywołana
z identycznymi argumentami, system nie będzie na nowo obliczał
jej rezultatu , lecz zwróci zapamiętaną wcześniej wartość. Wgląd
w bieżącą zawartość pamięci podręcznej dają perspektywy słownika danych o nazwach zaczynających się od V$RESULT_CACHE. Do kontrolowania rozmiarów pamięci podręcznej oraz trybu jej wykorzystania służą parametry RESULT_CACHE_SIZE oraz RESULT_CACHE_MODE (a także pakiet DBMS_RESULT_ CACHE).
Aby dana funkcja mogla skorzystać z pamięci podręcznej rezultatów, musi spełniać następujące warunki:
• nie jest zdefiniowana w bloku anonimowym,
• nie korzysta z uprawnieil osoby wywołującej (AUTHCD CURRENT _ US!ER),
• nie jest funkcją potokową,
• nie zawiera parametrów obsługiwanych w trybie OUT lub IN OUT,
136 Oracle PL/SQ:L. Kieszonkowy słownik języka
• nie zawiera parametrów typu BLOB, CLOB, NCLOB i REF CURSOR, a także parametrów będących obiektami lub kursoranu,
• jej rezultat nie jest typu BLOB, CLOB, NCLOB, REF CURSOR i nie jest obiektem,
• jeżeli rezultat jest typem złożonym (kolekcją lub rekordem), w jego skład nie mogą wchodzić żadne wymienione wyżej typy.
Firma Oracle zaleca (choć nie wymaga), by funkcje korzystające z pamięci podręcznej unikały modyfikowania zawartości bazy danych lub stanu jakiegokolwiek innego obiektu zewnętrznego -przykładowo, nie należy korzystać w nich z pakietów DBMS_ OUTPUT i UTL_F[LE ani wysyłać z ich wnętrza poczty elektronicznej - polecenia te mogą bowiem nie zostać wykonane (ich wykonanie zależy od dostępności w pamięci podręcznej rezultatów dla określonego zbioru argumentów funkcji).
Pamięć podręczna rezultatów stanowi cenne narzędzie optymalizacji funkcji rekurencyjnych. Oto przykładowa funkcja, której zadaniem jest obliczanie silni:
CREATE OR REPLACE FUNCTION si l nia(n NUMBER) RETURN NUMBER RESU LT_CACHE IS BEGIN
IF n <= 1 THEN RETURN 1;
ELS E RETURN n*si l nia(n-1) :
EN D I F; END:
W przypadku funkcji wchodzących w skład pakietów słowo kluczowe RESULT_CACHE musi znajdować się zarówno w specyfikacji pakietu, jak i. w jego ciele, natomiast klauzula RELIES_ON - wyłacznie w ciele pakietu:
Procedury i funkcje I 137
CREATE OR REPLACE PACKAGE obroty IS FUNCTION srednie_obroty( id_kl ienta IN NUMB ER)
RETURN NUMBER RESULT_CACHE: END obroty:
CREATE OR REPLACE PACKAGE BODY obroty IS FUNCTION srednie_obroty( id_kl ienta IN NUMB ER)
RETURN NUMBER RESULT_CACHE -- wprowadzamy zaleznosc od dwoch tabel RELIES_ON <obroty_dane , okresy_roz11czen1owel IS
BEGIN RETURN i d_kl ienta : - - uproszczony przykl ad
EN D: END obroty:
Zapisane programy PL/SQL-owe a problem uwierzytelniania
Zapisane programy PUSLQ-owe obsługują dwa modele uwierzytelniania. Pierwszym z nich są uprawnienia twórcy: ich zastosowanie oznacza, że program zawsze działa w imieniu swojego twórcy, niezależnie od tego, kto go wywołał. W ramach tego modelu wymagane prawa dostępu muszą zostać bezpośrednio przyznane twórcy programu (nie mogą zostać przezeń odziedziczone z roli) .
Uprawnienia osoby wywołującej powodują uruchomienie programu z uprawnieniami osoby, która zleciła jego wywołanie.
Bloki anonimowe są zawsze wykonywane z uprawnieniami osoby wywołującej . Aby skorzystać z tego modelu uwierzytelniania, należy uzupełnić deklarację programu o klauzu lę AUTHID CURRENT_USER.
138 Oracle PL/SQ:L. Kieszonkowy słownik języka
Wyzwalacze Wyzwalacz to program uruchamiany w odpowiedzi na zmianę określonej struktury danych lub inne zdarzenie związane z bazą danych (ściślej rzecz biorąc - każdemu wyzwalaczowi towarzyszy zestaw zdarzeil, któ.rych wystąpienie pociąga za sobą konieczność
automatycznego uruchomienia danego wyzwalacza).
Wyróżniamy trzy rodzaje zdarzeil:
Zdarzenia DML Polecenia INSERT, UPDATE lub DELETE.
Zdarzenia DDL Polecenia CREATE, ALTER lub DROP.
Zdarzenia bazodanowe Zestaw predefiniowanych zdarzeil związanych z dostępem do bazy.
Szczegółowy spis wszystkich zdarzeń znajduje się w dalszej części działu .
Tworzenie wyzwalaczy
Poniżej przedstawiamy składnię polecenia tworzącego wyzwalacz związany ze zdarzeniem DML:
CREAH m R REP LAC EJ TRIGGE~azwa_wyzwa l acza
CBEFORE I AFH R I INSHAD OF I FORJzda rzen ie ON Cws kaźni k_do_tabe l i_l ub_perspektywy I
N ES H D TAB LE kol umna_tabe 1 i_zagni eźdźonej OF perspektywa ) CREFERENCI NG [OLD ASstara_nazwa J CNEW AS nowa_nazwa J
[ PARENT AS nazwa_rodzi ca ]) C FOR EACH ROW J CFOLLOWS inny_wyzwa l &cz J CO ISABLEJ [COMPOUND TRIGGERJ
Wyzwalacze 139
[ WHEN warunek J pol ecen i a_do_wy konan ia
Utworzenie wyzwalacza dla zdarzenia DDL wymaga posłużenia
się następującą składnią:
CREAH COR REPLACEJ TRI GGERnazwa_wyzwa l acza
CBEFORE I AFTERJzdar zeni e ON COATABASE I nazwa_schematu J
[ FOLLOWS inny_wyzwal &cz J COI SABLEJ [ WHEN warunek J pol ecen i a_do_wykonan ia ;
Poniższa tabela przedstawia możliwe zdarzenia:
Nazwa zdarzenia Opis
INSERT Wprowadzenie wiersza do tabeli lub perspektywy.
UPDATE Modyfikacja tabeli lub perspektywy. Opcjonalna klauzula OF ogranicza zakres zdarzenia do wybranych kolumn.
DELETE Usunięcie wiersza z tabeli lub perspektywy. Nie obejmuje operacji TRUNCATE.
AL TER Zmiana obiektu bazodanowego za pomocą polecenia AL TER. Obiektem jest każdy element wymieniony w perspektywie ALL_OBJECTS (m.in. pakiety oraz tabele). Zdarzenie może obejmować pojedynczy schemat lub całą bazę danych.
ANAL VZE Gromadzenie lub kasowanie statystyk przez bazę danych; względnie walidacja struktury wybranego obiektu.
ASSOCIATE STATISTICS Przypisanie typu statystycznego do obiektu bazodanowego.
AUDIT Uaktywnienie audytu bazy danych.
140 I Oracle PL/SQ:L. Kieszonkowy słownik języka
Nazwa zdarzenia
COMMENT
CREATE
DB ROLE CHANGE - -
DOL
DISASSOCIATE STATISTICS
DROP
GRANT
NOAUDIT
RENAME
REVOKE
TRUNCATE
SERVERERROR
LOGON
LOGO FF
Opis
Przypisanie lub modyfikacja komentarza obiektu bazodanowego.
Utworzenie obiektu bazodanowego (z wyjątkiem operacji CREATE CONTROLFILE).
Modyfikacja roli w konfiguracji Data Guard. Dopuszczalne są wylącmie wyzwalacze AFTER DB ROLE CHANGE. - -Jedno z następujących zdarzeń: AL TER, ANAL VZE, ASSOCIATE STATISTICS, AUDIT, COMMENT, CREATE, DISASSOCIATE, DROP, GRANT, NOAUDIT, RENAME, REVOKE oraz TRUNCATE.
Odłączenie typu statystycmego od obiektu bazodanowego.
Usunięcie obiektu bazodanowego. Obiektem jest każdy element wymieniony w perspektywie ALL OBJECTS. Zdarzenie może obejmować pojedynczy schemat lub całą bazę danych.
Przypisanie praw dostępu do obiektu bazodanowego.
Zaprzestanie audytu bazy danych.
Zmiana nazwy obiektu bazodanowego.
Odebranie praw dostępu do obiektu bazodanowego.
Redukcja rozmiarów tabeli lub klastra za pomocą polecenia TRUNCATE.
Zarejestrowanie komunikatu o błędzie serwera. Dopuszczalne są wylącmie wyzwalacze AFTER SERVERERROR.
Utworzenie nowej sesji bazodanowej. Dopuszczalne są wylącmie wyzwalacze AFTER LOGON.
Zamknięcie sesji bazodanowej. Dopuszczalne są wyłącznie wyzwalacze BEFORE LOGOFF.
Wyzwalacze I 141
Nazwa zdanenia
STARTUP
SHUTDOWN
SUSPEND
Opis
Otwarcie ł>azy danych. Dopuszczalne są wylącmie wyzwalacze AFTER STARTUP.
Zamknięcie ł>azy danych. Dopuszczalne są wyłącznie wyzwalacze BEFORE SHUTDOWN.
Wstrzymanie transakcji na skutek ł>łędu serwera.
Wyzwalacz może zostać uruchomiony przed (BEFORE) lub po (AFfER) wskazanym zdarzeniu. W przypadku operacji DML-owych wyzwalacze AFfER są nieco wydajniejsze niż wyzwalacze BEFORE.
Zdarzeniom INSERT, UPDATE i DELETE może towarzyszyć klauzula REFERENCING, która umożliwia nadawanie nazw pseudorekordom (zawierającym wyjściowe oraz zmodyfikowane wartości kolumn w danym wierszu) na potrzeby poleceń wchodzących w skład wyzwalacza. Pseudorekordy definiuje się
z użyciem klauzuli %ROWTYPE. System Oracle nie dopuszcza operacji na wartościach kolunrn typu LONG oraz LONG RA W wchodzących w skład pseudorekordów. Nazwy pseudorekordów są prefiksowane dwukropkiem i korzystają z notacji kropkowej. W przeciwieństwie do zwykłych rekordów, pola pseudorekordów mogą być odczytywane tylko pojedynczo. Wszystkie „stare" pola w wyzwalaczach INSERT oraz wszystkie „nowe" poła w wyzwalaczach DELETE mają wartość NULL. Poła macierzyste są dostępne tylko w wyzwalaczach przypisanych do tabel zagnież
dżonych .
Klauzula FOR EACH ROW sprawia, że dany wyzwalacz jest wykonywany oddzielnie dla każdego z odczytanych wierszy (domyślnym trybem pracy jest pojedyncze uruchomienie wyzwalacza w odpowiedzi na dane zdarzenie).
142 I Oracle PL/SQ:L. Kieszonkowy słownik języka
W wersjach systemu Oracle Database starszych niż I lg, przypisanie kilku wyzwalaczy do pojedynczego zdarzenia sprawia, że zostaną one wykonane w losowej kolejności. System Oracle Database I l g wprowadza klauzulę FOLLOWS, za pomocą której można porządkować wyzwalacze.
Zastosowanie słowa kluczowego DISABLE (tylko system Oracle Database I l g i nowsze) powoduje utworzenie wyzwalacza nieaktywnego - jego aktywacja wymaga wydania polecenia AL TER TRIGGER ENABLE lub ALTER TABLE ENABLE ALL TRIGGERS (aktywacja wszystkich wyzwalaczy przypisanych do danej tabeli). Wyzwalacze nieaktywne ułatwiają kompilowanie kodu testowego i pozwalają na unik.nięcie błędów ORA-04098 (błędna nazwa wyzwalacza).
Klauzula WHEN określa warunki, które muszą zostać spełnione w celu uruchomienia danego wyzwalacza. Nie można w niej korzystać z zapisanych funkcji oraz metod obiektów.
Ciało wyzwalacza to standardowy blok PU SQL-owy. Oto przykład :
CREATE OR REPLACE TIRIGGER dodaj_czas BEFORE INSERT ON prac REFERENC ING NEW AS nowy_w i ersz FOR EACH ROW FOLLOWS audyt_prac BEGIN
- - automatyczne uzupel ni eni e rekordu o znacznik czasu SELECT CURRENT_TIMESTAMP
INTO :nowy_wiersz .czas_wprowadzenia FROM dua 1 ;
END dodaj_czas;
Wyzwalacze są domyślnie uaktywniane w chwili ich utworzenia. Dezaktywacja wyzwalacza wymaga skorzystania z polecenia ALTER:
Wyzwalacze 143
AL TER TRIGGER nazwa_wyzwa 1 acza C ENABLE I DI SAB LE )
ALTER TABLEnazwa_tabe l i C ENAB LE I DISABLE ) ALL TRIGGERS:
Predykaty w wyzwalaczach
Jeśli chcemy, by pojedynczy wyzwalacz obsługiwał kilka różnych zdarzeń, możemy posłużyć się predykatami INSERTING (wprowadzenie danych), UPDATING (modyfikacja danych) oraz DELETING (kasowanie danych):
CREATE OR REPLACE TIRIGGER prac_log_t AFTER INSERT OR UPDATE OR DELETE ON prac FOR EACH ROW
DECLARE typ_dml CHAR( l ) :
BEGIN IF INSERTING THE N
t yp_dml := 'l' : INSERT INTO prac_l og (prac_nr. kto, operacja)
VALUES ( : new. prac_nr. USER. typ_dml): ELSIF UPDATING THEN
typ_dml := ' U' : INSERT INTO prac_l og (prac_nr. kto, operacja)
VALUES ( : new.prac_nr, USER. typ_dml) : END I F:
END:
Zdarzenia DML Do zdarzeń DML zaliczamy operacje INSERT, UPDATE oraz DELETE (z perspektywami można kojarzyć wyzwalacze INSTEAD OF, uruchamiane zamiast wyrażeń DML-owych). Tego rodzaju wyzwalacze mogą dotyczyć całego wyrażenia lub wybranych wierszy, zaś ich uruchomienie może następować przed lub po
144 I Oracle PL/SQ:L. Kieszonkowy słownik języka
wybranym zdarzeni u. Wyzwalacz BEFORE może modyfikować zawartość odczytan ych wierszy, lecz wiąże się to z dodatkową operacją odczytu . W yzwalacz AFfER nie dokonuje dodatkowego odczytu Gest więc nieco wydajniejszy), lecz nie może modyfikować wartości : new. W celu walidacji danych wprowadzanych do bazy zaleca się stosowanie wyzwalaczy AFfER. Nie wolno tworzyć wyzwalaczy dla obiektów, których właścicielem jest użytkownik SYS. O to kolejność wykonywania rozmaitych typów wyzwalaczy:
1. Wyzwalacz BEFORE dla całego wyrażenia.
2. Wyzwalacz BEFORE dla kolejnych wierszy zwróconych przez wyrazeme.
3. Wyzwalacz BEFORE dla wybranego wiersza.
4. Zdarzenie, z którym związany jest wyzwalacz.
5. Wyzwalacz AfTER dla wybranego wiersza.
6. Wyzwalacz AfTER dla całego wyrażenia.
Wyzwalacze złożone
Wyzwalacze złożone to nowość wprowadzona w systemie Oracle Database 1 lg. Za ich pomocą można łączyć kilka zdarzeń DMLowych (maksymalnie 4) w pojedynczym programie. Wyzwalacze złożone umożliwiają współdzielenie elementów kodu (np. podprogramów oraz danych opisujących stan), co z kolei ułatwia optymalizowanie aplikacji bazodanowych.
Wyzwalacz złożony może składać się z czterech odrębnych klauzul: BEFORE STATEMENT (przed poleceniem), BEFORE EACH ROW (przed każdym wierszem), AFfER EACH ROW (po każdym wierszu) oraz AFfER STATEMENT (po poleceniu).
Wyzwalacze 145
Słowa kluczowe FOR oraz COMPOUND TRJGGER informują bazę danych, że mamy do czynienia z wyzwalaczem złożonym.
Wszystkie struktury danych oraz programy zawarte w sekcji deklaracji są współdzielone przez wymienione wyżej klauzule . Ich inicjalizacja następuje w momencie wywołania wyzwalacza, zaś w chwili jego zamknięcia zostają one automatycznie wyczyszczone.
Poniżej znajduje się przykład wyzwalacza złożonego prowadzącego audyt kolumny pobory w tabeli pracowników. Wykorzystujemy zarówno tradycyjną technikę FOR EACH ROW, jak i nowoczesny mechanizm dowiązań zbiorczych:
- - pi erwszy sposob : wiersz po wi erszu CREATE OR REPLACE TIRIGG ER stary_trg
AFTER UPDATE OF pobory ON pracowni cy FOR EACH ROW
BEGIN INS ERT INTO pracownicy_audyt
VALU ES ( :new . i d_pracowni ka . : ol d. pobory . : new. pobory . SYSTIMESTAMP) ;
END stary_trg;
ponizszy wyzwal a•cz zostaje zadekl arowany jako nieaktywny i musi zostac ua ktywniony przed uzyci em drug i sposob : dowiazania zbiorcze
CREATE OR REPLACE TIRIGG ER nowy_trg FOR UPDATE OF pobory ON pracownicy DI SABLE COMPOUND TRIGGER
-- dekl aracje ogol ne TYPE prac_aud_t IS TABLE OF pracownicy_audyt%ROWTY PE
INDEX BY BINARY_I NTEGER; prac prac_aud_t; kontr PLS_INTEGER :=O; rozmiar_pakietu CONSTANT PLS_INTEGER := 100 ; -- procedura l okal na PROC EDURE wyczysc_dane IS BEGIN
146 Oracle PL/SQ:L. Kieszonkowy słownik języka
FORALL i dx IN 1 . . prac .count INSERT INTO pracowni cy_audyt VALU ES prac (i dx ) ;
prac .de l ete ; kontr : = O;
ENO; kazda z czt erech moz l iwych sekcj i j est def i niowana w nas t epujacy sposob :
AFTER EACH ROW I S BEGIN
kontr : = kont r+l ; prac (kontr ) . i d_pracownika : = :new . i d_pracowni ka ; prac (kontr ) . stare_pobory := :ol d .pobory; prac (kontr ) .nowe_pobory : = :new . pobory; prac (kontr ) .data_modyfi kacj i : = SYSTIMESTAMP; IF kont r >= r ozmi ar_paki etu THE N
wyczysc_dane; ENO I F;
END AFTE R EACH ROW; - - koncowe porzadki w sekcj i AFTER STATEMENT: AFTER STATEMENT IS BEGIN
wyczysc_dane; END AFTE R STATEMENT;
END nowy_trg;
Zdarzenia DDL Zdarzenia DOL to operacje ALTER, ANALYZE, ASSOCIATE STATISTICS, AUDIT, COMMENT, CREATE, DISASSOCIATE, DROP, GRANT, NOAUDIT, RENAME, REVOKE oraz TRUNCATE. Wyzwalacze DOL mogą obejmować pojedynczy schemat lub całą bazę danych.
Wyzwalacze 147
Zdarzenia bazodanowe Do zdarzeń bazodanowych zaliczamy SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN oraz SUSPEND. W przypadku zdarzeń LOGOFF i SHUTDOWN dopuszcza się tylko wyzwalacze BEFORE, zaś w przypadku zdarzeil LOGON, STARTUP i SERVERERROR - tylko wyzwalacze AFTER. Wyzwalacz SHUTDOWN towarzyszy operacjom SHUTDOWN NORMAL oraz SHUTDOWN IMMEDIATE, ale nie SHUTDOWN ABORT.
Pakiety Pakiet stanowi zbiór elementów języka PUSQL. Używanie
pakietów niesie szereg korzyści: umożliwia ukrywanie logiki aplikacji, ułatwia jej projektowanie (metodą top-down), gwarantuje trwałość (persi.wence) obiektów między transakcjami i zwiększa wydajność kodu.
W skład pakietów mogą wchodzić procedury, funkcje, stałe,
zmienne, kursory, deklaracje wyjątków oraz definicje typów (np. tablic asocjacyjnych , rekordów, kursorów itp.)
Struktura pakietu
Każdy pakiet składa się z dwóch części : specyfikacji oraz ciała. Specyfikacja zawiera listę obiektów publicznych udostępnianych przez pakiet (tzn. dostępnych poza jego strukturą) i definiuje jego interfejs programistyczny (API).
Ciało pakietu to kod implementujący procedury, funkcje i kursory wymienione w specyfikacji, a także obiekty prywatne (dostępne wyłącznie wewnątrz pakietu). W skład ciała pakietu może wchodzić opcjonalna sekcja inicjalizacji.
148 I Oracle PL/SQ:L. Kieszonkowy słownik języka
Jeżeli specyfikacja pakietu nie zawiera żadnych procedur ani funkcji i nie trzeba definiować w nim żadnych obiektów prywatnych, wówczas ciało staje się zbędne.
Oto składnia specyfikacji pakietu:
CREAH [OR REPLAC EJ PACKAGE/lazwa_pa ki etu [ AUTHID C CURRENT_USER I DEFINER J J C IS I AS J
[de fi ni ej e typów pub 1 i cznych dek 1 a r acj e pub 1 i cznych zmiennych i obi ekt ów dekl aracj e wyjątków pragllY dekl ar acj e ku rsorów, pr ocedur i funkcji nagłówki procedur i fun kcji J
END [nazwa_paki etu J;
Składnia ciała pakietu jest następująca:
CREAH [OR REPLAC EJ PACKAGE BDDYnazwa_paki et u C IS I AS J [def ini cj e t ypów prywatnych
dekl a r acj e prywatnych zmiennych i obiekt ów • pełne def inicj e ku rso rów • pełne def in icje procedu r i funkcj i J
[BEGI N pol eceni a_wykonywa l ne
[ EXC EPTIDN obs ługa_wyjątków J l
END [nazwa_paki etu J;
Opcjonalna klauzula OR REPLACE powoduje rekonstrukcję
istniejącego pakietu, zachowując dotychczasowe uprawnienia EXECUTE. Ciało pakietu nie może powielać deklaracji, które umieszczono w specyfikacji. Sekcja wykonania oraz sekcja obsługi wyjątków mają charakter opcjonalny. Jeśli pakiet zawiera sekcję wykonania, nosi ona nazwę sekcji inicjalizac)i i jest wyko-
Pakiety I 149
nywana tylko raz - w chwili pierwszego odwołania do jakiegokolwiek obiektu pakietu w ramach danej sesji.
Specyfikacja musi poprzedzać ciało pakietu. Uprawnienie EXECUTE dla danego pakietu (przyznawane wybranemu schematowi lub wszystkim schematom - słowo kluczowe PUBLIC) oznacza prawo dostępu do jego specyfikacji (ciało pakietu pozostaje ukryte).
Oto przykładowy pakiet:
CREATE OR REPLACE PACKAGE kalendarz_pkg IS FUNCTION pobi erz_dat e RETURN DATE: PRAGMA RESTRICT_REFERENCES (pobi erz_date. WNDS):
PROCEDURE ustaw_date(nowa_dat a DATE DEFAU LT SYSDATE):
END kalendarz_pkg:
CREATE OR REPLACE PACKAGE BODY kalendarz_pkg IS data_poczatkowa DATE : = SYSDATE : -- data_pocza t kowa to prywatny obiekt pakietu .
FUNCTION pobi erz_dat e RETURN DATE IS BEGIN
RETURN data_poczatkowa: END pobi erz_date:
PROCEDURE ustaw_date(nowa_dat a DATE DE FAULT SYSDATE ) IS BEGIN
data_poczatkowa : = nowa_dat a: END ustaw_date:
END kalendarz_pkg:
150 Oracle PL/SQ:L. Kieszonkowy słownik języka
Odwołania do elementów pakietów
Aby odwołać się do wybranego elementu pakietu, korzystamy z notacji kropkowej::
nazwa_pakietu.e lement_pakiet u
Przykładowo, w skład wbudowanego pakietu DBMS_OUTPUT wchodzi procedura PUT_LINE, którą wywołujemy w następujący sposób:
OBMS_OUTPUT. PUT_LI NE("Oane do wysw i et l enia ."):
Dane pakietu
Struktury danych zadeklarowane w specyfikacji lub ciele pakietu, lecz poza którąkolwiek z wchodzących w jego skład procedur lub funkcji, nazywamy danymi pakietu. Dane pakietu istnieją przez cały czas trwania sesji i pełnią w programach pakietu funkcję zmiennych globalnych.
Korzystając z danych pakietu, należy mieć na uwadze następujące kwestie:
• Polecenia COMMIT i ROLLBACK nie wpływają na stan danych pakietu.
• Kursor zadeklar,owany w ramach pakietu ma zakres globalny i pozostaje otwarty aż do chwili użycia polecenia CLOSE lub zakończenia sesji.
• Zaleca się „ukrywanie" danych pakietu za specjalnymi programami set i get, służącymi do operowania na ich wartościach.
Pakiety I 151
Pragma SERIALL Y _REUSABLE
Jeżeli chcemy, by dane pakietu istniały tylko na czas odwołania do jego funkcji lub procedur, a nie przez cały czas trwania sesji, możemy skorzystać z pragmy SERJALL Y _REUSABLE. Jej użycie sprawia, że po każdym wywołaniu procedury lub funkcji PL/SQL zamyka wszystkie kursory wchodzące w skład pakietu i zwalnia zajętą przez nie pamięć. Pragma SERIALL Y _ REUSABLE przydaje się w przypadku procedur wykorzystywanych równolegle przez bardzo wielu użytkowników. Przy domyślnych ustawieniach zapotrzebowanie serwera bazodanowego na pamięć operacyjną rośnie liniowo wraz z liczbą użytkowników, natomiast zastosowanie opisywanej techniki sprawia, że owa zależność staje się bliższa logarytmicznej (z uwagi na fakt, iż stan pakietu jest przechowywany we współdzielonym obszarze SGA). Klauzu lę PRAGMA SERJALL Y _REUSABLE należy umieścić zarówno w specyfikacji, jak i w ciele pakietu:
CREATE OR REPLACE PACKAGE moj_pakiet IS PRAGMA SERIA LLY_REUSABLE: PROCEDURA foo;
END moj_pa kiet:
CREATE OR REPLACE PACKAGE BODY moj_pakiet IS PRAGMA SERIA LLY_REUSABLE: PROCEDURE foo IS
END moj_pa kiet:
lnicjalizacja pakietu
Pierwsze odwołanie do któregokolwiek elementu wybranego pakietu powoduje załadowanie całego kodu pakietu do obszaru SGA. Podczas dalszej pracy kod pakietu jest współdzielony przez
152 I Oracle PL/SQ:L. Kieszonkowy słownik języka
wszystkie sesje dysponujące uprawnieniem EXECUTE dla danego pakietu.
Dane pakietu podlegają instancjacji w ramach tzw. globalnego obszaru użytkownika (User Global Area; VGA), który może wchodzić w skład obszaru SGA lub PGA (zależnie od ustawień).
Jeżeli kod pakietu zawiera sekcję inicjalizacji, sekcja ta jest wykonywana bezpośrednio po załadowaniu pakietu do SGA. Sekcja inicjalizacji ma charakter opcjonalny i musi pojawiać się
na koilcu definicji pakietu, pomiędzy słowami kluczowymi BEGIN i EXCEPTION (jeśli pakiet zawiera sekcję obsługi wyjątków) lub między BEGIN i END.
Poniżej znajduje się przykład sekcji inicjalizacyjnej, której celem jest wczytanie mini malnego salda konta do jednej z globalnych zmiennych pakietu (dzięki czemu programy mogą odczytywać saldo bez konieczności każdorazowego wysyłania zapytań do bazy danych):
CREATE OR REPLACE PACKAGE i nfo IS
FUNCTION mi nsaldo RETURN VARCHAR2: END mi nsal do:
CREATE OR REPLACE PACKAGE BODY i nfo IS
g_mi nsal do NUMBER: -- dane pakie t u FUNCTION mi nsaldo RETURN VARCHAR2 IS BEGIN
RETURN g_mi nsal do : END:
BEGIN -- sekcja i ni cjal izacj i SELECT minimal ne_sal do INTO g_mi nsal do FROM konfi guracj a_kl ienta WHERE nazwisko_kl ienta = USER:
Pakiety I 153
EXCEPTION WHEN NO_OATA_FOUNO THEN g_mi nsaldo := NULL:
END i nfo:
Wywoływanie funkcji PL/SQL-owych w wyrażeniach SQL-owych W skJad wyrażeń SQL-owych mogą wchodzić predefiniowane funkcje PUSQL-owe, takie jak DECODE, NYL czy RTRIM. Opisywany mechanizm ułatwia optymalizację kodu i zwiększa jego przejrzystość, ale wiąże się z pewnymi ograniczeniami, o których należy pamiętać.
W przypadku funkcji zawartych w wyrażeniach SQL-owych nie obowiązuje gwarancja spójności odczytów: jeżeli sarno wyrażenie oraz wszystkie zawarte w nim funkcje nie wchodzą w skład wspólnej transakcji wymuszającej spójność odczytów, wówczas (nawet jeśli wspomniane funkcje nie wprowadz<iją żadnych modyfikacji) system Oracle nie gwarantuje, że przy każdym wywołaniu wyrażenia zawarte w nim funkcje będą obserwowały ten sam, spójny stan bazy danych. Uniknięcie opisywanego problemu wymaga posłużenia się poleceniem SET TRANSACTION READ ONL Y lub SET TRANSACTION ISOLATION LEVEL SERIALIZABLE przed uruchomieniem wyrażenia, zaś po jego zakończeniu konieczne jest wydanie polecenia COMMIT (lub ROLLBACK).
Wywoływanie funkcji Składnia wywołania funkcji w ramach wyrażenia SQL-owego nie różni się od analogicznej składni wywołania w kodzie PUSQL-owym:
154 I Oracle PL/SQ:L. Kieszonkowy słownik języka
[nazwa_schematu . ] [nazwa_paki etu . lnazwa_funkcji [@łącze_bazodanowe l [ l ist a_argument ów l
nazwa_schematu to opcjonalna nazwa użytkownika/właściciela
danej funkcji lub pakietu. nazwa_pakietu (również opcjonalna) to ła11cuch tekstowy ic!lentyfiku jący pakiet, w którego skład wchodzi dana funkcja. lącze_bazodanowe określa instancję bazy danych zawierającej wywoEywaną funkcję, natomiast l ista_argwnentów to zbiór danych wejściowych przekazywanych do funkcji .
Poniższy kod przedstawia przykład wywołania funkcji pobi erz_date
wchodzącej w skład opisanego wcześniej pakietu ka 1 endarz_pkg:
-- zapi sujelJIY i nformacje o zdarzeni ach systemowych INSERT INTO v_sys_event (t imestamp. event . qty_waits)
SELECT ka l endarz_pkg.pob i erz_date. event. tota l_wa i ts FROM v$system_event:
zapisuj elJIY statystyki systemowe INSERT INTO v_sys_stat ( t imestamp , statU. va l ue)
SELECT ka l endarz_pkg.pob i erz_date. stati st i cU. va l ue FROM v$sysstat:
Wywoływanie funkcji w ramach wyrażeń SQL-owych podlega następującym ograniczeniom:
• Wszystkie parametry muszą być obsługiwane w trybie IN.
• Typy danych parametrów funkcji oraz typ danych jej rezultatu muszą być zgod~1e z typami bazodanowymi (nie dopuszcza się typów BOOLEAN, rekordów definiowanych przez programistę, tablic asocjacyjnych itp.)
• Wszystkie wersje systemu Oracle obsługują notację pozycyjną, natomiast obsługę notacji opisowej oraz mieszanej wprowadzono dopiero w systemie Oracle Database I lg.
Wywoływanie funkcji PL/SQL-owych w wyrażeniach SQL-owych I 155
• Funkcja musi być zapisana w bazie danych (nie można wczytać jej z programu lub biblioteki lokalnej).
Wywoływanie funkcji pakietowych w SQL-u
W systemach starszych niż Oracle 8i bezpośrednie lub pośrednie wykorzystanie funkcji lub procedury pakietowej w wyrażeniu
SQL-owym wymagało wprowadzenia specjalnej asercji, opisującej jej stopiell czystości. System Oracle 8i (i nowsze) określa
czystość programu w sposób automatyczny. Pragma RESTRICT_ REFERENCES jest wciąż obsługiwana (dla zachowania zgodności wstecznej), ale nie trzeba już z niej korzystać.
Pragma RESTRICT_REFERENCES służy do określenia stopnia czystości programu::
PRAGMA RESTRICT_REFERENCES l(azwa_programu I OEFAU LT, stopi eń_czystości ) ;
Słowo kluczowe DEFAUL T odnosi się do wszystkich metod obiektu lub programów wchodzących w skład pakietu. stopień_czystofri to lista maksymalnie pięci u nazw (rozdzielonych przecinkami), opisujących stopiell uniezależnienia programu od efektów ubocznych przedstawionych w następującej tabeli :
Stopień czystości Opis
WNDS
RNDS
Brak modyfikacji stanu bazy danych (Wńte No Database State)
Brak odczytu stanu bazy dariych (Read No Database State)
Ograniczenie
Program nie zawiera poleceń
INSERT, UPDATE ani DELETE.
Program nie zawiera poleceń
SELECT.
156 I Oracle PL/SQ:L. Kieszonkowy słownik języka
Stopień czystości Opis
WNPS Brak modyfikacji stanu pakletu (Wńte No Package State)
RNPS
TRUST
Brak odczytu stanu pakletu (Read No Package State)
Hierarchia nazw kolumn i funkcji
Ograniczenie
Program nie modyfikuje żadnych zmiennych wchodzących w skład pakietu.
Program nie odczytuje żadnych zmiennych wchodzących w skład pakietu.
Zaniechanie kontroli zadeklarowanych ograniczeń (kompilator może zaufać, że są one spełnione).
Jeżeli w skład wyrażenia SQL-owego wchodzi bezparametrowa funkcja o nazwie [pokrywającej się z nazwą jednej z kolumn, wówczas system przyznaje pierwszellstwo nazwie kolumny. Aby wymusić wywołanie funkcji, należy uzupełnić jej nazwę o nazwę schematu:
CREATE TAB LE prac (nowe_pobory NUMBER . . . ) ; CREATE FUNCTION now,e_pobory RETURN NUMBER IS
SELECT nowe_pobory FROH prac; -- odczytuje wart osc kol umny SELECT j an. nowe_pobory FROM prac; - - wywol uj e f unkcj e
Mechanizmy obiektowe Typ obiektowy (zwany również klasą) to specjalny typ danych, łączący atrybuty (struktury danych) oraz metody (funkcje i procedury). Typy obiektowe umożliwiają programistom wykorzystywanie mechanizmów programowania obiektowego w programach PUSQL-owych oraz w definicjach tabel i kolumn. Aby możliwe
Mechanizmy obiektowe I 157
stało się wykorzystanie danego typu obiektowego w programie PUSQL-owym, należy najpierw zadeklarować go w bazie danych.
Instancję typu obiektowego nazywamy obiektem. Z obiektów można korzystać w sposób analogiczny do wartości skalarnych. Obiekty mogą być trwałe (zapisywane w bazie danych) lub też nietrwałe (zapisywane wyłącznie w zmiennych języka PUSQL). Obiekt może zostać zapisany w bazie danych jako wiersz jednej z tabel lub jako odrębna tabela. Poniższe polecenie tworzy tabelę
złożoną z obiektów wierszowych:
CREATE TABLE nazwa_ta be l 1 OF t yp_obi ektowy
Każdemu obiektowi wierszowemu zapisanemu w bazie danych towarzyszy unikatowy identyfikator OID (ang. Object /Dentifier), wygenerowany przez system zarządzania.
Typy obiektowe
Typ obiektowy dzieli się na specyfikację oraz ciało. Specyfikacja zawiera deklaracje metod i atrybutów wchodzących w skład
obiektu. Oto jej składnia:
CREATE [OR REPLACEJ TY PEnazwa_typu_obi ekt owego [ AUTHI O C CURRENT_USER I DEFINER J J ( ( AS I IS J OBJECT I UNOERnazwa_typu_mac i erzystego J (
)
nazwa_atrybutu typ_danych , . . . , [ [ [NOTJ OVERRIDING J [ [NOTJ FINAL J [ [NOTJ I NSTANTIABLE J specyfi kacj a_met ody , . . . , J [ PRAGMA RESTRICT _REFERENCE!itazwa_programu , czystość ) J
[ [NOTJ FINAL J [ [NOTJ I NSTANTI ABLE J :
158 Oracle PL/SQ:L. Kieszonkowy słownik języka
specyjikacja_metody to jedna z następujących sekwencji:
• MEMBER C PROCEDUR[ FUNCTION lspecyf i kacja_prog ra mu
• STATIC C PROCEDUR[ FUNCTION lspecyf i kacja_prog ra mu
• C OROER I MAP l MEMBER FUNCTION specyfi kacja_f unkcji_po równawczej
• [ FI NAL l [ I NSTANTIABLE l CONSTRUCTOR FUNCTION RETURN I NG SELF AS RES UL Tspecyf i kacja_konst r ukt ora
Specyfikacje atrybutów muszą poprzedzać specyfikacje metod. Specyfikacja atrybu.tu (np. kolumny) składa się z jego nazwy oraz typu danych. Nazwa atrybutu to dowolny poprawny identyfikator, zaś typ danych może być dowolnym typem SQL-owym z wyjątkiem typów LONG , LONG RAW, ROWID oraz UROWID. W deklaracjach atrybutów można korzystać z innych typów obiektowych lub kolekcji, za wyjątkiem typów specjalnych ANYTYPE, ANYDATA oraz ANYDATASET (nie można też stosować typów niezgodnych ze standardem SQL - np. BOOLEAN).
Nagłówki metod należy rozdzielić przecinkami (w przeciwieństwie do specyfikacji pakietów, gdzie korzysta się ze średników). Typ obiektowy może (opcjonanie) zawierać jedną metodę porównawczą (ORDER lub MAP), umożliwiającą porównywanie obiektów. Przeładowywanie metod w typach obiektowych podlega tym samym ogramczemom, co przeładowywanie procedur i funkcji w pakietach.
Zawarte w specyfikacji typu obiektowego specyfikacje metod mogą odwoływać się do klas języka Java zapisanych w bazie danych lub do procedur implementowanych w języku C.
Mechanizmy obiektowe I 159
Składnia ciała typu obiektowego jest następująca :
CREATE [OR REPLACEJ TYPE BOOYnazwa_typu_obiekt owego C I S I AS J (
impl ementacja_met ody ( i mplementacja_metody . . . J
implementacja_metody to jedna z następujących sekwencji:
• MEMBER ( PROCEOURE FUNCTION Jciało_funkcji
• STATIC ( PROCEOURE FUNCTION Jciało_funkcji
• { OROER I MAP ) MEMBER FUN CTIONciało_funkcj i_porównawczej
• ( FI NAL J [ ! NSTANTIABLE ) CONSTRUCTOR FUNCTION RETURNI NG SELF AS RESU LTciało_konstruktora
Implementacje metod mogą być wywołaniami programów w językach Java lub C.
Dziedziczenie typów
PUSQL obsługuje mechanizm dziedziczenia pojedynczego (typ obiektowy może dziedziczyć z pojedynczego typu macierzystego). Baza danych nie zawiera żadnego „typu najwyższego poziomu" - każdy typ jest samodzielny, chyba że w jego specyfikacji zawarto klauzl!llę dziedziczenia.
Słowo kluczowe UNDER oznacza, że definiowany typ powinien dziedziczyć ze wskazanego typu macierzystego. Specyfikacja typu macierzystego musi zawierać klauzulę NOT FINAL (typy obiektowe są domyślnie deklarowane jako FINAL, co wyklucza dziedziczenie).
160 Oracle PL/SQ:L. Kieszonkowy słownik języka
Typ dziedziczący zawiera wszystkie atrybuty i metody swojego typu macierzystego; może też zawierać dodatkowe atrybuty i metody, zadeklarowane w jego specyfikacji. Deklaracje metod typu dziedziczącego nadpisują metody odziedziczone z typu macierzystego. Ws.zelkie modyfikacje typu macierzystego (np. uzupełnienie go o dodatkowe atrybuty i metody) wpływają na strukturę typów potomnych.
Każdy typ obiektowy jest domyślnie oznaczany jako INSTANTIABLE, co umożliwia deklarowanie obiektów tego typu. Uzupełnienie specyfikacji typu o klauzulę NOT INSTANTIABLE spowoduje uznanie go za typ abstrala:yjny (baza danych nie utworzy dlań konstruktora). Typy abstrakcyjne mogą służyć
wyłącznie jako typy macierzyste w hierarchiach dziedziczenia.
Metody
Wyróżniamy cztery rodzaje metod: metody obiektów, metody statyczne, konstruktory oraz metody porównawcze.
Metody obiektów
Metoda obiektu to metoda zadeklarowana z użyciem słowa
kluczowego MEMBER. Tego rodzaju metody można wywoływać
wyłącznie na instancjach typu obiektowego (tzn. na obiektach).
Metody statyczne
Metoda statyczna nie jest związana z obiektem, lecz z typem obiektowym. W jej wnętrzu nie można stosować identyfikatora SELF (odwołującego się do bieżącego obiektu). Deklaracja metody statycznej musi zawierać słowo kluczowe STATIC. Wywoła
nie takiej metody wymaga podania nazwy typu obiektowego (składnia typ.metoda).
Mechanizmy obiektowe I 161
Konstruktory
Każdy nieabstrakcyjny typ obiektowy zawiera metodę zwaną konstruktorem. Metoda ta umożliwia tworzenie nowych obiektów danego typu. Konstruktory mają następujące cechy:
• Ich nazwy pokrywają się z nazwami typów obiektowych.
• Zwracają obiekty deklarowanego typu.
• Przyjmują argumenty wprowadzone z użyciem notacji pozy-. . . . cyJneJ oraz opisowej.
• Jedyną dopuszczalną wartością domyślną dla każdego para-metru konstruktora jest NULL
• Nie mogą być modyfikowane.
Zdefiniowanie włas.nego konstruktora typu obiektowego wymaga posłużenia się składnią CONSTRUCTOR FUNCTION. Nazwa konstruktora musi pokrywać się z nazwą typu. Konstruktory mogą przyjmować dowolne parametry. Klauzula RETURN konstruktora musi mieć postać RETURN SELF AS RES UL T . System Oracle dopuszcza przeładowywanie konstruktorów. Wszystkim niestatycznym metodom konstruktorów towarzyszy domyślny parametr SELF, który określa bieżącą instancję typu obiektowego. Domyślnym trybem obsługi parametru SELF jest IN (w funkcjach) oraz IN OUT (w procedurach). Zmiana trybu obsługi wymaga wyspecyfikowania SELF na liście parametrów konstruktora. Oto przykład konstruktora zdefiniowanego przez programistę:
CREATE OR REPLACE TYPE ks iazka_t AS OBJECT isbn VARCHAR2(13), l iczba_stron INTEGER.
CONSTRUCTOR FUNCT ION ksi azka_t (i d IN INTEGER OE FAU LT NULL. tytu l IN VARCHAR2 OE FAU LT NULL. i sbn IN VARC" AR2 OEFAULT NU LL. l i czba_stron IN INTEGER OEFAULT NULL)
162 Oracle PL/SQ:L. Kieszonkowy słownik języka
RETURN SELF AS RESULT,
OV ERRIOI NG MEMBER FUNCTION ck_cyfry_ok RETURN BOOLEAN ,
OV ERRIOING MEMBER FUNCTION druk RETURN VARCHAR2
) ;
Metody porównawcze
Metody ORDER oraz MAP umożliwiają porównywanie obiektów danego typu za pomocą operatorów w rodzaju< oraz BETWEEN, a także sortowanie obiektów przy użyciu klauzul ORDER BY, GROUP BY, DISTINCT itp. Baza danych automatycznie wywołuje metodę porównawczą, gdy konieczne okazuje się porównanie dwóch obiektów.
Z formalnego punktu widzenia MAP i ORDER to szczególny przypadek metod obiektu (można je wywoływać tylko w kontekście konkretnego ·obiektu). Funkcja ORDER przyjmuje dwa parametry: SELF oraz drugi obiekt tego samego typu. Jej rezultat musi być typu INTEGER, zgodnie z następującą tabelą:
Rezultat
Dowolna wartość ujemna {zazwyczaj -1 )
o Dowolna wartość dodatnia {zazwyczaj 1 )
NULL
Porównanie obiektów
SELF < drugi obiekt
SELF = drugi obiekt
SELF > drugi obiekt
Porównanie niemożliwe; przekazane argumenty mają wartość NULL.
Mechanizmy obiektowe I 163
Załóżmy, że zasiadający w senacie przedstawiciele partii rządzącej mają wyższy status niż przedstawiciele opozycji, zaś w ramach każdej partii kolejność senatorów zależy od ich stażu . Oto przykładowa funkcja ORDER stanowiąca implementację tych reguł:
CREATE TYPE senator_t AS OBJ ECT ( wi ekszosc bool ean_t . staz NUMBER. ORDER MEMBER FU~CTION ranki ng (i nny IN senator_t)
RETURN INTEGER):
CREATE OR REPLACE TYPE BOOY senator_t AS ORDER MEMBER FU~CTION ranki ng (i nny IN senator_t)
RETURN INTEGER IS BEGIN
IF SELF.wiekszosc . prawda() AND i nny.wiekszosc . prawda()
THEN RETURN SIGN(SELF.staz - i nny.staz): ELSIF SELF.wiekszosc . prawda ()
AND i nny.wiekszosc . falsz() TH EN RETU RN 1: ELSIF SELF.wiekszosc . fa l sz()
AND i nny.wiekszosc . prawda() TH EN RETU RN -1: ELSIF SELF.wiekszosc . fa l sz()
AND i nny.wiekszosc . falsz() THEN RETURN SIGN(SELF.staz - i nny .staz): ENO IF:
EN D ranki ng; ENO:
Funkcja MAP nie przyjmuje żadnych parametrów, natomiast zwraca wartość skalarną (np. DATE, NUMBER lub V ARCHAR2), dla której baza danych dysponuje sekwencją porządkującą. Rola funkcji MAP polega na odwzorowaniu każdego obiektu danego typu na wybraną wartość skalarną.
164 Oracle PL/SQ:L. Kieszonkowy słownik języka
Jeżeli w ramach typu obiektowego nie zdefiniujemy żadnej funkcji porównawczej, wówczas możliwe będzie tylko testowanie równości obiektów (w ramach wyrażeń SQL-owych). Dwa obiekty uważa się za równe, jeśli są tego samego typu i mają identyczne wartości wszystkich atrybutów.
Metoda MAP przydaje się do szybkiego sortowania dużych zbiorów obiektów - jej obecność uwalnia system bazodanowy od konieczności porównywania obiektów parami (co ma miejsce w przypadku metody ORDER).
Metody w podtypach
Definiując metody w ramach podtypu, mamy do dyspozycji dwie możliwości: możemy odziedziczyć metodę typu macierzystego lub też dokonać jej przeładowania, definiując metodę o identycznej nazwie i takim samym zestawie parametrów. Dziedziczenie metody typu macierzystego nie wymaga wprowadzania do definicji podtypu żadnych dodatkowych poleceń .
Aby przeładować metodę typu macierzystego, musimy posłużyć
się w nagłówku programu słowem kluczowym OVERRIDING:
CREATE TYPE jedzenie_t AS OBJECT ( nazwa VARCHAR2( 100). grupa_zywieniowa VARCHAR2( 100), MEMBER FUNCTION cena RETURN NUMBER )
NOT FINAL
CREATE TYPE deser_t UNOER jedzenie_t ( zawiera_czekol ade CHAR( l ) . OVERRIOING MEMBER FUNCTION cena RETURN NUMBER )
Mechanizmy obiektowe I 165
Powyższy przykład ukazuje rówmez, że deklaracjom metod podlegającym przeładowaniu musi towarzyszyć klauzula NOT FINAL (domyślną opcją jest FINAL, co wyklucza przeładowywanie metod w podtypach).
Klauzula NOT INSTANTIABLE oznacza, że w ramach danego typu wystarczy zadeklarować jedynie nagłówek metody; nie trzeba natomiast podawać jej szczegółowej definicji:
CREATE TYPE jedzenie_t AS OBJECT ( nazwa VARCHAR2( 100), grupa_zywieniowa VARCHAR2( 100) , NOT INSTANTIABLE HEMBE R FUN CTION cena RETURN NUMB ER )
NOT FINAL NOT INSTANTIABLE
Zastosowanie klauzuli NOT INSTANTIABLE w deklaracji metody niesie następujące konsekwencje:
• Cały typ obiektowy również musi być zadeklarowany jako NOT INST ANT IABLE, co oznacza, że nie można na jego podstawie tworzyć żadnych obiektów (można jedynie poddawać go dziedziczeniu).
• Wszystkie podtypy typu jedzen i e_t muszą zawierać implementację funkcj i cena lub też ponownie deklarować tę funkcję jako NOT INST ANTIABLE.
System Oracle obsługuje tzw. polimorfizm dynamiczny, umożliwiający określenie, którą z wersji przeładowanej metody należy wywołać w razie natrafienia w kodzie na jej identyfikator. Domyślne zachowanie polega na wywołaniu metody zdefiniowanej w najbardziej szczegółowym podtypie obiektowym, natomiast w systemie Oracle Database I l g można wymusić wywołanie me-
166 Oracle PL/SQ:L. Kieszonkowy słownik języka
tody typu macierzystego. Załóżmy, że interesuje nas wywołanie
metody cena zdefiniowanej w ramach podtypu deser _ t :
OECLARE moj_deser deser_t : = deser_t(' l ody' . 'cukier'. ' N') ;
BEGI N OBMS_OUTPUT . PUT_ LI NE( (moj_deser AS jedzen 1e_t ).cena );
END;
W celu wywołania metody typu macierzystego mozna również posłużyć się identyfikatorem SELF:
(SELF AS typ_11acierzysty ) . nazwa_metody
Operacje na obiektach w PL/SQL-u i SQL-u
Zmienne obiektowe mają bezpośrednio po zadeklarowaniu wartość NULL. Poniższe wyrażenie zwróci TRUE:
obiekt I S NULL
Próba bezpośredniego nadania wartości atrybutom obiektu równego NULL spowoduje wystąpienie wyjątku ACCESS_INTO_NULL. Aby możliwe stało się przeprowadzanie operacji na obiekcie, należy go najpierw zainicjalizować. Inicjalizacja obiektu może przebiegać na trzy S[posoby:
• za pośrednictwem konstruktora,
• poprzez przepisanie doń wartości innego obiektu,
• za pomocą klauzuli SELECT INTO lub FETCH INTO.
Poniższy przykład demonstruje zastosowanie wszystkich trzech technik inicjalizacji:
Mechanizmy obiektowe I 167
OECLARE projekt_op i s projekt_t; wi tryna projekt _t ;
-- i nicja l izacja za posredni ctwem konstruktora nowy_kie rownik_proj kierownik_proj_t :=
kierownik_proj _t (' Teresa' . 'Bi uro');
i nicja l izacja za posredn i ctwem konstruktora z wykorzystan iem wartosci domys l nych
nowy_kie rownik_proj kie rownik_proj_t( );
CURSOR szabl on_cur IS SELECT VALUE (proj)
FROM projekty
BEGIN
WHE RE typ_projektu = 'SZABLON' ANO podtyp= 'WITRYNA':
OPEN szabl on_cur; - - i ni cjal izacja za pomoca FETCH INTO FETCH szabl on_c ur
INTO projekt_opi s;
i ni cjal izacja przez przypisanie witryna := pr ojekt_opis ;
Zainicjalizowany obiekt może zostać zapisany w bazie danych, a następnie odczytany z użyciem operatorów REF, V ALUE i DEREF.
Rzutowanie typów obiektowych
System Oracle obstuguje mechanizm rzutowania obiektów na ich typy macierzyste, a także zawężania ich do typów potomnych za pomocą operatora T REAT. Powróćmy na chwi lę do przykładowego typu jedzeni e_t:
168 Oracle PL/SQ:L. Kieszonkowy słownik języka
CREATE TYPE jedzenie_t AS OBJECT ( nazwa VARCHAR2( 100), grupa_zywieniowa VARCHAR2( 100) )
NOT FI NAL
I CREATE TYPE deser_t UNOER jedzenie_t
zawiera_czekol ade CHAR(l) )
DECLARE marcepan deser_t :=
NEW deser _t ( 'marcepan ' . • s l odycze'. •N'); pucha r_lodowy deser_t; smakolyk jedzeni e_t;
BEGIN I* Domniemane rzutowanie na typ macierzysty */ smakolyk :=marcepan;
I* Jawne rzutowani e na typ potomny */ pucha r_lodowy := TREAT<smakolyk AS deser_t);
END;
Oto składnia polecenia TREAT:
TREAT (obi ekt AS CREFJ typ)
obiekt to instancja typu obiektowego, zaś typ to nazwa typu macierzystego (lub potomnego) względem typu, który reprezentuje dany obiekt. Operator TREAT nie umożliwia rzu towania obiektów na typy niepowiązane z ich własnymi typami w hierarchii dziedziczenia. Wybranie typu wchodzącego w skład hierarchii właściwej dla danego obiektu spowoduje zwrócenie żądanego obiektu lub wartości NULL Ueśli rzutowanie okaże się niemożliwe).
Mechanizmy obiektowe 169
Dostęp do metod i atrybutów rzu towanego obiektu mozna uzyskiwać, korzystając z notacji kropkowej:
TREAT (obiekt AS typ) .{ at rybut I met oda (argumenty . .. l )
Operator TREA T oraz operacja domniemanego rzu towania na typ macierzysty są obsługiwane również w wyrażeniach SQL-owych.
Operator REF Operator REF (skrót od „REFerencja") stanowi logiczny wskaź
nik do obiektu, uwzględniający jego identyfikator OID. Wskaź
niki umożliwiają poruszanie się po strukturach powiązanych ze sobą obiektów. Oto składnia operatora REF:
REFCal ias_tabel i
Przykładowo :
SELECT REFCzl FROM zwierzaki z WHERE . . .
Wskaźnik do obiektu danego typu może zostać zapisany w zmiennej języka PUSQL:
OECLARE zwi erzak_ref REF zwierzak_t;
BEGIN SELECT REF(z) INTO zwierzak_ref FROM zwierzaki z WH ERE . . .
Usuwanie rekordów z bazy danych może doprowadzić do sytuacji, w której niektóre wskaźniki stracą ważność. Aby sprawdzić, czy dany wskaźnik jest nieważny, należy posłużyć się predykatem IS DANGLING. Oto przykład :
UPDATE zwierzaki SET wlascicie l ref= NULL WHERE wl ascic i el _ref IS OANGLING;
170 Oracle PL/SQ:L. Kieszonkowy słownik języka
Wbudowany pakiet UTL_REF zawiera szereg programów u ła
twiających operacje na wskaźnikach oraz dostęp do wskazywanych przez nie obiektów.
Operator VALUE
Operator V ALUE zwraca wybrany wiersz jako pojedynczy obiekt (nie jako zestaw kolumn). Oto jego składnia:
VA LUE(a l ias_tabe l i )
Przykładowo :
SELECT VALUE (z) FROH zwierzaki z WHE RE . . .
Operator DEREF Operator DEREF zwraca wartość obiektu wskazywanego przez wskaźnik REF:
OEREF(a l ias_tabe l i )
Oto przykład:
OECLARE osoba_re f RE F osoba_t : autor osoba_t :
BEGIN - - pobi eramy wskaznik SELECT RE F(o) I NTO osoba_re f
FROH osoby W" ERE o .nazwisko= ' Pri byl ' :
odczytujemy zawartosc wskazywanego obi ektu SELECT OEREF(osoba_ref) INTO autor FROM dual:
Wartości OID pełnią funkcję jednoznacznych identyfikatorów obiektów bazodanowych. Podobnie, jak w przypadku identyfika-
Mechanizmy obiektowe I 171
torów wierszy (ROWID), rzadko zdarza się, by zachodziła konieczność ich bezpośredniego wykorzystania w kodzie aplikacji. Poniższa tabela zawiera opisy schematów dostępu do obiektów trwałych :
Schemat Opis Zastosowania
OID Nieopisowy, globalnie jedno- Uchwyt obiektu trwałego, wska-znaczny identyfikator obiektu zywany przez wskaźnik REF. wierszowego zapisanego Brak zastosowań praktycznych. w bazie danych.
VALUE Operator języka SQL, zwraca- Wykorzystywany do wczytywa-jący zawartość wskazywanego nia obiektów z tabel do zmien-obiektu w tabeli obiektów. Nie nych, a także do obróbki obiek-należy myl'ić go ze słowem tów zapisanych w bazie danych. kluczowym VALUES, obecnym w niektórych wyrażeniach INSERT.
REF Wskaźnik obiektu. Może być Umożliwia pseudonormalizację
stosowany w wyrażeniach baz obiektowo-relacyjnych oraz SQL-owych Oako operator) łączenie tabel obiektowych (przy oraz w deklaracjach Oako użyciu notacji kropkowej). modyfikator typu). W PUSQL-u wskaźniki REF
często pełnią rolę parametrów procedur i funkcji.
DEREF Odwrotność wskaźnika (obiekt Używany do odczytywania odpowiadający danemu wskaż- zawartości obiektów wskazy-nikowi). wanych przez wskaźniki REF.
Modyfikowanie typów obiektowych
Obiekty zapisane w bazie danych mogą być rozbudowywane o dodatkowe metody (lecz nie atrybuty). Do modyfikacji typu obiektowego służy polecenie AL TER TYPE, dostępne w trzech postaciach:
172 I Oracle PL/SQ:L. Kieszonkowy słownik języka
AL TER TY PE nazwa_ typu { ADO I MOOI FY I DROP J ATTRIBUTEs pecyfi kacja_at rybut u { INVALIOATE I CASCAOE { [ NOT J INCLUOING TAB LE DATA
CONV ERT TO SUBSTITUTABLE J [ FORCE J J ;
AL TER TY PE nazwa_ typu [ NOT J { INSTANTIABLE I FINAL J { INVALIOATE I CASCAOE
{ [ NOT l INCLU OI NG TABLE DATA CONVERT TO SUBSTITUTABLE J
[ FORCE l J;
AL TER TY PE nazwa_ typu COM PILE [ OEBUG l [ SPECIFICATION I BODY l
[ REUS E SETTl NGS l ;
Modyfikacja typu o biektowego pociąga za sobą istotne konsekwencje dla obiektów zapisanych w bazie - system Oracle wymaga więc oznaczenia wszystkich obiektów zależnych jako błędnych (opcja INVALIDATE) lub kaskadowej propagacji zmian (opcja CASCADE).
Zmieniając typ obiektowy z FINAL na NOT FINAL i wybierając
opcję kaskadowej propagacji zmian, musimy zadecydować, czy istniejące obiekty mogą ulegać podmianie (SUBSTITUTABLE), czy też nie (NOT SUBSTITUTABLE - opcja domyślna). Poniż
szy kod stanowi przykład rozszerzenia typu obiektowego o dodatkowy atrybut:
AL TER TY PE obi ekt_k,ata 1 ogu_t ADO ATTRIBUTE data_wydania VARCHAR2(400 ) CASCAOE INCLUO ING TABLE DATA;
Mechanizmy obiektowe I 173
Typ można również rozszerzyć o dodatkową metodę:
AL TER TYPE obi ekt_k,ata 1 ogu_t ADO MEMBER PROCEOURE zap i sz. CASCAOE:
Po umieszczeniu nagłówka nowej metody w specyfikacji typu obiektowego, moż.emy wprowadzić jej implementację, korzystając w tym celu z polecenia CREATE OR REPLACE TYPE BODY.
Modyfikowanie typów obiektowych podlega licznym ograniczeniom: przykJadowo, typ INSTANTIABLE nie może zostać
zmieniony na NOT INSTANTlABLE, jeśli w bazie danych zadeklarowano wcześniej tabele oparte na tym typie.
Do usunięcia typu o biektowego służy następujące polecenie:
DROP TYPE nazwa_typu [ FORCEJ:
Usunięcie typu obie ktowego wymaga wcześniejszego skasowania opartych na nim tabel (za pomocą DROP TABLE). Opcja FORCE wymusza bezwzględne usunięcie typu, lecz prowadzi do kaskadowego oznaczenia wszystkich zależnych od niego struktur (np. tabel) jako błędnych.
Jeżeli chcemy usunąć podtyp wybranego typu macierzystego, wówczas polecenie
DROP TYPE nazwa_podt ypu VALIDATE:
„.wymusi kontrolę „bezpieczeństwa" operacji DROP przed faktycznym usunięciem typu (podtyp zostanie usunięty tylko, jeśli w kolekcjach typu macierzystego nie znajdują się żadne zależne
od niego obiekty) .
17 4 Oracle PL/SQ:L. Kieszonkowy słownik języka
Kompilacja Najnowsze wersje systemu Oracle Database wprowadziły szereg usprawnień w zakresie kompilacji kodu - należą do nich m.in. kompilacja warunkowa, ostrzeżenia opisowe, mechanizmy optymalizacji oraz możliwość kompilacji kodu natywnego.
Kompilowanie zapisanych programów PL/SQL-owych
Podczas zapisywania programów można posługiwać się następu -. . . . Jącynu opcJam1:
OR REPLACE Rekonstrukcja istniejącego programu przy jednoczesnym zachowaniu jego zestawu uprawnień.
AUTHID Decyduje, czy dany program ma zostać uruchomiony z uprawnieniami jego twórcy (DEFINER), czy też bieżącego użytko
wnika (CURRENT_USER). Domyślną opcją jest DEFINER. Więcej na ten temat mówiliśmy wcześniej w dziale Zapisane programy PUSQL-owe a problem uwierzytelniania.
DETERMINIST/C Opcja wymagana dla indeksów opartych na rezultatach funkcji. Funkcja jest uznawana za deterministyczną, jeśli dla danego zbioru argumentów zawsze zwraca tę samą wartość.
Funkcje deterministyczne nie mogą zależeć od zawartości bazy danych. Przykładem funkcji deterministycznej jest wbudowana funkcja INITCAP. Kontrprzykład to funkcja SYSDATE.
PARALLEL_ENABLED [(PARTIT/ON parametr_in BY { ANY HASH I RANGE}) j
Informuje kompilator, że dana funkcja może zostać zrównoleglona. Klauzula PARTITION BY dotyczy wyłącznie funkcji
Kompilacja I 175
zawierających parametry wejściowe typu REF CURSOR i decyduje o sposobie partycjonowania (podziału zbioru danych wejściowych na podzbiory).
PIPELINED Opcja PIPELINED informuje kompilator, że mamy do czynienia z funkcją potokową, której rezultaty są zwracane w sposób interaktywny za pośrednictwem polecenia PIPE ROW. Funkcje potokowe mogą zwracać rezultaty w trakcie pracy (tj. przed zakończeniem działania).
AGGREGATE US/NG Opcja wymagana w funkcjach agregujących - in.formuje bazę,
że funkcja ma za zadanie odczytać pewną liczbę wierszy i zwrócić pojedynczą wartość. Przykładem funkcji agregującej jest wbudowana funkcja A VG.
Poniższe opcje kompilatora są ustalane podczas tworzenia programu (na podstawie konfiguracji sesji lub serwera bazy danych), zaś ich zmiana wymaga rekompilacji kodu. Baza danych przechowuje ustawienia kompilatora dla każdego z zarejestrowanych programów - podczas rekompilacji można więc posługiwać się opcją REUSE SETIINGS, powodującą ponowne zastosowanie bieżących ustawień . W braku klauzuli REUSE SEITINGS (a także w przypadku jawnego wykorzystania jednej z poniższych opcji) kompilator przyjmuje za obowiązujące ustawienia bieżącej sesji.
PLSQL_CCFLAGS Lista rozdzielonych przecinkami par nazwa-wartość, zawierająca parametry kompilacji warunkowej. Więcej na ten temat w dalszej części działu .
PLSQL_CODE_TYPE Wybór trybu kompilacji (kompilator może generować kod interpretowany oraz natywny - odpowiednio INTERPRETED
176 Oracle PL/SQ:L. Kieszonkowy słownik języka
i NATIVE). Więcej na ten temat powiemy w dziale Natywna kompilacja lwdu PUSQL-owego.
PLSQL_DEBUG Włączanie lub wyłączanie mechanizmu instrumentacji kodu na potrzeby śledzenia jego działania oraz usuwania błędów. Dopuszczalne wartości to TRUE oraz FALSE. Uaktywnienie kompilacji wymusza zastosowanie trybu INTERPRETED (patrz wyżej) .
PLSQL_OPTIMIZE_LEVEL Wybór poziomu optymalizacji kompilatorowej. Dopuszczalne wartości to O, I , 2, 3. Więcej o optymalizacji powiemy w dziale Kompilator optymalizujący.
PLSQL_ WARNINGS Wybór poziomu ostrzeżeń generowanych przez kompilator. Więcej na ten temat w dziale Ostrzeżenia kompilatorowe.
NLS_LENGTH_SEMANTICS Wybór semantyki typów VARCHAR2 i CHAR (odpowiednio - BYTE i CHAR). Domyślną wartością jest BYTE. Typy NY ARCHAR2, NCHAR, CLOB oraz NCLOB zawsze wykorzystują semantykę CHAR.
Aby dokonać rekompilacji procedury moj a_procedura z uzyc1em trzeciego poziomu optymalizacji, wpiszemy:
AL TER PROC EDU RE moj.a_procedura COHPI LE PLSOL_OPTIMIZE_LEVEL = 3;
Po wydaniu powyższego polecenia kolejna rekompilacja procedury (przy zachowaniu bieżących ustawień) wymaga wydania następującego polecenia:
ALTER PROCEOURE moj.a_procedura COHPI LE REUSE SETTINGS;
Kompilacja I 177
Zapisane parametry kompilacji są widoczne w perspektywie USER_PLSQL_OBJECT_SEITINGS.
Kompilacja warunkowa Mechanizm kompilacji warunkowej został wprowadzony w systemie Oracle Database I Og (aktualizacja I O. 1.0.4). Kompilacja warunkowa umożliwia wybór kompilowanych bloków kodu w zależności od wersji systemu bazodanowego, stanu środowiska
oraz innych parametrów konfiguracyjnych. Semantyka kompilacji warunkowej wyróżnia trzy rodzaje dyrektyw:
Dyrektywy wyboru Dyrektywa $1F oszacowuje podane wyrażenie i wybiera kod na podstawie jego rezultatów:
CREATE OR REPLAC E PROCEDURE nowy_pracownik IS BEGIN $IF DBMS_DB_V ERSION. VER_LE_10_2 $THEN
- - kod kompat ybi l ny ze stara wersja systemu SELECT pracowni cy_seq . NEXTVAL
!NTO prac_rek .nr_prac FROM dua l ; $ELSIF DBMS_DB_VERSION. VER_LE_l l $THEN
- - kod Orac l e Database l l g prac_rek.nr_prac : = pracownicy_seq . NEXTVAL;
$ELSE - - kod dl a nowszych we rsji systemu prac_rek.nr_prac := pracownicy_seq . NEXTVAL;
$END INSERT INTO prac VALUES (prac_rek) ;
EN D;
Dyrektywy konfiguracyjne Dyrektywa $$identyfikator umożliwia uzależnienie procesu kompilacji od wartości jednego z parametrów przekazanych w opcji PLSQL_CCFLAGS. Dyrektywy konfiguracyjne mogą
178 Oracle PL/SQ:L. Kieszonkowy słownik języka
(choć nie muszą) wchodzić w skład dyrektyw wyboru. Oto przykład :
ALTER SESS ION SET PLSQL_CCFLAGS = ' pl_debi g: fa l se , pl_trace_l evel :2 ' ;
CREATE OR REPLAC E PROCEDURE odczytaj_dane_kl i en t a IS BEGIN $IF $$pl_debug OR $$pl_trace_l evel >= 2 $THEN
DBMS_SUPPORT. START_TRAC E(wa i t s=>TRUE. bi nds=>TRUE) ; $ELSIF $$ pl_trace_level >= 1 $THEN
DBMS_SUPPORT. START_TRAC E(wa i t s=>TRUE. bi nds=>FALSE) ; $END
NULL; -- t u dalszy kod END odczytaj_dane_kl i enta ;
Dyrektywy błędów
Dyrektywa $ERROR pozwala na wygenerowanie błędu kompilacji w przypadku niespełnienia wybranych warunków. Oto przykład :
CREATE OR REPLAC E PROCEDURE dluga_kompi lacja IS BEGIN $IF $$pl sql_opt i mize_l evel <> 1 $THEN
$ERROR ' Wymagany pozi om optyma l izacj i 1' $end $END
NULL; END dl uga_kompi l acja;
W opisanych dyrektywach można stosować następujące opcje:
Konfiguracja kompi'latora PLSQL_CCFLAGS, PLSQL_DEBUG, PLSQL_ W ARNINGS, PLSQL_OPTIM IZE_LEVEL, PLSQL_CODE_TYPE oraz NLS_LENGTH_SEMANTICS.
Kompilacja I 179
PLSQL_LINE (literał PLS_INTEGER) Bieżący numer wiersza w programie (wartość tę można też
zdefiniować z wykorzystaniem opcji PLSQL_CCFLAGS).
PLSQL_ UNIT (liter:ał VARCHAR2) Nazwa kompilowanego programu . W przypadku bloków anonimowych ma wartość NULL. Wartość tę można też jawnie zdefiniować z wykorzystaniem opcji PLSQL_CCFLAGS.
Wyrażenia statyczne w specyfikacji pakietu Wyrażenia te nie mogą ulec zmianie podczas rekompilacji pakietu.
Kompilator PU SQL-a wczytuje i interpretuje powyższe dyrektywy podczas generowania kodu. Aby poznać ostateczną zawartość skompilowane.go programu, można posłużyć się pakietem DBMS_PREPROCESSOR:
-- Tworzymy program kompi l owany wa runkowo CREAT OR REPLACE PROCEOURE moj_program IS BEGIN
OBMS_OUTPUT. PUT_ LINEC'Wersja systemu : I I OBMS_OB_VE RSION.VERSION I l 'r' I I OBMS_OB_VERSION. RELEAS EJ:
SI F OBMS_OB_VERSION. VER_LE_10_2 STHE N OBMS_OUTPUT. PUT_ LINEC'Kod dla we rsji 10r2');
$ELSI F OBMS_OB_VERSION. VER_LE_l l $THEN OBMS_OUTPUT. PUT_ LINEC'Kod dla we rsji 11') :
SELSE OBMS_OUTPUT. PUT_ LINEC'Kod dla we rsji nowszych. niz 11') :
SENO ENO:
-- Wyswi et l amy skompi lowany kod BEGIN
OBMS_PREPROC ESSOR .PRINT_POST_PROCESSEO_SOURCE
180 Oracle PL/SQ:L. Kieszonkowy słownik języka
C'PROCEOURE' , USER. 'MOJ_PROGRAM'); ENO;
Oto rezultat:
PROC EOURE moj_program IS BEGIN
OBMS_OUTPUT.PUT_ LINEC'Wersja systemu : I I OBMS_OB_VE RSION.VERSION I l 'r' I I OBMS_OB_VERSION .VERSION);
OBMS_OUTPUT.PUT_ LINEC'Kod dla wersji 10r2') ; ENO ;
Ostrzeżenia kompilatorowe
Mechanizm ostrzeżeń umożliwia optymalizację i zabezpieczanie kodu przed niepożądanym działaniem. Ostrzeżenia informują
programistę o problemach, które nie są na tyle poważne, by skutkowały wystąpieniem błędu, lecz które mogą świadczyć o niewłaściwej strukturze lub braku efektywności kodu. Za pomocą konfiguracji kompilatora możemy wymusić traktowanie wybranych ostrzeżeń jako błędów. Ostrzeżenia nie uniemożliwiają
kompilacji program u, natomiast błędy powodują oznaczenie wygenerowanego kodu jako INY ALID (błędny).
Uaktywnienie ostrzeżeń wymaga zmiany parametru inicjalizacyjnego PLSQL_ W ARNINGS. Można to zrobić globalnie, modyfikując plik SP FILE, lub na czas trwania bieżącej sesji (za pomocą polecenia AL TER_SESSION); można też posłużyć się wbudowanym pakietem DBMS_ WARNING.
Parametr PLSQL_ W ARNINGS zawiera listę wartości (rozdzielonych przecinkami), z których każda ma następującą składnię:
[ENAB LE I OISABLE I ERRORJ : [ALL I SEVERE I INFORMATIONAL I PERFORMANCE I numer_ostrzeżeni a l
Kompilacja I 181
Przykładowo, aby uaktywnić wszystkie ostrzeżenia w ramach bieżącej sesj i, wpiszemy:
ALTE R SESSION SET pl sql_warni ngs = 'enab l e:al l '
Jeśli dysponujemy systemem Oracle Database I l g i chcemy oznaczyć ostrzeżenie numer 06009 („Obsługa OTHERS nie kończy się poleceniem RAISE ani RAłSE_APPLłCATION_ERROR") jako błąd, a przy okazji uaktywnić wszystkie ostrzeżenia wydajnościo
we (kategoria PERFORMANCE) z wyjątkiem ostrzeżenia numer 07203 („Parametr może skorzystać ze wskazówki NOCOPY"), wpiszemy:
ALTE R SESSION SET pl sql_warni ngs = 'erro r :06009' , 'enable :performa nce' , ' disab l e:07203';
Poniższe polecenie wyświetla bieżącą konfigurację ostrzeżeń:
OBMS_OUTPUT. PUT_LINE( OBMS_WARNING.get_warning_setti ng_stri ng());
Czas na garść przykładów:
SQL>ALTER SESSION S!ET plsql_warn1ngs = 'ENABLE:ALL', ' ERROR:6009':
Session altered.
SQL>CREATE OR REP LACE PROCEDURE zla_praktyka IS 2 l ancuch_testowy VARCHAR2(32); 3 BEGIN 4 l ancuch_testowy : = ' Demonstracja'; 5 EXC EPTION 6 WH EN OTHERS THEN NULL; 7 END; 8 I Warning : Procedure •created with compilation errors .
182 Oracle PL/SQ:L Kieszonkowy słownik języka
SQL>SHOll ERRORS Errors for PROCEDURE ZLA_PRAKTYKA :
LI NE /COL ERROR
6/8 PLS-06009 : pr ocedure "ZLA_PRAKTYKA" OTHERS handl er does not end i n RAISE or RAISE_AP PLICATION_ERROR
SQL>ALTER SESSION S!ET pl sql_warn1ngs = ' enable:all '; Session alte red.
SQL>CREATE OR RE PLACE PACKAGE stworz_pol1tyke IS 2 PROCEOURE przetwarzaj_strone_dekl (s trona_dekl IN OUT CLOB) ; 3 END stworz_pol ityke ; 4 I SP2 -0808 : Package created with compi l at i on warn i ngs
SQL>SHOll ERRORS Er ro rs for PACKAGE STWORZ_POLITYKE:
LI NE /COL ERROR
2132 PLW-07203: parameter 'STRONA_DEKL' may benefi t f rom use of t he NOCOPY compi l er hi nt
SQL>CREATE OR RE PLACE PACKAGE BODY stworz_pol1tyke IS 2 PROCEOURE przetwarzaj_strone_dekl ( 3 strona_dekl IN OUT NOCOPY CLOB) IS 4 BEGIN 5 dekl_domys 1 na ( strona_dekl) ; 6 END przetwarzaj_strone_dekl ; 7 END stworz_pol ityke; 8 I SP2 -0810: Package Body created with compi l ati on warnings
SQL>SHOll ERRORS ERRO RS for PACKAGE BODY STWORZ_POLITYKE :
Kompilacja 183
LI NE /COL ERROR
3/6 PLW-05000 : mismatch i n NOCOPY qua l i fi ca t ion between speci fi ca t ion and body
SQL>CREATE OR REPLACE PROCEDURE martwy_kod IS 2 x NUM BER := 10: 3 BEGIN 4 IF x = 10 THEN 5 X : = 20: 6 ELSE 7 X : = 100 : - - martwy kod 8 ENO I F: 9 ENO martwy_kod: 10 I SP2-0804: Procedure created with compi l at i on wa rni ngs
SQL>SHOll ERRORS Errors f or PROCEOURE HARTWY_KOO
LI NE /COL ERROR
717 PLW-06002 : Unreachabl e code
Kompilator optymalizujący
Kompilator optymalizujący PU SQL-a jest w stanie znacząco przyspieszyć działanie aplikacji kosztem nieznacznego wydłuże
nia czasu kompilacji. Z optymalizacji może korzystać zarówno kod interpretowany, jak i kompilowany.
Optymalizacja kompilatorowa jest domyślnie uaktywniona; możemy jednak kontrolować jej zachowanie poprzez obniżenie poziomu optymalizacji lub też całkowite zrezygnowanie z prób optymalizowania kodu. Przykładowo, jeśli nasz system często
184 Oracle PL/SQ:L. Kieszonkowy słownik języka
musi rekompilować duże programy lub jeśli w skład naszej aplikacji wchodzi bardzo wiele poleceń dynamicznego SQL-a, narzut czasowy związany z optymalizacją kodu może stać się zbyt wielki (pamiętajmy jednak, że testy prowadzone przez firmę Oracle świadczą, iż optymalizacja kompilatorowa jest w stanie nawet dwukrotnie przyspieszyć działanie złożonych aplikacji PUSQL-owych).
W niektórych przypadkach optymalizator może zaburzyć działa
nie programu. Jedną z takich sytuacji jest kompi lacja kodu zależ
nego od kolejności wykonania sekcji inicjalizacyjnych w ki lku różnych pakietach. Jeżeli w toku testów stwierdzimy występowa
nie takich problemów, a mimo to chcielibyśmy skorzystać z możliwości optymalizacji kompi latorowej, musimy zmodyfikować szwankujący kod lub też napisać specjalną procedurę inicjalizacyjną, wymuszającą odpowiednią kolejność inicjalizacji pakietów.
System Oracle Database 1 lg wprowadza nowy mechanizm noszący nazwę inlining - polega on na zastąpieniu wywoła1]
podprogramów wiernymi kopiami ich kodu (przez co dany podprogram nie musi być wczytywany w chwili uruchomienia aplikacji). Z metody tej najlepiej korzystać w aplikacjach posiłkujących się dużą liczbą prostych programów pomocniczych.
Zmiana konfiguracji optymalizatora wymaga skorzystania z opcji PLSQL_OPTIMIZE_LEVEL. Opcja ta jest dostępna na poziomie globalnym (w poleceniu ALTER SYSTEM) oraz w ramach wybranej sesji (polecenie ALTER SESSION). Poniżej przedstawiono jej dopuszczalne wartości:
O Brak optymalizacji
I Optymalizacja podstawowa (ro.in. eliminowanie nieosiągalnego kodu lub wyjątków, które nigdy nie mogą wystąpić).
Kompilacja 185
2 Domyślny poziom optymalizacji. Optymalizacja agresywna, dopuszczająca możliwość rekonstrukcji kodu źród łowego.
3 Poziom wprowadzony w systemie Oracle Database l l g rozszerzenie poziomu 2 o mechanizm inlining.
Aby wyłączyć optymalizację kodu w bieżącej sesji, wpiszemy:
ALTER SESSION SET PLSQL_OPT!MIZ E_LEVEL = O;
Poziom 2 umożliwia selektywne zastosowanie mechanizmu inli11i11g za pomocą pragmy INLINE (więcej na ten temat w dziale Pragmy):
PRAGMA INLINE flazwa_p rog ramu . 'YES I NO' );
Opcja YES nakazuje kompilatorowi zastosowanie mechanizmu inli11i11g w odniesieni u do programu nazwa_programu, zaś opcja NO zabrania optymalizowania wywołań tego programu. W poniższym przykładzie dokonujemy optymalizacji wywołań procedury P:
CREATE OR RE PLACE PACKAGE BOOY narzedzia IS FU NCTION srednie_obroty( id_kl ienta IN NUMB ER)
RETURN NUM BER IS BEGIN
PRAGMA INLINE (P, 'YES'); -- optymal i zacja wywol an P p('Symul acja wewnetrzna'); RETURN id_kl ienta; - - tyl ko na potrzeby symul acji
ENO; ENO narzedzi a;
Natywna kompilacja kodu PL/SQL-owego
Poczynając od wersji Oracle 9i, możliwa stała się optymalizacja programów PU SQIL-owych za pomocą ich natywnej kompilacji.
186 Oracle PL/SQ:L. Kieszonkowy słownik języka
Natywna kompilacja polega na przetłumaczeniu kodu na język C, a następnie skompilowaniu go do biblioteki (w systemie Windows jest to biblioteka DLL). W wersjach starszych niż Oracle Database 1 lg, przeprowadzenie natywnej kompilacji kodu wymagało
zainstalowania na s·erwerze bazodanowym kompilatora języka C. Kompilacja natywna przynosi największe korzyści w przypadku programów realizujących skomplikowane obliczenia; najmniejsze zaś - w programach złożonych z samych deklaracji (np. typów i pakietów). Uaktywnienie opcji śledzenia błędów (debugging) uniemożliwia przeprowadzenie kompilacji natywnej .
Na niektórych platformach sprzętowych pierwsze uruchomienie programu skompilowanego natywnie powoduje skopiowanie go do katalogu PLSQL_NATIVE_LfB RARY_DfR (operacja ta nie zawsze jest wymagana - zależy to od konfiguracji platformy).
System Oracle 9i Database
Procedura kompilacji natywnej w systemie Oracle 9i Database składa się z następujących kroków:
1. Przygotowanie pliku spnc_makefile.mk w katalogu $0RACLE_HOME/plsql.
2. Nadanie parametrowi inicjalizacyjnemu PLSQL_COMPILER_ FLAGS wartości 'NATIVE' (można to zrobić z użyciem polecenia AL T ER SESSION).
3. Opcjonalny wybór wartości parametrów PLSQL_NATIYE_C_COMPlLER, PLSQL_NATIYE_LINKER, PLSQL_NATIYE_LIBRARY _DIR, PLSQL_NATlYE_MAKE_ UTlLITY oraz PLSQL_NATIYE_MAKE_FILE_NAME. Administrator bazy danych może skonfigurować te parametry, korzystając z polecenia ALTER SYSTEM.
Kompilacja I 187
4. Jeżeli w systemie zapisano więcej niż 15 O<Xl obiektów, umieszczenie ich w pojedynczym katalogu będzie wiązało się
ze znacznym spowolnieniem kompilacji - w takim wypadku można wykorzystać parametr PLSQL_NATIVE_DIR_SUBDIR_ COUNT celem podziału zbioru obiektów na podkatalogi dO, dl' d2 itp.
5. Utworzenie lub modyfikacja programów.
6. Weryfikacja procesu kompilacji poprzez sprawdzenie zawartości perspektywy USER_STORED_SETTINGS, a także poprzez odszukanie nowo utworzonej biblioteki w systemie plików serwera.
System Oracle Datab ase 1 Og
System Oracle Database I Og znacząco upraszcza proces kompilacji natywnej: zamiast w zewnętrznych bibliotekach, skompilowane programy są umieszczane w tabelach bazodanowych. Zbiór obsługiwanych kompilatorów C u legł ograniczeniu i zależy teraz od wykorzystywanej platformy. Procedura kompilacji natywnej składa się z następujących kroków:
I. Kontrola zawartości pliku $0RACLE_HOME/plsqllspnc_ commands (w szczególności - wybór ścieżki do obsługiwanego kompilatora C).
2. Nadanie odpowiedniej wartości parametrowi PLSQL_NATIVE_ LIBRARY_DIR Uak w poprzednim przykładzie) . Katalog ten będzie wykorzystywany jako podręczny magazyn współdzielonych bibliotek. Zgodnie ze standardem OFA, powinien on mieścić się wewnątrz jednego z katalogów z plikami danych. Z przyczyn bezpieczeństwa prawem zapisu w tym katalogu (oraz we wszyst!kich podkatalogach wymienionych w PLSQL_ NATIVE_DIR_SUBDIR) powinien dysponować jedynie użyt
kownik ORACLE.
188 I Oracle PL/SQ:L. Kieszonkowy słownik języka
3. Jeżeli w systemie zapisano więcej niż 15 O<Xl obiektów, umieszczenie ich w pojedynczym katalogu będzie wiązało się
ze znacznym spowolnieniem kompilacji - w takim wypadku można wykorzystać parametr PLSQL_NATIVE_DIR_SUBDIR_ COUNT celem podziału zbioru obiektów na podkatalogi dO, dl' d2 itp.
4. Nadanie parametrowi PLSQL_CODE_TYPE wartości
'NATIVE' - zmianę tę można wprowadzić globalnie lub w ramach wybranej sesji, za pomocą następującego polecenia:
ALTER SESSION SET PLSQL_COOE_TYPE =' NATIVE' :
5. Utworzenie lub modyfikacja programów.
System Oracle Database 11g
System Oracle Database I lg nie wymaga już instalowania zewnętrznego kompi latora C ani korzystania z pliku .\pnc_commands . W celu przeprowadzenia kompilacji natywnej należy postępować
zgodnie z poniższą procedurą:
I. Na niektórych platformach konieczne jest ustawienie parametru PLSQL_NAT IVE_LIBRARY _DIR (systemy LiJJux i Windows nie korzystają z tego katalogu).
2. Nadanie parametrowi PLSQL_CODE_TYPE wartości
'NATIVE' - zmianę tę można wprowadzić globalnie lub w ramach wybranej sesji, za pomocą następującego polecenia:
ALTER SESSION SET PLSQL_COOE_TYPE =' NATIVE' :
3. Utworzenie lub modyfikacja programów.
Kompilacja I 189
Integracja z językiem Java Programiści korzystający z języka Java mogą korzystać z kodu napisanego w PUSQL-u lub SQL-u za pomocą bibliotek JDBC lub SQLJ. Aby wywołać metody klas Javy z poziomu kodu PL/SQL-owego, należy przygotować dla nich odpowiednią
specyfikację wywołania, korzystając z poleceń języka DDL.
Korzystanie z klas Javy po stronie serwera może przyspieszyć skomplikowane obliczenia, lecz utrudnia dostęp do danych. PUSQL jest szybszy od Javy, jeśli chodzi o komunikację z bazą, gdyż nie wymaga konwersji typów danych. Ogólna zasada brzmi: wykorzystujmy PUSQL w aplikacjach, które prowadzą intensywną komunikację z bazą danych, oraz Javę w aplikacjach wymagających dużej mocy obliczeniowej. Aby zarejestrować w systemie bazodanowym procedurę napisaną w języku Java (tzw. JSP - ang. Java Stored P'rocedure), należy wykonać następujące kroki:
1. Napisanie (lub pobranie) programu w języku Java. Koci źródłowy nie jest wymagany - można więc posługiwać się cudzymi programami, o ile spełniają one dwa warunki: metody dostępne z poziomu kodu PUSQL i SQL muszą zostać zadeklarowane z użyciem słowa kluczowego st ati c (PL/SQL nie dysponuje mechanizmem instancjacji dynamicznych klas Javy), a ponadto wykorzystywane klasy nie mogą odwoływać się do elementów interfejsu użytkownika (np. do klas A WT).
Jeśli zdecydujemy się na napisanie własnej procedury JSP i jeśli nasza procedura musi uzyskać dostęp do bazy danych celem odczytania zawartości tabel lub wywołania innych procedur, wówczas naj lepiej posłużyć się interfejsami JDBC i SQU . Szczegółowy opis tych interfejsów wykracza poza tematykę niniejszej książki - zainteresowanych odsyłamy do dokumentacji bibliotek odpowiadających wykorzystywanej platformie sprzętowej.
190 I Oracle PL/SQ:L. Kieszonkowy słownik języka
2. Gdy już dysp01rnjemy klasą języka Java (w postaci kodu źródłowego lub pliku .class), należy umieścić ją w bazie danych. Służy do tego narzędzie loadjava, wbudowane w system Oracle i opisane w podręczniku użytkownika systemu.
3. Należy teraz stworzyć specyfikację wywołania dla nowej metody Java, umieszczając w poleceniu CREATE klauzu lę AS LANGU AGE JA V A (więcej na ten t.emat w dalszej części rozdzi ału). Metodę można - w zależności od potrzeb - opakować w funkcję lub procedurę języka PUSQL.
4. Należy wyspecyfikować prawa dostępu do nowo utworzonego programu, korzystając przy tym z polecenia GRANT EXECUTE. Po wykonaniu tej operacji możemy korzystać z kodu JSP tak, jak gdyby był on zwykłym modułem języka PUSQL.
Przykład
Spróbujmy napisać prostą metodę przyjmującą pojedynczy argument:
package oreilly .pl s·qu i ck.demos:
publ ic cl ass He l l o { pub l i c sta t ic Stri ng powiedz (Str i ng kto ) (
return nHel l o . n + kto+ ff!";
)
)
Powyższy koci , zapisany w pliku Hello.java, może zostać wczytany bezpośrednio do bazy danych, co wiąże się z jego automatyczną kompi lacją. Aby umieścić naszą klasę w bazie, wpiszemy:
l oadjava -user scott/tiger -oci 8 ore i l ly/pl squick/demos/Hel l o .java
Integracja z językiem Java 191
Korzystamy tu z konwencji programistycznych typowych dla języka Java - nasz przykładowy plik umieści liśmy w katalogu odpowiednim dla jego macierzystego pakietu.
Po uruchomieniu interpretera PUSQL-a oraz zalogowaniu się
jako SCOTiffIGE!R możemy stworzyć specyfikację wywołania
naszej metody:
CREAH FUNCTION wit.aj (kto IN VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'orei l ly .pl squi ck .demos.Hel l o. powi edz
(java.lang.St r i ng) return java . l ang .Stri ng:
Aby przetestować dlziałanie funkcji, wystarczy wpisać:
BEG IN OBMS_OUTPUT. PUT_ LINE(wi taj( 'wor l d')):
ENO:
Powyższy kod spowoduje wyświetlenie następującego napisu :
Hello , wor ld!
Publikowanie kodu w języku Java
Specyfikacji wywołania metody zaimplementowanej w języku Java musi towarzyszyć klauzula AS LANGUAGE JA V A:
( IS I AS J LANGUAGE JAVA NAME 'pe łna_nazwa_metody ( (pełna_nazwa_typu . . . . ) l
[ RETURN pełna_nazwa_typu ) •
pelna_nazwa_metody to nazwa wywoływanej metody uzupeł
niona o pełną specyfikację jej klasy (razem z nazwą pakietu), wyrażoną z użyciem notacji kropkowej (uwaga - w tym przy-
192 Oracle PL/SQ:L. Kieszonkowy słownik języka
padku obowiązuje rozrozmenie na duże i małe litery). pełna_nazwa_typu to nazwa typu danych języka Java, uzupełniona o nazwę pakietu, w skład którego wchodzi ów typ.
Odwzorowaniem typów języka Java na typy PUSQL-owe rządzi standard JDBC, uwzględniający typy charakterystyczne dla systemu Oracle. Większość konwersji typów ma zdroworozsąd
kowy charakter, lecz przekazywanie do zewnętrznych bibliotek obiektów typu zdefiniowanego przez użytkownika jest stosunkowo kłopotliwe. System Oracle udostępnia narzędzie (zwane JPublisher), służące do opakowywania obiektów bazodanowych w kod języka Java oraz zwracające wskaźniki REF do tych obiektów. Więcej informacji na temat narzędzia JPublisher można znaleźć w jego dokumentacji .
Klauzula AS LANGU AGE JA V A jest identyczna dla samodzielnych metod JSP, implementacji programów w ramach pakietów oraz ciał metod wchodzących w skład typów obiektowych. Poniżej podajemy pełną składnię nagłówka funkcji lub procedury JSP dostępnej z poziomu kodu PUSQL-owego:
CREATE [ OR REPLACEJ [ PROC EDU RE nazwa_procedury [ (pa ram[. pa ram] . . . ) J
I FUNCTION nazwa_funkcji [ (param[ . paraml. „ )]
RETURN t yp_sq l ]
[AUTHIO COEFINER I CURRENT_USERJJ [ PARALLEL_ENABLEJ rDETERM I N I ST! Cl ( I S I AS J LANGUAGE JAVA
NAME 'pełna_nazwa_metody [ (pełna_na zwa_typu • . . . ) J [ RETURN pełna_nazwa_typu J'
System bazodanowy umożliwia umieszczenie specyfikacji wywołania JSP w specyfikacji pakietu (gdzie stanowi ona zamiennik specyfikacji podprogramu) lub też w jego ciele (gdzie jest trakto-
Integracja z językiem Java 193
wana jako zamiennik ciała podprogramu). Podobna sytuacja ma miejsce w przypadku typów obiektowych: specyfikacja wywołania JSP może zastępować specyfikację metody obiektu lub też jego ciało.
Zauważmy, że typowe funkcje języka Java są zazwyczaj odwzorowywane na funkcje PUSQL-owe, lecz funkcje zwracające wartość void odpowiadają procedurom. Wyraźnym mankamentem integracji Javy z PL/SQL-em jest fakt, iż niezgodności w odwzorowaniu argumentów PUSQL-owych na parametry widziane z poziomu języka Java wychodzą na jaw dopiero w trakcie działama programu .
Słownik danych
Aby dowiedzieć się, które elementy bieżącego schematu korzystają z implementacji w języku Java, należy odszukać w perspektywie słownika danych USER_OBJECTS rekordy, dla których pole object_type ma wartość zaczynającą się od „JAVA%". Status INY ALID oznacza, że dana metoda nie posiada działającej
implementacji. Zauważmy, że nazwy bibliotek języka Java me muszą odpowiadać nazwom zawartych w nich klas.
194 Oracle PL/SQ:L. Kieszonkowy słownik języka
Symbole • (aposlrol), 9; 11
ogranicznik literaJu, 14 - {dywiz), 9 - operatorodcjmowania, 14 -- (prefiks wiem.a komentara),
15 ! (wyknyknik), 9 " (c-udzyslów), 9; IO; 101; 106;
113; 114; 117; 118 ogranicznik literaJu teksto
wego, 14 #(hash), 9
identyfikatorląc1.a, 15 $ (dolar), 9; 113 % (proeenl), 9
identyfikator atrybutu, 15 &,9 O(nawiasyokrągle) , 9; 14; 113 * (gwiar.dka), 9; 112
oper.itormn<Ylenia, 14 ** (operntor potęgowania), 14 , (prlCCinck). 9; 159
separatorClement6wlisty, 14 --, 15 . (kropka), 9; 75; 11 3; 118
identyfikator kom~nentu, 1.5 .. (operatorr.akresu), 15 I (ukośnik) , 9
oper.itord1.ielenia, 14 ,. 15 : (dwukropek), 9;62; 142
identyfikator zmiennej macicrlystej, 15
:=(operator pr1.ypisaoia), 13; 3 1 ; (srcdn1k), 9; 17
koniec polecenia lubdeklarJ.-cji, 14
? (pytajnik), 9; 113 @,9 11 (nawiasy kwadratowe), 9;
11 3 ' {da.,zck), 9; 113 '=i ~(operatory
nierówności), 14 _ (podkres1enie), 9 / }(nawiasy klamrowe), 9; 113
~ 9; 113 I (operator konkatenacji), 13;
14 - (tylda), 9 +(plus), 9; 112
oper.itordodawania, 14 <, 163
operator ,)1lnicjszeod", 14 «lub» (ograniczniki
etykiet), 14 <=(oper.nor ,.mnicjszclub
równe"), 14 <>(nawiasy trójkątne), 9; 85 o i != (oper.tlory nierówności),
14 =(znak równości) , 9;85
operator równości, 14 =>(operntor a."!JC'jacji), 15 >(operator „w1ęliszeod"), 14 >=(opcr.łlor „większe lub
równe"), 14
A ABS, 107 ACOS, 107 ADD_MONTH, 109 AFTER, 141; 145; 148 A GG REGA TE USING, 126;
176 ALTER SESSION, 185; 187 ALTER TYPE, 172 ALTER, 52; 139; 140; 141;
143; 147; 181 ANALYZE, 140; 141; 147 AND,27; I07; 121 argumenty, 130 ASLANGUAGEJAVA, 191;
193 ASCII, 98; 101 ASCllSTR, 98; 101 ASIN, 107 ASSOCIATESTATISTICS,
147 ATAN, 107 ATAN2, 107 atrybuty, 55; 56; 157 AUDIT, 140; 141; 147
Indeks
AUTHID, 126; 175 automatycznegenemwanie
kluczy,47 AUTONOMOUS
TRANSACTION, 16;52
B ba74danych, 19;47 BEFORE, 142; 145; 148 BETWEEN, 163 BALE, 24; 28 bibliotcka,21 ; 156; 187; 188;
190; 193; 194 BIN_TO_NUM, 107 BINARY_DOUBLE, 12;23;
HXJ BINARY_FLOAT, 12;22; 28;
133 BINARY _INTEGER, 21;33;
79;90; 133 BITAND, 107 BLOB,24;28; 137 blokada,50 bloki anonimowe, 18 bloki macier<yste, 68 bloki nazw-J.nc, 18 bloki r.agnieżcfaonc, 68 blokowanie kolumn, 59 bledv, 67;68; 179; 181 BOóLEAN, 27; 82; 85; 87;
155; 159 BULK COLLECT INTO, 96
c CALL składnia, 72; 122; 125 CARDINALITY, 86; 89 CASCADE, 173 CASE, 34; 35; 36; 37; 38 CAST, 85; 86; 87; 98; I 09 CEil , 107; 108 CHAR,23; 100; 10 1; 105; 106;
111 ; 133; 177 CHARTOROWID, 98 CHR, 102; I04 ciało, 148; 158 CLOB 28· 60· l()(J- 120· 137·
177 ' ' • ' ' •
Indeks 195
CLOSE, 54; 64; 65 COLLECT, 43; 85; 86; 87; 96 COLLECTION_IS_NULL, 90 COMMENT, 141; 147 COMMIT,47;48;52;58; 151;
154 COMPOSE, 102 CONCAT,29; 102 CONSTANT, 19;31 CONSTRUCTOR
RJNCTJON, 162 CONTINUE, 4;40;44;45 CONVERT, 98; I 02 Coordinated Uni\'ersal Time
(UTC), 25; 26; I 09; I I I; I 12 COS, 107 COSH, 107 COUNT,89;90;95; 11 4; 188;
189 CREA TE OR REPLACE
TYPE BODY, 174 CREATE,52;60;82; I 19; 121;
139; 141; 147; 174; 191 CURRENT_DATE, 109 CURRENT _ TIMESTAMP,
109 cyfry, 9 czas 13
a:eenwich, 25 uniy,·ersalny, 25
D dane, 19; 151 Data Control Language (DCL).
47 Data Dcfinit:ion Language
(DDL), 47 DATE,25;98; 100; 109; I 11;
164 DATETIME, 13; 109 daty,25 DB_ROLE_CHANGE, 141 DBMS_CRYPTO, I 19 DBMS_DB_ VERSION, I 19 DBMS_ERRLOG, 119 DBMS_LOB,28; 119 DBMS_LOCK, 119 DBMS_OUTPUT, 37; 120;
15 1 DBMS_RLS, 121 DBMS_SCHEDULER, 121 DBMS_SQL, 4;61;62; 121 DBMS_UTILITY, 70;72;73;
122
DBTIMEZONE, 109 debugging, I 87 DEC,20;22 DECIMAL, 20; 22 DECOMPOSE, 102 DEFAULT, 31; 156 deklaracje, 19 dowiąz.ane, 32 kolekcji, 8 I rekordów, 74 wyjątków, 67 wyprlCdzającc, 134 zogranic:t..cniami, 31 zmiennych, 29; 74
DELETE, 47; 52; 56; 58; 59; 73;85;89;90; 139; 140; 142; 144
DELETING, 144 DEREFoperator, 168; 171 ; 172 deszyfrowanie, I 19 DETERMINISTIC, 126; 175 DISABLE, 120; 143 DISASSOCIATE
STATISTICS, 141 doclawanieclement6w, 84 DOUBLE PRECISION, 20;22 dowiązanie typu danych, 32 DROP, 121; 139; 141; 147; 174 dyrektywy blędów, 179 dyrektywy kompilator.i, 16 dyrektywy konfigurac-yjnc, 178 dyrcktywywyboru, 178 dzicdljczenic, 160; 165
E efekty uboczne, 156 elementy pakietu, 151 emulacjapętliREPEAT
UNTIL, 43 ENDCASE,35 eskalacja, 71 etykiety, 14;44;46 EXCEPTION CODE 95 EXCEPTIONJNDEX, 95 EXCEPTION_INIT, 16;68 EXCLUSIVE, 50 EXECUTE IMMEDIATE, 52;
60 EXECUTE, 52; 60; 93; I 21;
125; 149; 153 EXISTS, 89; 90 EXIT, 40;41;44 EXIT WHEN, 41 EXP, J07
196 Oracle PL/SQ:L. Kieszonkowy słownik języka
EXTEND, &O; 81 ; 84; 89 EXTRACT, 109; 11 1
F FALSE, 27;55;57; 177 FETCH INTO, 77; 96 FETCH, 54;56;60;61;64;65;
122 FINAL, 160; 166; 173 FIRST, 89;90 FLOAT, 20;22;23;28; 133 FLOOR, 107; 108 FOLLOWS, 143 FOR, 15;40;41;42;45;52;54;
58·59· 60· 61 · 142· 146 FOR EACH ROW, i'42; 146 FORALL, 43; 93; 94; 95 FORCE,48; 174 FORMAT_CALL_STACK,
72; 122 ~k~OR_BACKTR FROM,99; 106; J09; 110; 135 FROM_ TZ, 99; I I O funkcje, 18; 124; 125; 157
konwersji, 98 obs·lugi wyral..cń regularnych,
llZ operujące na liczbach, I 07 operujące na lańcuchach
tekstowych, I O I operujące na wartościach
DATETIME, 109 pakietowe, I 56 PUSQL, 154 potokowe, I 35; 176 tabelowc, 135 wbudowane, 98; I 12 wywolywanie, 154
G generowanie wyjątków, 69 globalnyobs1.arużylkownika,
153 godz.iny, 25 GOT0, 34;39;40;46 GRANT, 52; 141 ; 147; 191 GREATEST, 102; 103; 107
H hierarchia nazw I 57 HTF, 122 ' HTP, 122
identyfikatory, 9 atrybutu, 15 !;µa bazodanowego, I 5 OID, 158 typu wielkoobiektowego, 20 1.miennej macicrlystcj, 15
IEEE754, 22;23; 133 IF, 34 IF-THEN, 34 IF-THEN-ELSE, 34 IF-THEN-ELSIF, 35 IN,85; 128; 130; 133; 144;
155; 162 INOlff, 128; 133; 162 INDICES OF, 94 inicjali1.acja, 3 I· 80· 82· 86· 89-
146; 148; 153; 161; ls1;'1ss ; 187 kolekcji, 83 obiektu, I 67 Jl"kietu, I 52
INITCAP, 102; 104; 175 INLINE, 17; I 86 inlining, 185; I 86 INSERT, 47;52;56;58;73;
139; 140;142; 144; 172 INSERTING, 144 instancje typu obiektowego,
161 INSTANTIABLE, 161; 166;
174 INSTR, 103; J05; I 12; I 15;
120 INT, 2 1 JNTEGER, 12;2 1;22;23;33;
41;79;80;90; 133; 163; 180 integracja z bazą danych, 47 INTERVALDAYTO
SECOND, 25;99; 100; I JO; I I I
INTERVAL, 13;25;26;99; 100; 101; I JO; I I I
INTERV AL YEAR TO MONTH, 25;26;99; JOJ; I JO
JNVALIDATE, 173 IS DANGLING predykat, I 70 ISOLATION LEVEL
SERIALIZABLE, 50; I 54
J Java, 190; 192
JPublish.,.., I 93
K kasowaniedanych, 144 kla.<ól, 124; I 57; I 59 kolekcje, 79
deklarowanie, 8 I inicjalizacja,83 operacje, 89 prawa dostępu, 93 zagnieżdżone, 93
kolumna, 58 korncntarL, 15
wiclowiers-1.owy, 15 kompilacja, 175
natywna, 175; I 86 warunkowa, 175; 178
kompilator, 15; 129; 132; 157; 175; 179; 181; 184 konfiguracja, I 79 optymalizując-y, 184 ostrle.7..enia, 181
komunikat o błędzie, 70; 7 I; 122
koniec polecenia lub deklamcji, 14
konstruktor, 83; 161; 162 kontrola transakcji, 48 konwersja, 28; 30; 98 kropka dziesiętna, I 2 kursor, 9;52;63; 65; 15 I
bezparametrowy, 53 domniemany, 56 dynamiczny, 52; 60 jawny, 52
atrybuty, 55 de~Jarowanie, 53 otwieranie, 53 wczytywanie danych, 54 1.amykanic, 54
rnacier1.ysty. 65 statyczny, 52 zlis4~tr6w, 53
kwalifi~ator, 12
L LAST, 9(~ I JO LAST_DA Y, I JO LEAST, 102; J03; 108 LENGTH, 103; 177 liczby 1.micnnopr1..ecinkowe, 22 LIMIT, 90 lista paramctr6w, I rJ
l iterał, JO lxxilowski, I O DATETIME, 13 tekstowy, IO; I I; 12 złożony, JO
litery, 9 LN, 108 Joadjava, 191 LOB, 20;28 LOCALTIMESTAMP, I JO LOCK TABLE, 48;50 LOG, 108; I 19 LOGOFF, 14 1; 148 LOGON, 141; 148 LONGRAW,24; 100; 142;
159 LONG, 23;24; 100; 142; 159 LOOP, 4ll LOWER, 103; 104 LPAD, 103 LTRIM, 103; 105
Ł Jańcuch 7.r6dłowy, I I 8 Jańc-uch tekstowy, JO I
M MAP, 163; 164; 165 mccbanizmy obiektowe, I 57 mcchani1my optymalizacji, 175 MEMBER, 87; 16 1 metaznaki, I 12 metody, 157; 158; 161
pomwnawc1.c, 159; 161; 163 obiektów, 161 statyczne, 161 w podtypach, I 65
MOD, 108 modyfikacjadanych, 144 modyfikatory zgodności, I I 8 modyfikowanie typ6w
obiektowych, 172 MONTHS_BETWEEN, I JO MULTISET, 85; 86; 87; 99 MULTISET EXCEPT, 86 MULTISET UNION, 87
N naglówek, I 9; I 59 NANVL, 108 NATURAL,21 NATURALN, 21 nazwa etykiety, 44
Indeks 197
nazwa kolumny, 6; 58; I 57 nazwy obiektów, 9 NCHAR, I 1;24;82; 100; JOi ;
102· 104· 106- 177 NCHR, H.i ' NCLOB,28;82; J()(~ 137; 177 NEW _TIME, I Hl NEXT, 90; I I O NEXT_DA Y, I JO NLS (national char.ictcr set),
24· J(J4· I I I· I 18· 177 NLS~INITCAP, 1o4 NLS_LENGfH_SEMANTICS
,177 NLS_LOWER, 104 NLS_UPPER, 1(14 NLSSORT, 104 NOAUDJT, 14 1; 147 NOCOPY, 129 NOTFINAL, 160; 166; 173 NOT JNSTANTIABLE, 161 ;
166; 174 NOT NULL, 2 1;29;32;82 NOTSUBSITTUTABLE, 173 notacjakropkowa, 142; 151;
170· 172: 192 notacj~ opi;;owa, I 30 notacjapozycyjna, 130 NOWAIT,50;51;58 NULL, 10; 2 1;27;29;31 ;34;
36 39·40· 55· 57·64· 80· 82· 86'.89'. 103· 128-'142'. 162: ' J6J; 161; 169; 180 ' '
NUMBER, 12;20;21 ;22;23; 62·86·127· 133· 164
nu~biędu,67;io NUMERJC, 20; 23 NUMTODSJNTERVAL, 99;
110 NUMTOYMINTERVAL, 99;
110 NV ARCHAR, I I NVARCHAR2, 24; 82; JCXI;
JOJ ; 102; 106; 177
o <lbiekty, 158; 161
operacje, I 67 nietrwale, I 58 trwale, 158 wierszowe, 158
<lbr6bka danych, I 9 obsluga wyjątków, I 9; 66 odstęp, 9
odwołania do elementów pakietów, 151
odwzorowanie typów, 193 ogrdniC'.f..enia, 31 ogr.i.nic1.niki, I 3
etykiet, 14 komentar1.a wielowiers:t.ov.·e--
go, 15 liter.Uu, 14 polecenia, 14 wyra:i..eń i I ist, 14
OJD (Objcct JDcntifier), 158 OPENFOR, 60;61 opemcje na kolekcjach, 89 opemcje na obiektach, I 67 opemCJC na rekordach, 76 opemcje na tabelach, 85 operator asocjacji, I 5 operator dodawania, I 4 oper.ttor dzielenia, 14 operator konkatenacji, 13; 14 oper.itormniejs1.e lub r6wne, 14 oper.itormniej~~lcod, 14 operator mno:i..cnia, 14 operator nierówności, I 4 operator odejmowania, 14 operator porównania, I 63 operator potęgowania, 14 operator prtypisania, I 3; 31;
75;76 operator równooci, 14 operatorwiększe lubrówne, 14 operatorwiększeod, 14 optymalir.acja kompilatorowa,
184 OR,27;(>(1; 82; 126; 149; 174 OR REPLACE, 60; I 26; 149;
174; 175 Or.tcle Regular Expressions,
112 ORDER metoda, 159; 163;
164; 165 ostrLc7..enia kompilalorowe, 181 ostr1.cieniaopisowc, 175 OUTparamcteiy, 128; 133;
162 OVERRIDING, 165
p
palcie~ 18; 124; 148 inicjalizacja, 152 odwolaniadoelement6w,
151 struktura, 148
198 Oracle PL/SQ:L. Kieszonkowy słownik języka
wbudowany, 98; I I 8 pamięć podręc1.na rc1.ultat6w
funkcji, I 35 PARALLEL_ENABLED, 175 parametry, I 27; I 30 parser 60 partycJon7'wanie, 176 perspektywy slownika danych,
JO pętla, 4(~ 46
FOR, 4() kursorowa, 42 Jiczlx>w-J,41
nieskończona, 40 pro5ta,40 REPEA T UNTJL, 43 WHJLE, 40; 43
PGA (Proccss Global Area), 153
PIPE ROW, 176 PIPELINED, 126; 135; 176 PLS_INTEGER, 21;41; 133;
180 PLSQL_CCFLAGS, 176; 180 PLSQL_CODE_TYPE, 176;
189 PLSQL_DEBUG, I 77 PLSQL_NATIVE_C_COMPI
LER, 187 PLSQL_NATIVE_LIBRARY
_DIR, 187; 189 PLSQL_NATIVE_LINKER,
187 PLSQL_OPT1MlZE_LEVEL,
177; 185 PLSQL_WARNJNGS, 177;
181 Pocket Rcforcnce, I I 2 podtypy, 165
definiowane prLCZ pmgramistę, 33
ogr.miczone, 33 pola, 74 polecenia, I 7 polimorfizm dynamiczny, 166 porównanieobiekt6w, 159; 163 POSITJVE, 21;33 POSITJVEN,21 POWER,108 PRAGMAAUTONOMOUS_
TRANSACTION, 52 PRAGMA, 16;52; 152 pragmy, 16 prawadostępu, 93 precyLja, 20; 22
P'f.(4katy w wy-Lwalaczach,
prefiks wiersza komentar.t.a, IS PRIOR, 90 procedury, 9; 18; 124; 157 ProcessGJobal Area (PGA),
153 programy lokalne, 131 pr.t.edzial c7.asu, 13 prt.eladowaoie, 132; 166 pseudokolumny,47 pseudorekord, 142 publikowaniekodu, 192 PUT_LINE procedura, 37; 120;
123; 151
R RAISE, 68; {I} RAISE_APPLICATJON_
ERROR, 70 RAW,24;99; JOO; 119; 142;
159 RA WTOHEX, 99 READONLY, 49; 154 REAL, 20;23 REF, 63;82; 137; 168; 170;
171 ; 172; 176; 193 REFERENCING, 142 REFTOHEX, 99 REGEXP, 105; 113; 114; 115 REGEXP_COUNT, 112; 114 REGEXP_INSTR, 105; 112;
115 REGEXP _LIKE, 11 2; 11 4 REGEXP _REPLACE, 112;
113; 117 REGEXP _SUBSTR, IOS; 112;
115 rekordy, 74
aDML, 77 deklarowanie, 74 kursorowe, 74 operacje, 76 labelowe, 74 zagnieżdi.one, 78 1.definiowane pr1..ez progra-mistę, 74
RELIES_ON, 136 REMAINDER, 108 RENAME, 141; 147 REPEA T UNTIL, 4;43;44 REPLACE, 29;60; 105; 112;
113; 126; 149; 174
RESTRICT_REFERENCES, 17; 156
RESULT_CACHE, 136; 137 RETURN 53· 63· 125· 126·
162 ' ' ' ' ' RETURNING JNTO, 96 RETURNING, 58; 96 REUSESETTINGS, 176 REVERSE,41 REVOKE, 52; 141; 147 RNPS (Read No Package
State), 157 rod7.ajc zmiennych, 19 ROLLBACK, 47; 48; 50; 52;
58·73· 15J· J54 ROUNÓ, 108 ROWJD, 24; 98; 159; 172 RPAD, 105 RTRIM, !03; 105; 154 rlutowanie typów
obiektowych, 168
s SA VE EXCEPTIONS, 94 SA VEPOINT, 48; 49 sekcjainicjalizacji, 149 sekwencje, 47 sekwencyjna kontrola
prLCplywu, 34 sek"'encyjnestruktury
kontrolne, 38 SELECT, 65 SELECT FOR UPDATE, 52;
58 SELECT JNTO, 56; 76; %;
167 SELF parametr, 161 ; 162; 163;
167 separator elementów listy, 14 SERIALL Y _REUSABLE, 17;
152 SERVERERROR, 141; 148 SESSJONTIMEZONE, 11 2 SET, 48;49;78;87; 120; 154 SETROW,78 SETTRANSACTION,48;49;
154 SGA (System Global Area),
136; 152; 153 SHUTDOWN, 142; 148 SJGN,21; 108 SIGNTYPE, 21 SIMPLE_INTEGER, 22 SIN, 108
SJNH, 108 skala, 20; 22 slabazmienna kursorowa, 63 slownik danych, 194 si owa zastr1..eżone. 9; I O SMALLINT, 21;23 SOUNDEX, 105 spet.-yfikacja, 158
attybutów, 159 metod, 159 pakietu, 148 wywołania, 190
SQL inje<-1ion, 62 SQL%BULK_
EXCEPTIONS.COUNT, 95 SQL%BULK_ROWCOUNT,
97 SQL%FOUND, 57 SQL%1SOPEN, 57 SQL%NOTFOUND, 57 SQL%ROWCOUNT, 57 SQLCODE, 72; 95 SQLERRM, 72 SQRT, 108 stałe, 9; 19; 31 standardowe 1..estawy 7.Jlaków,
24 STARTU!', 142; 148 STATIC, 161 stopieńczystości, 17; 156 stopień zagnicid:i.cnia, 44 strukturablokowa, 17 struktura pakietu, 148 struktury danych, 151; 157 struktury kontrolne, 38 SUBSTITUT ABLE, 173 SUBSTR, 105; 112; 120 SUSPEND, 142; 148 symbole, 9 SYS_EXTRACT_UTC, 11 1 SYSDATE, 111 ; 127; 175 System Glc>bal Area(SGA),
136; 152 SYSTIMESTAMP, 111 szyfrowanie, 119
ś śled:t.eniabłęd6w, 187
T tabelezagnieżdi.one, 79 gęste, 79 operacje, 85
Indeks 199
TABLE, 48· 5()-82· 99· I 22· 143; 174' • • • •
tablicea""'iac-yjnc, 79; 82 r1.adkie, 79
tablice o zmiennych r<>:tJUiarach. 79
tablice VARRA Y, 79 tabulator 9 TAN, JOS; 109 TANH, 109 THE,99 TIMESTAMP, 25; 26;99; JOJ;
109 TIMESTAMP WJTH LOCAL
TIME ZONE, 25; 26 TIM EST AMP WJTH TIME
ZONE, 25;26;99; JOJ ; 109 TO_BINARY_DOUBLE, 100 TO_CHAR, J()(~ JOJ ; 105;
106; I l i TO_CURSOR_NUMBER,62 TO_DATE, 98; 100; I I I TO_DSJNTERVAL, 100; I I I TO_LOB, J()() TO_MULTl_BYTE, J!Xl; 106 TO_NCHAR, 100; JOJ; 106 TO_REFCURSOR, 62 TO_SINGLE_BYTE, 106 T0_11MESTAMP, JOJ ; I I I TO_YMINTERVAL, JO J transakcje, 48
autonomiczne, 50 transakcyjny model interakcji,
48 TRANSLATE, JOJ; 106 TREA T operator, I 68; 170 TRIM,8!;85;90; 103; 105;
106; 120 TRUE, JO; 27; 36; 55; 57; I 67;
177 TRUNC, J09; I 12 TRUNCATE,52; 140; 147 TRUST, 157 tryb obsługi, I 28 tworlenic wyzwalaczy, 139 typabstmkcyjny, 161 typ lxxilowski, 27 typdanych, 12;22;81; 127;
159 typ binarny, 21 typ liczbowy, 20 typLOB,28 typobiektowy, 124; 157
modyfikowanie, 172 r1..utowanie, 168
skladnia, I tlO typ wielkoobiektowy, 28 typznakowy,23
Unicode, 24 TZ_OFFSET, I 12
u UGA (UscrGlobal Area), I 53 UN DER, I tlO Unie<xle, 24 UNISTR, JO J; 106 UPDATE, 47; 5(); 5 I; 52; 56;
58· 59·73· 139· 140· 142· 144 . ' . . ' UPDATING, 144 UPPER, 103; H» uprawnienia osoby wywoluj~cej, 138
uprawnieniatwórcy, 138 UROWID,24; 159 USE ROLLBACK
SEGMENT, 50 USER_ OBJECTS, I 94 USER_STORED_SETTINGS,
188 us.u wanie elementów, 84 UTC(Coordinaled Universal
Time), 25; 26; I 09; I I I; I 12 UTL_FILE, 67; 123; I 37 UTL_MAIL, 123 UTL_REF, 171 uwierqtelnianie, I 38; I 75
V VSRESERVED_ WORDS, JO V$RESULT_CACHE, 136 V$TIMEZONE_NAMES, 26 VALUĘ. 122; 168·jJ71; 172 V A LUES, 77; 94; 72 V ARCHAR2, 23; 3 I; 80; 90;
J()()- 104· J06- 123· 133· 177· 180' ' • ' ' •
VARRAY, 83
w wartości domys1ne, 3 I; I 26;
129; 130 wartośćskalama,20; 164 wartość złoi.ona, 20 wbudowane pakiety, I 18 wczytywanie danych, 54 WHEN, 35; 143 WHEN NULL, 36
200 Oracle PL/SQ:L. Kieszonkowy słownik języka
WHEN CITHERS, 72 WHERE CURRENTOF, 59 WHJLE, 4;40;43 wielkość liter, 9; I I 8 wiersz komentar1.a, 15 WNDS (Write No Databao;e
Stale), 156 WNPS (Write No Package
Stale), 157 WORK, 48 wprowadzeniedanych, 144 wskazówka, 129 wskainik, 20; 28 wstr1.ykiwanieSQL-a, 62 wyjątki· 9· 73 dekJ;Jo~anie, 67 generowanie, 69 lista, 67 obsluga,66
wyrażcniakursomwe, 65 wyra7.enia regularne, I I 2 wyr.iżeniaSQL, 154 wyr.iżcniastatyczne, 180 wyr.i.żeni a warunkowe, 34 wywolywanic funkcji, I 54
pakietowych, I 56 PUSQL, 154
wy-Lwalacze, 18; 124; 139 twor1.enie, 139 złożone, I 45
z 1..agnieżd:i..anie, 65 1.akres 70 1.amyk:inie kursor6w jawnych,
54 1..apytaniazbiorc-1.e, 93 1.dar1.enia, 140
bazcxlanowe, I 39; I 48 DDL, I 39; I 47 Zdar1.enia DM L, I 39; I 44
zestaw maków, 9 zmienne, 9 ; I 9; 29 dowiązane, 62 kursorowe, 63 Jiczbowe,20 obiektowe, I 67 ogr.miczone, 31 skalarne, 20
znak końca wiers1..a, 9 znak powrotu karetki, 9 znak 1.aroykający, I I znaki biale, 9 znaki otwierające, I I
O'REILLY®
Oracle PL/SQL. Najlepsze praktyki
~~--~~
W kW,Ue ohTJlo1w rói.nią 111fr<ky 1ul1111yn1 projek11m1 infannn1ycz11yn1 n tnkin1, który ko1itt.y 1ir klfsltq. Autor nie popru11.aje nn1H.ula11i11 li1ty ''tfl'-4 ker. każtfś/ z nieb ilu.struje renlisf)oeznpn scenari111U111 u1noilhviajqtyn1 czy1el11i.ko1ui zrozun1ie11ie jtj :uilCUliia. OIHJwiqzkowo po111in11y j4 prz.eczytać w1:;ystltit osoby z zupoló1u p1•ogrnn1istycznych korzystajqCJ'"h z teclJ1Wlogii Oracle.
D'vaync King;. Prezes firmy KRIDAN Consulting
Ksiąika "L3'vicra zbiór przejrzystych zasad - najlcpSZ)'Ch praktyk, po,,·sral)'ch \\' op:irciu o ,,·idolcn1ic doS,vi::ad<:icnic :1.ucora 'v pl'(lgr;tnH)~_niu oraz n::iuczaniu j ęi:ył::a PL/SQL. StOSO\''anic ic;h umoilhvi f\voricnic .skutcc-in y<:h apliknc.ji baw<la.nowych z uwzgl~dnh:nicut no'''y<:h rnoilh„·ości srsr<:1nu Oracle Darab3sc: I lg.
\\?c: \\'SZp>tkich on16,vion)'Ch zagadnieniach określono problc111 oraz podano jego rozwią~nk. Posłuiono się
fikc~jny1n przcdsiębiorst\\'C1n \X'yn~6"1k2 Sp. z o.o., którego pra<o,\·nky t\vorzą aplikacje b.'l.ZOd~nO\\'C,
pop<"Lniają bl\'dy. U.'SU\\'J.jąje, „1rydągają \vniosłci orat. g.rotnadzą ,,·iedz~ i <lo1hviadc:zenie.
Po Jekrurzc: tc:j ksi~żki b~-łiicsz \\•icdz.i:'ll: " ' jaki sposób osadzać ,„. progra.n1ad1 kod jęiyka SQL. jak t\\'Orlyć pak.ic:ty. które będą pr.cydatnc n ie rylko ·1obic, ale równki pozostaJy1n członkom l\,•ojcg.o
:r.espolu pmgramisrycz.nego. jak St\\•iert-łzić, c:r.y WS'i.)'Slłic progr:uny T,vojcgo?.espc:iłu ,.,.. sposób spójny ohsh1gują i 1-<:jcsrruj'!} bl~t-ł)'.
Prc:unto\vanc treści pod:r.klono 11.1 .dzie,vi~ podst.l\\'O\V)'Ch kategorii: praktyki ogólne: st.lndardy
programistyczne: t<.'Stowanie. śledu:nie i debugging; operacje na zmiennych i suul:curach danych: .HC:t()\\':tnic l ogił:-ą aplik:i.cji; obsh1g:'I hłi;:dO\v; "rykorzysr:i.nie ;~1.yk:i SQL w progl';lnl:tl'.-h Pl./SQL; nvoncnic pr0<:~dur,
funk<:ji. pakietów i \\'}''l\\·alac."ty C>raG C>Pf)'tnalizatja prt>gr:uilÓ\~"
Ksią-i.ka ra jest ~"'i\::r.ł)'ln i cic:kawy1n przc,\·odnikicm, do którego t\\'Órcyoprogranl0\\"1.nia PL/SQL będą \\'Tacać ,o;ielokrotnic \\' l)l)SWkh\•aniu spoS<tbó"· n.:i. C\\'Oricn.ic kodu '~·sold ej ja.ko:ici i d ... "Utccz.nrch aplik:l.cji.
StCl'Cn Fc:uer11tein je11t jednym z czolo\\·ych e.k11pcrtÓY.' ,..-dzicdz.inic j~zyk.l PlJSQL. Napi~.ll I O k11ią7.ck l)~•ii;con)·ch remu jc,"1.ykoY.•i, któl'1.~ uka? ... 'l ł)' si!;"' ,~·rd:t\\•niccwic O'R.eilly i\1c:di2. Od 1980 '" iaj1nujc się rworu:ni<:1n oprogramow·ania„ \ 'l(f l<\tach l 987- J9?2 pracował dla Ól'aclc. Od scrctnia 2001 r. współpracuje z finną Quest Sofc,varc jako propagator jrzyka Pl/SQL Jest kicro'"'lljk.icm O radc ACE. Rą;ularnic publi.kujc arryk\1ly "' ciasopiśmjc Omde lt4agtt~ine, k'órc d"wukron1ic (\\' huach 2002 i 2006) pri:y?.Jl ..\ ło mu tytuł
programisty rol..-u. Strony aurorj ro:· lvu·1v. 'liu1dHlorld.cn11;/S/: oraz lVlvt~'.Sfeil'('JJFeu"Jtei11.co111.
\?J www.pwn.pl
[!r www.mikom.pl