201
+ DODAJ OO PÓU<I •tt;'BUK @ 0 STEVEN FEUERSTEIN BI LL PR I BY L CHIP DAWES ;;: ; SPIS 2 / 202 ORACLE PL/SQL KIESZONKOWY z ang i els ki ego Piotr Nowak ows ki WYDAWNICTWO NAUKOWE PWN WARSZAWA 2009

Kieszonkowy słownik

Embed Size (px)

DESCRIPTION

Short

Citation preview

Page 1: Kieszonkowy słownik

+ 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

Page 2: Kieszonkowy słownik

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

Page 3: Kieszonkowy słownik

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

Page 4: Kieszonkowy słownik

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

Page 5: Kieszonkowy słownik

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

Page 6: Kieszonkowy słownik

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

Page 7: Kieszonkowy słownik

Oracle PL/SQL. Kieszonkowy słownik języka

Wprowadzenie Oracle PUSQL. Kieszonkowy słownik języka to podręczny prze­wodnik 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

Page 8: Kieszonkowy słownik

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 frag­menty 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

Page 9: Kieszonkowy słownik

Język PL/SQL - podstawy Niniejszy dział opis uje podstawy języka PUSQL: znaki, identyfi­katory, literały, ograniczniki, komentarze i pragmy, a także struk­tu 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żo­nych). 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

Page 10: Kieszonkowy słownik

Korzystanie ze słów zastrzeżonych w identyfikatorach jest nie­wskazane 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 za­strzeżonych można uzyskać, wyświetlaj ąc zawartość perspektywy słownika danych V$RESERVED_ WORDS. Radzimy unikać wy­korąstywania tyc!h słów w charakterze identyfikatorów.

Umieszczenie identyfikatora w cudzysłowie znosi wszystkie po­dane 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 identyfika­tory - 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śred­nictwem konstruktorów). W przeciwieilstwie do pozostałych ele­mentów języka PUSQL, literały zachowują rozróżnienie na duże

1 O I Oracle PL/SQL. Kieszonkowy słownik języka

Page 11: Kieszonkowy słownik

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

Page 12: Kieszonkowy słownik

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

Page 13: Kieszonkowy słownik

Literały DATETIME

System Oracle 9i wprowadza nowe typy danych służące do prze­chowywania 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ło­wem 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

Page 14: Kieszonkowy słownik

; (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

Page 15: Kieszonkowy słownik

Ogranicznik

=>

I* i *I

Komentarze

Opis

ldentylfikator zmiennej macierzystej

ldentylfikator atrybutu

(kropka) Identyfikator komponentu (np. rekord pole lub pa­kiet.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 kompi­lator.

Wiersz komentarza rozpoczyna się od podwójnego dywizu (--) i koilczy znakiem k.011ca wiersza. Wszystkie znaki pomiędzy ope­ratorem -- a koilcem wiersza są ignorowane przez kompilator.

Komentarz wielowierszowy rozpoczyna się sekwencją / *, a koil­czy 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

Page 16: Kieszonkowy słownik

Komentarzy wielowierszowych nie można osadzać w innych ko­mentarzach 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 spe­cjalne 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 prze­strzeni transakcji. Więcej na ten temat powiemy w dziale Inte­gracja z bazą danych.

EXCEPTION_INIT Ta pragma nakazuje kompilatorowi skojarzenie podanego ko­du błędu z identyfikatorem zadeklarowanym jako EXCEP­TION (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

Page 17: Kieszonkowy słownik

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 sto­pień uniezależnienia jego działania od operacji na tabelach ba­zodanowych oraz zmiennych pakietu. Więcej na ten temat po­wiemy w dziale Wywoływanie funkcji PUSQL-owych w wyra­żeniach SQL-owych.

SERIALLY_REUSABLE Ta pragma informuje system, że dane pakietu nie powinny zo­stać zachowane pomiędzy kolejnymi wywołaniami. Rezulta­tem jej zastosowania jest zmniejszenie zapotrzebowania apli­kacji 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 pole­cenie 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 sek­wencją --).

Struktura blokowa

Każdy program PUSQL-owy jest blokiem złożonym ze standar­dowego zbioru elementów identyfikowanych za pośrednictwem słów kluczowych (patrz ilustracja I). Blok wyznacza zakres

Język PL/SQL - podstawy I 17

Page 18: Kieszonkowy słownik

zadeklarowanych w nim elementów oraz sposób obsługi i propa­gacj 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

Page 19: Kieszonkowy słownik

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ę pro­gramu. Bloki anonimowe są pozbawione nagłówka -zaczynają się od słowa kluczowego DECLARE Oeśli za­wierają sekcję deklaracji) lub BEGIN (w przeciwnym wypadku).

Deklaracje Sekcja opcjonalna. Zawiera deklaracje zmiennych, kurso­ró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 progra­mach PUSQL-owych:

Zmienne i dane programu I 19

Page 20: Kieszonkowy słownik

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ą precy­zję 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

Page 21: Kieszonkowy słownik

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 prze­chowywania 32-bitowych liczb całkowitych: BINARY_INTEGER, INTEGER, INT, SM ALLINT, NATURAL, NATURALN, POSI­TIVE, POSITIVEN, SIGNTYPE oraz PLS_INTEGER. W wer­sjach 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 im­plementacji typu NlJMBER). Typ PLS_INTEGER (oraz - poczy­nają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: NATU­RAL (od O do 231

- l ) oraz POSITIVE (od 1 do 231- l ), wraz

z wariantami NOT NULL (NATURALN i POSITIVEN). SIGN­TYPE 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

Page 22: Kieszonkowy słownik

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 liczbo­we 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 precyzyj­nych 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

Page 23: Kieszonkowy słownik

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 roz­miary 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 za­chowania 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

Page 24: Kieszonkowy słownik

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 przecho­wywania długich łańcuchów binarnych zaleca się obecnie stoso­wanie 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

Page 25: Kieszonkowy słownik

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 IME­ST 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

Page 26: Kieszonkowy słownik

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ą kon­wertowane 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 przesu­nię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

Page 27: Kieszonkowy słownik

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

Page 28: Kieszonkowy słownik

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 da­nych. Obsługa typów LOB odbywa się za pośrednictwem wbu­dowanego w system Oracle pakietu DBMS_LOB. Oto poszcze­gó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 ba­zie danych.

NCLOB Wskaźnik dużego obiektu alfanumerycznego Unicode zapisa­nego 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 automa­tyczny. 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

Page 29: Kieszonkowy słownik

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

Page 30: Kieszonkowy słownik

~ • • • • • •

~ • • 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

Page 31: Kieszonkowy słownik

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 automa­tycznej inicjalizacji zmiennych. Aby przypisać nowej zmiennej wartość inną niż NULL, można posłużyć się operatorem przypisa­nia(:=) 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

Page 32: Kieszonkowy słownik

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

Page 33: Kieszonkowy słownik

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ła­dowo, 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

Page 34: Kieszonkowy słownik

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

Page 35: Kieszonkowy słownik

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 kolej­nych klauzulach W HEN. Po odnalezieniu pasującej wartości

system wykonuje polecenia umieszczone w odpowiedniej klauzuli WHEN; następnie zaś kontynuuje wykonanie programu, poczy­nają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

Page 36: Kieszonkowy słownik

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 ko­lejnym 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 kontrol­nego - 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

Page 37: Kieszonkowy słownik

Wyrażeni e CASE

Istnieją dwa rodzaje wyrażell CASE: proste i przeszukiwane. Wy­raż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 wyni­kowej od wartości pewnej zmiennej wejściowej . Poniższy przy­kł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

Page 38: Kieszonkowy słownik

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 praw­dziwe, zwraca przypisaną mu wartość wynikową. Poniższy

program oblicza wysokość premii w oparciu o zarobki pracow­nika:

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

Page 39: Kieszonkowy słownik

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 prze­skoku 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

Page 40: Kieszonkowy słownik

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ć przy­najmniej 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ńczo­ne), 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 ko­lejnej iteracji pętli .

Pętle proste

LOOP pol ecenia_wykonywa lne

ENO LOOP :

40 I Oracle PL/SQL Kieszonkowy słownik języka

Page 41: Kieszonkowy słownik

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ń powin­na 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 samo­dzielnie deklarować indeksu). Wartości najniższa_wartofć i naj­wyż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

Page 42: Kieszonkowy słownik

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 SE­LECT 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ą konstruk­cję programistyczną (nakazujemy bazie danych dostarczyć wyma­gane rekordy, lecz nie precyzujemy, w jaki sposób ma to nastą-

42 I Oracle PL/SQL Kieszonkowy słownik języka

Page 43: Kieszonkowy słownik

pić). Oracle Database I Og (oraz pozmeJSZe wersje systemu) umożliwiają automatyczną optymalizację takich wyrażeil, prze­kształ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

Page 44: Kieszonkowy słownik

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 bezwa­runkowe 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 rozpo­czyna 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 opcjo­nalny 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

Page 45: Kieszonkowy słownik

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

Page 46: Kieszonkowy słownik

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 kwalifiko­wania 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

Page 47: Kieszonkowy słownik

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ę transak­cji 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 ba­zach danych Oracle. Aby zapisać w zmiennej języka PUSQL wartość NEXTVAL lub CURRY AL danej sekwencji, należy wy­brać 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

Page 48: Kieszonkowy słownik

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ę wyda­niem polecenia COMMIT lub ROLLBACK. Transakcje są nieza­leż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 maksymal­nie 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 kontrol­nego. Punkty kontrolne tworzymy za pomocą polecenia SA VE­POINT. Wycofanie transakcji do punktu kontrolnego wiąże się

48 I Oracle PL/SQL Kieszonkowy słownik języka

Page 49: Kieszonkowy słownik

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 kontrol­nych, 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 trwa­nia 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

Page 50: Kieszonkowy słownik

• ISOLATION LEVEL SERIALIZABLE: ten tryb również wymu­sza spójność odczytów, lecz jednocześnie pozwala na modyfi­kowanie 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 SEG­MENT 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 wy­korzystanie, 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 rozdzie­lać 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 wy­branych zasobów.

Transakcje autonomiczne

Transakcja autonomiczna oznacza wykonanie wskazanej sekwen­cji poleceil w odrębnej (niezależnej) przestrzeni transakcji. Trans­akcje autonomiczne mogą zostać zatwierdzone lub wycofane bez

50 I Oracle PL/SQL. Kieszonkowy słownik języka

Page 51: Kieszonkowy słownik

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 zatwier­dzone przez transakcję autonomiczną stają się widoczne dla wszystkich pozostałych transakcji w trybie natychmiastowym. System zarządzania bazą danych zawiesza wykonywanie transak­cji 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 zaso­by, których wymaga transakcja autonomiczna, wówczas dochodzi do zakleszczenia (rozwiązaniem jest opcja NOW AJT wyko­rzystana w połączeniu z poleceniem UPDATE wewnątrz transak­cji 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

Page 52: Kieszonkowy słownik

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że­niom 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 wyko­rzystaniem nazw) lub w postaci wyrażeń SQL-owych.

Kursory dynamiczne obsługują wszystkie rodzaje wyrażeń SQL­owych, w tym wyrażenia języka DOL (CREATE, TRUNCATE, ALTER) oraz DCL (GRANT, REVOKE). Implementacja kurso­ró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 specyfi­kacji 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

Page 53: Kieszonkowy słownik

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 pole­ceme:

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

Page 54: Kieszonkowy słownik

Przed odczytaniem danych z kursora jawnego należy go otworzyć.

Otwarcie kursora wiąże się z jego automatycznym przeparsowa­niem oraz uruchomieniem skojarzonego z nim zapytania. Polece­nie OPEN tworzy plan wykonania, dowiązuje zmienne języka macierzystego oraz parametry kursora do odpowiednich elemen­tó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 otwar­cia 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 wska­zanych zmiennych lokalnych. Aby wczytać wszystkie dane z kur­sora, 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

Page 55: Kieszonkowy słownik

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 ogranicz­nik %. 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

Page 56: Kieszonkowy słownik

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 wyko­nania lub sekcji obsługi wyjątków bloku PUSQL-owego, powo­dujemy utworzenie kursora domniemanego. PUSQL dopuszcza tworzenie kursorów domniemanych dla wyrażeń INSERT, UPDAT E, DELETE, MERGE oraz SELECT INTO. W przeci­wieilstwie do kursorów jawnych, kursory domniemane nie posia­dają 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 dom­niemanych 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

Page 57: Kieszonkowy słownik

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średnic­twem 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 odczyta­nych przez wyrażenia wchodzące w sktad operacji zbior­czej (więcej na ten temat w dziale Zapytania zbiorcze).

Kursory w PL/SQL-u I 57

Page 58: Kieszonkowy słownik

Umieszczenie w poleceniu INSERT, UPDATE lub DELETE klauzuli RETURNING spowoduje zwrócenie danych wygenero­wanych przez wyrażenie (dzięki czemu możemy uniknąć wpro­wadzania 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ą podda­wane modyfikacjom. Aby zablokować wszystkie wiersze w zbio­rze 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 COM­MIT 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

Page 59: Kieszonkowy słownik

Poniższy przykład ukazuje blokowanie kolumn w tabeli inwenta­rza (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 zadeklaro­wanego 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 wska­zuje 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

Page 60: Kieszonkowy słownik

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 EXE­CUTE 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 dyna­micznych 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). Polece­nie EXECUTE IMMEDIATE przeparsowuje wyrażenie i urucha­mia je w odrębnej transakcji. Na końcu składni EXECUTE IMMEDIATE musi znaleźć się średnik, lecz nie wolno2 wprowa­dzać osobnego średnika, jeśli w EXECUTE IMMEDIATE korzy­stamy 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

Page 61: Kieszonkowy słownik

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 zmien­nej kursorowej, umożliwiając pobieranie danych za pośrednict­wem 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 progra­mach 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

Page 62: Kieszonkowy słownik

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 naj­bardziej skomplikowany z możliwych scenariuszy zastosowa­nia 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ępnia­nych przez pakiet DBM_SQL (oraz zawarty w nim program PARSE). Do takich sytuacji może dochodzić np. gdy generu­jemy 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 Progra­mowanie 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 (prefikso­wanych dwukropkiem), a następnie przekazywaniu wartości do

62 I Oracle PL/SQL Kieszonkowy słownik języka

Page 63: Kieszonkowy słownik

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

Page 64: Kieszonkowy słownik

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; zastoso­wanie 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 operato­ró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 zdal­nych wywołaniach procedur (mechanizm RPC).

64 Oracle PL/SQL Kieszonkowy słownik języka

Page 65: Kieszonkowy słownik

Wyrażenia kursorowe

Wyrażeniem kursorowym nazywamy kursor pełniący rolę ko­luinny 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 automa­tyczny, 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 sytu­acjach:

• 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 macierzyste­go.

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

Page 66: Kieszonkowy słownik

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 gene­rowania 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

Page 67: Kieszonkowy słownik

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 zadekla­rować 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

Page 68: Kieszonkowy słownik

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ć wy­ją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 macierzy­stego.

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

Page 69: Kieszonkowy słownik

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 deklara­cji, 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

Page 70: Kieszonkowy słownik

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 zawar­toś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 je­dynym 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 przechwy­tywane 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 deklara­cji lub sekcji obsługi wyjątków są automatycznie eskalowane do wyżej położonego bloku. PUSQL umożliwia wydzielenie dowol­nej 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

Page 71: Kieszonkowy słownik

Eskalacja

Wyjątki wygenerowane w ramach danego bloku podlegają eska­lacji 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 podle­gają 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

Page 72: Kieszonkowy słownik

Klauzula WHEN OTHERS

Klauzula WHEN OT HE RS w sekcji obsługi wyjątków prze­chwytuje 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 dodat­kowych 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

Page 73: Kieszonkowy słownik

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 auto­matycznego 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 pole­cenia ROLLBACK ..

Jeśli jednak wyjątek opuści aplikację (tj . ulegnie eskalacji z bloku najwyższego poziom u), wówczas większość środowisk urucho­mieniowych (w tym SQL*Plus) wycofa wszystkie niezakończone transakcje w ramach danej sesji.

Obsługa wyjątków I 73

Page 74: Kieszonkowy słownik

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 SQL­owego 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 wy­branej 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 dekla­racji TYPE, jak w poniższym przykładzie:

7 4 I Oracle PL/SQL Kieszonkowy słownik języka

Page 75: Kieszonkowy słownik

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ól­nych polach rekordów. Pola mogą pojawiać się po obu stronach operatora przypisania:

Rekordy w PL/SQL-u 75

Page 76: Kieszonkowy słownik

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ów­nać 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 przypisa­ma:

nowy_rekord_pracowni ka .data_zat rudnienia : = SYSDATE:

• Wczytanie danych do rekordu lub do wybranych pól za po­mocą wyrażenia SELECT łNTO:

SELECT i d_p racownika, dzial , stanowisko, data_zatrudni eni a , wy­ksztal cenie

! NTO nowy_rekord_pracowni ka

76 Oracle PL/SQL Kieszonkowy słownik języka

Page 77: Kieszonkowy słownik

FROM pracowni cy WH ERE nazwisko= 'LI'

• Wczytanie danych do rekordu lub do wybranych pól za po­mocą 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 zadeklarowa­nych 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 kluczowe­go 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

Page 78: Kieszonkowy słownik

• 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 rekor­dó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

Page 79: Kieszonkowy słownik

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 sa­mego typu, dostępne tylko w kodzie PL/SQL-owym (nie w ba­zach 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 sa­mego 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 od­powiada element tabeli); mogą jednak stać się rzadkie na sku­tek kasowania wybranych elementów.

Tablice VARRAY Tablice o zmiemnych rozmiarach - jednowymiarowe, ograni­czone 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

Page 80: Kieszonkowy słownik

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

Page 81: Kieszonkowy słownik

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

Page 82: Kieszonkowy słownik

posłużyć się definicją TYPE (wczytaną z bazy danych lub umiesz­czoną 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 wprowa­dzać 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

Page 83: Kieszonkowy słownik

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 defini­cję 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ę kolo­ró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

Page 84: Kieszonkowy słownik

' 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 wprowa­dzaniu 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

Page 85: Kieszonkowy słownik

Funkcja DELETE pozwala na kasowanie elementów tabeli za­gnież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 pa­miętać, że funkcja COLLECT jest dostępna tylko w wyrażeniach SQL-owych (nie można posługiwać się nią np. podczas wprowa­dzania 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

Page 86: Kieszonkowy słownik

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

Page 87: Kieszonkowy słownik

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 COL­LECT 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

Page 88: Kieszonkowy słownik

- - 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

Page 89: Kieszonkowy słownik

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 ro­dzajó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 zainicjali­zowana, zwracana jest wartość fałszu.

EXTEND [(n[;l )] Procedura rozszerzająca kolekcję on elementów inicjalizo­wanych 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

Page 90: Kieszonkowy słownik

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 asocja­cyjnych 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 wymie­nionych 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 wytro­pienia błędami, jeśli w ramach danej kolekcji korzystamy z obydwu

90 I Oracle PL/SQL Kieszonkowy słownik języka

Page 91: Kieszonkowy słownik

metod. (TRIM kasuje elementy, które zostały już wcześniej „ska­sowane" 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 za­gnieżdżonych :

Kolekcje w PL/SQL-u I 91

Page 92: Kieszonkowy słownik

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

Page 93: Kieszonkowy słownik

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 progra­mach 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 zapy­ta11, możemy przesłać doil kolekcję, w której umieszczono wszy­stkie 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

Page 94: Kieszonkowy słownik

[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 indek­sy), 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 ele­mentó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 po­mimo stwierdzenia błędu - w takim wypadku wszystkie błędy

94 I Oracle PL/SQL Kieszonkowy słownik języka

Page 95: Kieszonkowy słownik

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ąpie­nia 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

Page 96: Kieszonkowy słownik

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 SE­LECT). 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że­niach 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

Page 97: Kieszonkowy słownik

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

Page 98: Kieszonkowy słownik

Wbudowane funkcje i pakiety Firma Oracle wyposażyła swój system bazodanowy w liczne wbudo­wane 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 wbudowa­nych 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 Databa­se, przy okazji opisu pakietu STANDARD (można też samodzielnie zapoznać się z jego zawartością, otwierając plik stdspec.sql urniesz­czony 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 bazodano­wego 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 doce­lowego zestawu znaków (domyślnym zesta­wem źródłowym jest zestaw bazodanowy).

98 I Oracle PL/SQL Kieszonkowy słownik języka

Page 99: Kieszonkowy słownik

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 szes­nastkowe 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 szes­nastkowy odpowiednik.

Konwertuje wskażnik na łańcuch szesnast­kowy.

Konwertuje wartość rowid na łańcuch VAR­CHAR2(18).

Konwertuje wartość rowid na łańcuch NVAR­CHAR2(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

Page 100: Kieszonkowy słownik

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 NVAR­CHAR2) z opcjonalnym uwzględnieniem podanego formatu.

Konwertuje cz wartości VARCHAR2, NVAR­CHAR2 lub NCLOB do typu GLOB (lub NC­LOB).

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~o­we 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 jedno­bajtowe odpowiedniki.

1 OO I Oracle PL/SQ:L. Kieszonkowy słownik języka

Page 101: Kieszonkowy słownik

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 ze­stawu znaków do narodowego zestawu znaków. Umożliwia zachowanie kompatybil­noś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 zesta­wu 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

Page 102: Kieszonkowy słownik

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 zawiera­ją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ła­dowe (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, zapisu­jąc pierwszą literę każdego z wyrazów wersali­kami, 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

Page 103: Kieszonkowy słownik

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 lalicu­cha 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 przy­padku 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

Page 104: Kieszonkowy słownik

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, zapisu­jąc pierwszą literę każdego z wyrazów wersali­kami, 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ólnio­nych 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

Page 105: Kieszonkowy słownik

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ń regular­nych.

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

Page 106: Kieszonkowy słownik

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 jedno­ba~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 narodo­wego zestawu znaków (NCHAR _CS). Rezultat jest typu VARCHAR2 lub NVARCHAR2, w za­leż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

Page 107: Kieszonkowy słownik

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 prze­działu O- 1. Rezultat należy do przedziału O- ir.

Zwraca arcus sinus n, gdzie n jest wartością z prze­dział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ą dowolny­mi liczbami. Rezultat ATAN2(n, m) jest z definicji tożsamy z rezultatem ATAN(n/m).

Konwertuje wektor bitowy reprezentowany przez war­toś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 wyra­zić 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

Page 108: Kieszonkowy słownik

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ęt­nych. Wartość m może być ujemna - w takim wypad­ku 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

Page 109: Kieszonkowy słownik

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. Opcjo­nalny 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 konwertowa­nie ł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

Page 110: Kieszonkowy słownik

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ól­nionego w wyrażeniu typu DATE.

Zwraca lokalną datę i godzinę jako wartość TIME­STAMP. 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 forma­tem (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

Page 111: Kieszonkowy słownik

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ą ser­wera 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 se­kundach) do wartości INTERVAL DAY TO SECOND.

Konwertuje łańcuch tekstowy reprezentujący wartość DATETIME do wartości typu TIMESTAMP przy opcjo­nalnym 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

Page 112: Kieszonkowy słownik

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śred­nictwem pięciu wbudowanych funkcji: REGEXP _COUNT (no­wość 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 unikso­wymi , 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

Page 113: Kieszonkowy słownik

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.e­nia. (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ą trakto­wane 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

Page 114: Kieszonkowy słownik

REGEXP COUNT (Oracle Database 11g) Funkcja REGEXP _C OUNT zwraca liczbę wystąpień danego wy­raż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 re­gularne, 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 regu­larne, zaś modyfikator _zgodnofci to modyfikator kryteriów wy­szukiwania. 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

Page 115: Kieszonkowy słownik

REGEXP INSTR Funkcja REGEXP _ INSTR odnajduje w danym łańcuchu wystą­

pienie tekstu odpowiadającego wejściowemu wyrażeniu regular­nemu. Zwracana jest pozycja początkowa lub końcowa odnalezio­nego ł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 poszuki­wanego 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

Page 116: Kieszonkowy słownik

wyrażeniu regularnemu. Zwrócone zostają wszystkie odnalezione wy­stą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ś modyfika­tor _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 wcho­dzić 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 telefo­nicznej (środkowa grupa cyfr) z numeru telefonu zapisanego w zmiennej c_ rec . c_c lob. Zastosowane przez nas wyrażenie re­gularne 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

Page 117: Kieszonkowy słownik

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

Page 118: Kieszonkowy słownik

ł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 przetwa­rzają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 osob­nych 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

Page 119: Kieszonkowy słownik

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 wbudo­wanych pakietów PUSQL-owych można znaleźć w przewodniku Oracle Database PUSQL Packages and Types Reference, wcho­dzą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 sy­stemie Oracle Database 10g lub nowszych).

Umożliwia logowanie błędów DML-owych oraz kontynuowanie wykonywania progra­mó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

Page 120: Kieszonkowy słownik

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 obiek­tó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 kiero­wanie 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

Page 121: Kieszonkowy słownik

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 wskaza­nej tabeli.

Uruchamia pol itykę bezpieczeństwa, umożli­

wiając przetestowanie jej działania.

Zaawansowane mechanizmy kolejkowania za­dali (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ę zaawansowa­nych wymagań biznesowych.

Otwiera kursor.

Parsuje dynamiczne wyrażenie SQL-owe.

Definiuje kolumnę odpowiadającą pojedyn­czemu 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

Page 122: Kieszonkowy słownik

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

Page 123: Kieszonkowy słownik

Wbudowane pakiety/programy Opis

HTMLCLOSE Zamyka dokument HTML.

PRINT

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

Page 124: Kieszonkowy słownik

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. Wy­zwalacze, 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

Page 125: Kieszonkowy słownik

[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) ob­sł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 zwra­ca rezultat za pośrednictwem klauzuli RETURN. Podobnie jak procedury, funkcje mogą przyjmować argumenty. Oto pełna

skJadnia funkcji:

Procedury i funkcje I 125

Page 126: Kieszonkowy słownik

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

Page 127: Kieszonkowy słownik

• 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 przekazy­wanych 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ę sto­sowania 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

Page 128: Kieszonkowy słownik

,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ć odczy­tywana wewnątrz podprogramu, lecz nie podlega modyfikacjom.

OUT oraz IN OUT do odczytu i zapisu Wartość parametru może być odczy­tywana 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 para­metry 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

Page 129: Kieszonkowy słownik

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 (pod­program 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 oko­licznościach - zostać zignorowana przez kompilator (szczegółowy opis działania NOCOPY przedstawiono w książce Programowa­nie 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ła­niach 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

Page 130: Kieszonkowy słownik

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 pro­gramu. 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 po­jawiają się w wywołaniu procedury lub funkcji.

Notacja opisowa Umożliwia kojarzenie wprowadzanych argumentów z wybra­nymi 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

Page 131: Kieszonkowy słownik

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 wykorzy­stują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ę pozycyj­ną, natomiast obsługę notacji opisowej i mieszanej wprowadzono dopiero w systemie Oracle Database I l g.

Programy lokalne

Programem lokalnym nazywamy procedurę lub funkcję zdefinio­waną w sekcji deklaracji bloku PL/SQL-owego. Deklaracje programów lokalnych muszą pojawiać się na końcu sekcji dekla­racji, 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

Page 132: Kieszonkowy słownik

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 identycz­nych nazwach. Mechanizm ten nosi nazwę przeładowania. Pro­gramy 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

Page 133: Kieszonkowy słownik

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 boolow­skie).

• Programy muszą być odmiennych rodzajów (np. procedura i funkcja o identycznych nazwach oraz identycznych zesta­wach 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 para­metrów (IN, OUT lub IN OUT).

Poczynając od wersji Oracle Database ! Og, możliwe jest definio­wanie 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

Page 134: Kieszonkowy słownik

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

Page 135: Kieszonkowy słownik

Funkcje tabelowe

Funkcje tabelowe mogą wchodzić w skład klauzuli FROM w zapytaniu SQL-owym, tak jak gdyby były pełnoprawnymi tabe­lami 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 pozio­mie schematu.

Szczególną odmianą funkcji tabelowych są tzw. funkcje poto­kowe, 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

Page 136: Kieszonkowy słownik

wchodzi w skład obszaru SGA i jest dostępna dla wszystkich sesji korzystających z danej funkcji . Związana z nią klauzula RE­SULT _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 wymaza­nie 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 rezul­tató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

Page 137: Kieszonkowy słownik

• nie zawiera parametrów typu BLOB, CLOB, NCLOB i REF CURSOR, a także parametrów będących obiektami lub kurso­ranu,

• jej rezultat nie jest typu BLOB, CLOB, NCLOB, REF CUR­SOR 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 elektro­nicznej - polecenia te mogą bowiem nie zostać wykonane (ich wykonanie zależy od dostępności w pamięci podręcznej rezulta­tów dla określonego zbioru argumentów funkcji).

Pamięć podręczna rezultatów stanowi cenne narzędzie optymali­zacji 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 klu­czowe RESULT_CACHE musi znajdować się zarówno w specy­fikacji pakietu, jak i. w jego ciele, natomiast klauzula RELIES_ON - wyłacznie w ciele pakietu:

Procedury i funkcje I 137

Page 138: Kieszonkowy słownik

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 uwie­rzytelniania. Pierwszym z nich są uprawnienia twórcy: ich zasto­sowanie 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ń odziedzi­czone z roli) .

Uprawnienia osoby wywołującej powodują uruchomienie pro­gramu 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

Page 139: Kieszonkowy słownik

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

Page 140: Kieszonkowy słownik

[ 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 wybra­nych kolumn.

DELETE Usunięcie wiersza z tabeli lub perspektywy. Nie obejmuje operacji TRUNCATE.

AL TER Zmiana obiektu bazodanowego za pomocą polece­nia AL TER. Obiektem jest każdy element wymienio­ny w perspektywie ALL_OBJECTS (m.in. pakiety oraz tabele). Zdarzenie może obejmować pojedyn­czy 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 bazoda­nowego.

AUDIT Uaktywnienie audytu bazy danych.

140 I Oracle PL/SQ:L. Kieszonkowy słownik języka

Page 141: Kieszonkowy słownik

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 bazoda­nowego.

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

Page 142: Kieszonkowy słownik

Nazwa zdanenia

STARTUP

SHUTDOWN

SUSPEND

Opis

Otwarcie ł>azy danych. Dopuszczalne są wylącmie wyzwalacze AFTER STARTUP.

Zamknięcie ł>azy danych. Dopuszczalne są wyłącz­nie 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ń wcho­dzą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 wy­zwalaczach 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 wyzwa­lacza w odpowiedzi na dane zdarzenie).

142 I Oracle PL/SQ:L. Kieszonkowy słownik języka

Page 143: Kieszonkowy słownik

W wersjach systemu Oracle Database starszych niż I lg, przypisa­nie 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 nieak­tywnego - 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 przy­kł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. De­zaktywacja wyzwalacza wymaga skorzystania z polecenia ALTER:

Wyzwalacze 143

Page 144: Kieszonkowy słownik

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 (wpro­wadzenie 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

Page 145: Kieszonkowy słownik

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 modyfiko­wać 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ń DML­owych (maksymalnie 4) w pojedynczym programie. Wyzwalacze złożone umożliwiają współdzielenie elementów kodu (np. pod­programó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

Page 146: Kieszonkowy słownik

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

Page 147: Kieszonkowy słownik

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, DISASSO­CIATE, DROP, GRANT, NOAUDIT, RENAME, REVOKE oraz TRUNCATE. Wyzwalacze DOL mogą obejmować pojedynczy schemat lub całą bazę danych.

Wyzwalacze 147

Page 148: Kieszonkowy słownik

Zdarzenia bazodanowe Do zdarzeń bazodanowych zaliczamy SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN oraz SUSPEND. W przy­padku 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 SHUT­DOWN 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), gwaran­tuje trwałość (persi.wence) obiektów między transakcjami i zwięk­sza 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 wcho­dzić opcjonalna sekcja inicjalizacji.

148 I Oracle PL/SQ:L. Kieszonkowy słownik języka

Page 149: Kieszonkowy słownik

Jeżeli specyfikacja pakietu nie zawiera żadnych procedur ani funkcji i nie trzeba definiować w nim żadnych obiektów prywat­nych, 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

Page 150: Kieszonkowy słownik

nywana tylko raz - w chwili pierwszego odwołania do jakiego­kolwiek obiektu pakietu w ramach danej sesji.

Specyfikacja musi poprzedzać ciało pakietu. Uprawnienie EXE­CUTE 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

Page 151: Kieszonkowy słownik

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 pro­gramami set i get, służącymi do operowania na ich warto­ściach.

Pakiety I 151

Page 152: Kieszonkowy słownik

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 wykorzystywa­nych równolegle przez bardzo wielu użytkowników. Przy do­myś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

Page 153: Kieszonkowy słownik

wszystkie sesje dysponujące uprawnieniem EXECUTE dla dane­go 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ąt­kó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

Page 154: Kieszonkowy słownik

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ól­nej 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że­nia zawarte w nim funkcje będą obserwowały ten sam, spójny stan bazy danych. Uniknięcie opisywanego problemu wymaga posłuże­nia 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

Page 155: Kieszonkowy słownik

[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 programi­stę, tablic asocjacyjnych itp.)

• Wszystkie wersje systemu Oracle obsługują notację pozy­cyjną, 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

Page 156: Kieszonkowy słownik

• Funkcja musi być zapisana w bazie danych (nie można wczy­tać 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), opi­sują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

Page 157: Kieszonkowy słownik

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 zadeklaro­wanych 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 proce­dury). Typy obiektowe umożliwiają programistom wykorzysty­wanie mechanizmów programowania obiektowego w programach PUSQL-owych oraz w definicjach tabel i kolumn. Aby możliwe

Mechanizmy obiektowe I 157

Page 158: Kieszonkowy słownik

stało się wykorzystanie danego typu obiektowego w programie PUSQL-owym, należy najpierw zadeklarować go w bazie da­nych.

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

Page 159: Kieszonkowy słownik

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ąt­kiem typów LONG , LONG RAW, ROWID oraz UROWID. W deklaracjach atrybutów można korzystać z innych typów obiek­towych 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ów­nawczą (ORDER lub MAP), umożliwiającą porównywanie obiek­tó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

Page 160: Kieszonkowy słownik

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 macierzy­stego). Baza danych nie zawiera żadnego „typu najwyższego poziomu" - każdy typ jest samodzielny, chyba że w jego specyfi­kacji 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 obiek­towe są domyślnie deklarowane jako FINAL, co wyklucza dzie­dziczenie).

160 Oracle PL/SQ:L. Kieszonkowy słownik języka

Page 161: Kieszonkowy słownik

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 INSTAN­TIABLE, co umożliwia deklarowanie obiektów tego typu. Uzu­peł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 sta­tyczne, 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 meto­dy 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

Page 162: Kieszonkowy słownik

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 niesta­tycznym metodom konstruktorów towarzyszy domyślny parametr SELF, który określa bieżącą instancję typu obiektowego. Do­myś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

Page 163: Kieszonkowy słownik

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

Page 164: Kieszonkowy słownik

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 przy­kł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 zwra­ca wartość skalarną (np. DATE, NUMBER lub V ARCHAR2), dla której baza danych dysponuje sekwencją porządkującą. Rola fun­kcji MAP polega na odwzorowaniu każdego obiektu danego typu na wybraną wartość skalarną.

164 Oracle PL/SQ:L. Kieszonkowy słownik języka

Page 165: Kieszonkowy słownik

Jeżeli w ramach typu obiektowego nie zdefiniujemy żadnej funk­cji 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 defini­cji 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

Page 166: Kieszonkowy słownik

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ładowy­wanie 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 meto­dy 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 podda­wać go dziedziczeniu).

• Wszystkie podtypy typu jedzen i e_t muszą zawierać imple­mentację funkcj i cena lub też ponownie deklarować tę funkcję jako NOT INST ANTIABLE.

System Oracle obsługuje tzw. polimorfizm dynamiczny, umożli­wiający określenie, którą z wersji przeładowanej metody należy wywołać w razie natrafienia w kodzie na jej identyfikator. Do­myś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

Page 167: Kieszonkowy słownik

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 war­tość 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

Page 168: Kieszonkowy słownik

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łado­wego typu jedzeni e_t:

168 Oracle PL/SQ:L. Kieszonkowy słownik języka

Page 169: Kieszonkowy słownik

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 ma­cierzystego (lub potomnego) względem typu, który reprezentuje dany obiekt. Operator TREAT nie umożliwia rzu towania obiek­tó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

Page 170: Kieszonkowy słownik

Dostęp do metod i atrybutów rzu towanego obiektu mozna uzy­skiwać, 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 zmien­nej 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

Page 171: Kieszonkowy słownik

Wbudowany pakiet UTL_REF zawiera szereg programów u ła­

twiających operacje na wskaźnikach oraz dostęp do wskazywa­nych 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

Page 172: Kieszonkowy słownik

torów wierszy (ROWID), rzadko zdarza się, by zachodziła ko­nieczność 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

Page 173: Kieszonkowy słownik

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 konse­kwencje dla obiektów zapisanych w bazie - system Oracle wyma­ga 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 dodat­kowy 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

Page 174: Kieszonkowy słownik

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 ogranicze­niom: 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 kaska­dowego 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

Page 175: Kieszonkowy słownik

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 opty­malizacji 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 za­chowaniu jego zestawu uprawnień.

AUTHID Decyduje, czy dany program ma zostać uruchomiony z upraw­nieniami 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 funk­cji. Funkcja jest uznawana za deterministyczną, jeśli dla da­nego zbioru argumentów zawsze zwraca tę samą wartość.

Funkcje deterministyczne nie mogą zależeć od zawartości ba­zy danych. Przykładem funkcji deterministycznej jest wbudo­wana 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ównole­glona. Klauzula PARTITION BY dotyczy wyłącznie funkcji

Kompilacja I 175

Page 176: Kieszonkowy słownik

zawierających parametry wejściowe typu REF CURSOR i de­cyduje o sposobie partycjonowania (podziału zbioru danych wejściowych na podzbiory).

PIPELINED Opcja PIPELINED informuje kompilator, że mamy do czynie­nia z funkcją potokową, której rezultaty są zwracane w sposób interaktywny za pośrednictwem polecenia PIPE ROW. Funk­cje 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 pro­gramu (na podstawie konfiguracji sesji lub serwera bazy danych), zaś ich zmiana wymaga rekompilacji kodu. Baza danych prze­chowuje 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ść, zawiera­ją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 in­terpretowany oraz natywny - odpowiednio INTERPRETED

176 Oracle PL/SQ:L. Kieszonkowy słownik języka

Page 177: Kieszonkowy słownik

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. Do­puszczalne 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 dzia­le 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 wyko­rzystują 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 proce­dury (przy zachowaniu bieżących ustawień) wymaga wydania następującego polecenia:

ALTER PROCEOURE moj.a_procedura COHPI LE REUSE SETTINGS;

Kompilacja I 177

Page 178: Kieszonkowy słownik

Zapisane parametry kompilacji są widoczne w perspektywie USER_PLSQL_OBJECT_SEITINGS.

Kompilacja warunkowa Mechanizm kompilacji warunkowej został wprowadzony w syste­mie 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

Page 179: Kieszonkowy słownik

(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 kom­pilacji 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

Page 180: Kieszonkowy słownik

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 ano­nimowych 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 pa­kietu.

Kompilator PU SQL-a wczytuje i interpretuje powyższe dyrek­tywy podczas generowania kodu. Aby poznać ostateczną zawar­tość 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

Page 181: Kieszonkowy słownik

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 inicjalizacyj­nego PLSQL_ W ARNINGS. Można to zrobić globalnie, modyfi­kując plik SP FILE, lub na czas trwania bieżącej sesji (za pomocą polecenia AL TER_SESSION); można też posłużyć się wbudowa­nym pakietem DBMS_ WARNING.

Parametr PLSQL_ W ARNINGS zawiera listę wartości (rozdzielo­nych 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

Page 182: Kieszonkowy słownik

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 ozna­czyć 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

Page 183: Kieszonkowy słownik

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

Page 184: Kieszonkowy słownik

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

Page 185: Kieszonkowy słownik

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ę inicjali­zacyjną, wymuszającą odpowiednią kolejność inicjalizacji pakie­tó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 pod­program nie musi być wczytywany w chwili uruchomienia aplika­cji). 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 wy­branej sesji (polecenie ALTER SESSION). Poniżej przedstawiono jej dopuszczalne wartości:

O Brak optymalizacji

I Optymalizacja podstawowa (ro.in. eliminowanie nieosiągalne­go kodu lub wyjątków, które nigdy nie mogą wystąpić).

Kompilacja 185

Page 186: Kieszonkowy słownik

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

Page 187: Kieszonkowy słownik

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 pole­cenia 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

Page 188: Kieszonkowy słownik

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 po­przez odszukanie nowo utworzonej biblioteki w systemie pli­ków serwera.

System Oracle Datab ase 1 Og

System Oracle Database I Og znacząco upraszcza proces kompila­cji natywnej: zamiast w zewnętrznych bibliotekach, skompilo­wane 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ługiwane­go 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ółdzie­lonych 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

Page 189: Kieszonkowy słownik

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 parame­tru PLSQL_NAT IVE_LIBRARY _DIR (systemy LiJJux i Win­dows 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

Page 190: Kieszonkowy słownik

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ą inten­sywną komunikację z bazą danych, oraz Javę w aplikacjach wy­magających dużej mocy obliczeniowej. Aby zarejestrować w sys­temie 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ę cu­dzymi programami, o ile spełniają one dwa warunki: metody dostępne z poziomu kodu PUSQL i SQL muszą zostać zade­klarowane 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 pro­cedur, wówczas naj lepiej posłużyć się interfejsami JDBC i SQU . Szczegółowy opis tych interfejsów wykracza poza te­matykę 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

Page 191: Kieszonkowy słownik

2. Gdy już dysp01rnjemy klasą języka Java (w postaci kodu źródłowego lub pliku .class), należy umieścić ją w bazie da­nych. 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 - opa­kować 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 EXE­CUTE. 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 argu­ment:

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ć wczy­tany bezpośrednio do bazy danych, co wiąże się z jego automa­tyczną 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

Page 192: Kieszonkowy słownik

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

Page 193: Kieszonkowy słownik

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 stosun­kowo 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 obiek­tó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 samodziel­nych 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 wy­woł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

Page 194: Kieszonkowy słownik

wana jako zamiennik ciała podprogramu). Podobna sytuacja ma miejsce w przypadku typów obiektowych: specyfikacja wywoła­nia JSP może zastępować specyfikację metody obiektu lub też jego ciało.

Zauważmy, że typowe funkcje języka Java są zazwyczaj odwzo­rowywane 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 odwzo­rowaniu argumentów PUSQL-owych na parametry widziane z poziomu języka Java wychodzą na jaw dopiero w trakcie działa­ma programu .

Słownik danych

Aby dowiedzieć się, które elementy bieżącego schematu korzy­stają z implementacji w języku Java, należy odszukać w perspek­tywie 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

Page 195: Kieszonkowy słownik

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

Page 196: Kieszonkowy słownik

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

Page 197: Kieszonkowy słownik

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

Page 198: Kieszonkowy słownik

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 pmgrami­stę, 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

Page 199: Kieszonkowy słownik

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

Page 200: Kieszonkowy słownik

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

Page 201: Kieszonkowy słownik

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