Oracle8. Programowanie w języku PL/SQL

36
Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: [email protected] PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ IDZ DO IDZ DO ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG KATALOG KSI¥¯EK KATALOG KSI¥¯EK TWÓJ KOSZYK TWÓJ KOSZYK CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW CENNIK ZAMÓW CENNI K CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE SPIS TRECI SPIS TRECI DODAJ DO KOSZYKA DODAJ DO KOSZYKA KATALOG ONLINE KATALOG ONLINE Oracle8. Programowanie w jêzyku PL/SQL Autor: Scott Urman T³umaczenie: Tomasz Pêdziwiatr, Grzegorz Stawikowski, Cezary Welsyng ISBN: 83-7197-533-3 Tytu³ orygina³u: Oracle8 PL/SQL Programming Format: B5, stron: 762 Wykorzystanie wbudowanego w system Oracle jêzyka PL/SQL w znacz¹cy sposób powiêksza potencja³ programisty systemów bazodanowych. PL/SQL ³¹czy w sobie du¿e mo¿liwoci i elastycznoæ jêzyka czwartej generacji (4GL) SQL z konstrukcjami proceduralnymi jêzyka trzeciej generacji (3GL). Programy napisane w tym jêzyku umo¿liwiaj¹ obs³ugê danych zarówno w samym systemie Oracle, jak i w zewnêtrznych aplikacjach. Ksi¹¿ka „Oracle8. Programowanie w jêzyku PL/SQL” to wyczerpuj¹ce omówienie jêzyka PL/SQL. To doskona³a pozycja u³atwiaj¹ca naukê tego jêzyka, wietnie te¿ sprawdza siê jako podrêczne kompendium wiedzy o PL/SQL, pomocne w codziennej pracy. Liczne przyk³ady uzupe³niaj¹ informacje zawarte w ksi¹¿ce pokazuj¹c sprawdzone metody rozwi¹zywania problemów, napotykanych przez programistów. W ksi¹¿ce omówiono miêdzy innymi: • Podstawy jêzyka PL/SQL: struktura programu, zmienne, typy, wyra¿enia i operatory oraz instrukcje steruj¹ce • Korzystanie z rekordów i tabel • Korzystanie z SQL z poziomu PL/SQL, funkcje SQL dostêpne w PL/SQL • Tworzenie i u¿ywanie kursorów • Bloki w PL/SQL: podprogramy (procedury i funkcje), pakiety i wyzwalacze • Metody obs³ugi b³êdów w PL/SQL • Obiekty w PL/SQL, kolekcje • Testowanie i wykrywanie b³êdów • Zagadnienia zaawansowane: dynamiczny PL/SQL, komunikacja miêdzy sesjami, kolejkowanie, obs³uga zadañ, procedury zewnêtrzne • Optymalizacja aplikacji PL/SQL i metody zapewnienia maksymalnej wydajnoci Ksi¹¿ka jest przeznaczona zarówno dla dowiadczonych programistów, jak i tych, którzy jeszcze nie poznali innych jêzyków trzeciej generacji. Przydatna, choæ niekonieczna, jest ogólna znajomoæ systemu Oracle (³¹czenie siê i korzystanie z bazy danych, podstawy jêzyka SQL, itp.).

description

Wykorzystanie wbudowanego w system Oracle języka PL/SQL w znaczący sposób powiększa potencjał programisty systemów bazodanowych. PL/SQL łączy w sobie duże możliwości i elastyczność języka czwartej generacji (4GL) SQL z konstrukcjami proceduralnymi języka trzeciej generacji (3GL). Programy napisane w tym języku umożliwiają obsługę danych zarówno w samym systemie Oracle, jak i w zewnętrznych aplikacjach.Książka "Oracle8. Programowanie w języku PL/SQL" to wyczerpujące omówienie języka PL/SQL. To doskonała pozycja ułatwiająca naukę tego języka, świetnie też sprawdza się jako podręczne kompendium wiedzy o PL/SQL, pomocne w codziennej pracy. Liczne przykłady uzupełniają informacje zawarte w książce pokazując sprawdzone metody rozwiązywania problemów, napotykanych przez programistów. W książce omówiono między innymi: * Podstawy języka PL/SQL: struktura programu, zmienne, typy, wyrażenia i operatory oraz instrukcje sterujące * Korzystanie z rekordów i tabel * Korzystanie z SQL z poziomu PL/SQL, funkcje SQL dostępne w PL/SQL * Tworzenie i używanie kursorów * Bloki w PL/SQL: podprogramy (procedury i funkcje), pakiety i wyzwalacze * Metody obsługi błędów w PL/SQL * Obiekty w PL/SQL, kolekcje * Testowanie i wykrywanie błędów * Zagadnienia zaawansowane: dynamiczny PL/SQL, komunikacja między sesjami, kolejkowanie, obsługa zadań, procedury zewnętrzne * Optymalizacja aplikacji PL/SQL i metody zapewnienia maksymalnej wydajnościKsiążka jest przeznaczona zarówno dla doświadczonych programistów, jak i tych, którzy jeszcze nie poznali innych języków trzeciej generacji. Przydatna, choć niekonieczna, jest ogólna znajomość systemu Oracle (łączenie się i korzystanie z bazy danych, podstawy języka SQL, itp.).Poznaj język PL/SQL i wykorzystaj wszystkie możliwości systemu Oracle.

Transcript of Oracle8. Programowanie w języku PL/SQL

Page 1: Oracle8. Programowanie w języku PL/SQL

Wydawnictwo Helion

ul. Chopina 6

44-100 Gliwice

tel. (32)230-98-63

e-mail: [email protected]

PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£

IDZ DOIDZ DO

ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG

KATALOG KSI¥¯EKKATALOG KSI¥¯EK

TWÓJ KOSZYKTWÓJ KOSZYK

CENNIK I INFORMACJECENNIK I INFORMACJE

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW CENNIKZAMÓW CENNIK

CZYTELNIACZYTELNIA

FRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE

SPIS TRE�CISPIS TRE�CI

DODAJ DO KOSZYKADODAJ DO KOSZYKA

KATALOG ONLINEKATALOG ONLINE

Oracle8.Programowaniew jêzyku PL/SQLAutor: Scott Urman

T³umaczenie: Tomasz Pêdziwiatr, Grzegorz Stawikowski,

Cezary Welsyng

ISBN: 83-7197-533-3

Tytu³ orygina³u: Oracle8 PL/SQL Programming

Format: B5, stron: 762

Wykorzystanie wbudowanego w system Oracle jêzyka PL/SQL w znacz¹cy sposób

powiêksza potencja³ programisty systemów bazodanowych. PL/SQL ³¹czy w sobie du¿e

mo¿liwo�ci i elastyczno�æ jêzyka czwartej generacji (4GL) SQL z konstrukcjami

proceduralnymi jêzyka trzeciej generacji (3GL). Programy napisane w tym jêzyku

umo¿liwiaj¹ obs³ugê danych zarówno w samym systemie Oracle, jak i w zewnêtrznych

aplikacjach.

Ksi¹¿ka „Oracle8. Programowanie w jêzyku PL/SQL” to wyczerpuj¹ce omówienie jêzyka

PL/SQL. To doskona³a pozycja u³atwiaj¹ca naukê tego jêzyka, �wietnie te¿ sprawdza

siê jako podrêczne kompendium wiedzy o PL/SQL, pomocne w codziennej pracy.

Liczne przyk³ady uzupe³niaj¹ informacje zawarte w ksi¹¿ce pokazuj¹c sprawdzone

metody rozwi¹zywania problemów, napotykanych przez programistów.

W ksi¹¿ce omówiono miêdzy innymi:

• Podstawy jêzyka PL/SQL: struktura programu, zmienne, typy, wyra¿enia

i operatory oraz instrukcje steruj¹ce

• Korzystanie z rekordów i tabel

• Korzystanie z SQL z poziomu PL/SQL, funkcje SQL dostêpne w PL/SQL

• Tworzenie i u¿ywanie kursorów

• Bloki w PL/SQL: podprogramy (procedury i funkcje), pakiety i wyzwalacze

• Metody obs³ugi b³êdów w PL/SQL

• Obiekty w PL/SQL, kolekcje

• Testowanie i wykrywanie b³êdów

• Zagadnienia zaawansowane: dynamiczny PL/SQL, komunikacja miêdzy sesjami,

kolejkowanie, obs³uga zadañ, procedury zewnêtrzne

• Optymalizacja aplikacji PL/SQL i metody zapewnienia maksymalnej wydajno�ci

Ksi¹¿ka jest przeznaczona zarówno dla do�wiadczonych programistów, jak i tych,

którzy jeszcze nie poznali innych jêzyków trzeciej generacji. Przydatna, choæ

niekonieczna, jest ogólna znajomo�æ systemu Oracle (³¹czenie siê i korzystanie z bazy

danych, podstawy jêzyka SQL, itp.).

Page 2: Oracle8. Programowanie w języku PL/SQL

Spis treści

Wstęp ...................................................................................................17

Rozdział 1. Wprowadzenie do PL/SQL......................................................................23Dlaczego język PL/SQL?..........................................................................................................23

Model klient-serwer............................................................................................................25Normy.................................................................................................................................26

Właściwości języka PL/SQL ....................................................................................................26Struktura bloku ...................................................................................................................26Zmienne i typy danych .......................................................................................................27Konstrukcje pętlowe ...........................................................................................................28

Konwencje stosowane w niniejszej książce..............................................................................30Wersje języka PL/SQL oraz bazy danych Oracle...............................................................30Dokumentacja Oracle .........................................................................................................31Kod dostępny na płycie CD................................................................................................32

Przykładowe tabele ...................................................................................................................32Podsumowanie ..........................................................................................................................38

Rozdział 2. Podstawy języka PL/SQL .......................................................................39Blok PL/SQL.............................................................................................................................39

Podstawowa struktura bloku...............................................................................................42Jednostki leksykalne .................................................................................................................44

Identyfikatory .....................................................................................................................44Ograniczniki .......................................................................................................................46Literały................................................................................................................................48Komentarze.........................................................................................................................49

Deklaracje zmiennych...............................................................................................................51Składnia deklaracji..............................................................................................................51Inicjowanie zmiennych.......................................................................................................52

Typy danych w języku PL/SQL................................................................................................53Typy skalarne......................................................................................................................53Typy złożone ......................................................................................................................60Typy odwołania ..................................................................................................................60Typy LOB...........................................................................................................................60Wykorzystanie atrybutu %Type .........................................................................................61Podtypy definiowane przez użytkownika...........................................................................62Konwersja pomiędzy typami danych..................................................................................62Zakres i widoczność zmiennej............................................................................................64

Wyrażenia i operatory...............................................................................................................65Przypisanie..........................................................................................................................66Wyrażenia ...........................................................................................................................67

Page 3: Oracle8. Programowanie w języku PL/SQL

6 Oracle8. Programowanie w języku PL/SQL

Struktury sterowania PL/SQL...................................................................................................69Instrukcja IF-THEN-ELSE.................................................................................................70Pętle ....................................................................................................................................73Instrukcje GOTO oraz etykiety ..........................................................................................77Dyrektywy pragma .............................................................................................................80

Styl programowania w języku PL/SQL ....................................................................................80Wprowadzanie komentarzy ................................................................................................81Nazywanie zmiennych........................................................................................................82Stosowanie dużych liter ......................................................................................................82Odstępy w kodzie programu...............................................................................................82Ogólne uwagi dotyczące stylu programowania..................................................................83

Podsumowanie ..........................................................................................................................83

Rozdział 3. Rekordy i tabele ....................................................................................85Rekordy w języku PL/SQL.......................................................................................................85

Przypisanie rekordu ............................................................................................................86Stosowanie operatora %ROWTYPE ..................................................................................88

Tabele........................................................................................................................................88Tabele a tablice ...................................................................................................................89Atrybuty tabeli ....................................................................................................................91Wytyczne stosowania tabel PL/SQL ..................................................................................94

Podsumowanie ..........................................................................................................................95

Rozdział 4. SQL w PL/SQL.......................................................................................97Instrukcje SQL ..........................................................................................................................97

Wykorzystanie instrukcji SQL w języku PL/SQL..............................................................98Stosowanie instrukcji DML w języku PL/SQL ........................................................................99

Instrukcja SELECT...........................................................................................................101Instrukcja INSERT ...........................................................................................................102Instrukcja UPDATE..........................................................................................................104Instrukcja DELETE ..........................................................................................................104Klauzula WHERE.............................................................................................................105Odwołania do tabel ...........................................................................................................108Powiązania bazy danych...................................................................................................109Synonimy..........................................................................................................................110

Pseudokolumny.......................................................................................................................110Pseudokolumny CURRVAL oraz NEXTVAL.................................................................110Pseudokolumna LEVEL ...................................................................................................111Pseudokolumna ROWID ..................................................................................................111Pseudokolumna ROWNUM.............................................................................................112

Instrukcje GRANT i REVOKE. Uprawnienia........................................................................112Uprawnienia obiektowe a uprawnienia systemowe..........................................................113Instrukcje GRANT oraz REVOKE ..................................................................................113Role...................................................................................................................................115

Sterowanie transakcjami .........................................................................................................116Instrukcja COMMIT a instrukcja ROLLBACK...............................................................116Punkty zachowania ...........................................................................................................118Transakcje a bloki.............................................................................................................119

Podsumowanie ........................................................................................................................120

Rozdział 5. Wbudowane funkcje SQL......................................................................121Wstęp ......................................................................................................................................121Funkcje znakowe zwracające wartości znakowe ....................................................................122

CHR ..................................................................................................................................122CONCAT..........................................................................................................................122

Page 4: Oracle8. Programowanie w języku PL/SQL

Spis treści 7

INITCAP...........................................................................................................................123LOWER ............................................................................................................................123LPAD................................................................................................................................124LTRIM..............................................................................................................................125NLS_INITCAP.................................................................................................................125NLS_LOWER...................................................................................................................126NLS_UPPER ....................................................................................................................126REPLACE.........................................................................................................................127RPAD................................................................................................................................128RTRIM..............................................................................................................................128SOUNDEX .......................................................................................................................129SUBSTR ...........................................................................................................................130SUBSTRB.........................................................................................................................131TRANSLATE...................................................................................................................131UPPER..............................................................................................................................132

Funkcje znakowe zwracające wartości liczbowe....................................................................133ASCII................................................................................................................................133INSTR...............................................................................................................................133INSTRB ............................................................................................................................134LENGTH ..........................................................................................................................135LENGTHB........................................................................................................................135NLSSORT.........................................................................................................................136

Funkcje numeryczne ...............................................................................................................136ABS...................................................................................................................................136ACOS................................................................................................................................137ASIN.................................................................................................................................137ATAN ...............................................................................................................................138ATAN2 .............................................................................................................................138CEIL .................................................................................................................................139COS...................................................................................................................................139COSH................................................................................................................................140EXP...................................................................................................................................140FLOOR .............................................................................................................................140LN.....................................................................................................................................141LOG ..................................................................................................................................141MOD.................................................................................................................................142POWER ............................................................................................................................142ROUND............................................................................................................................143SIGN.................................................................................................................................143SIN....................................................................................................................................144SINH.................................................................................................................................144SQRT ................................................................................................................................144TAN ..................................................................................................................................145TANH ...............................................................................................................................145TRUNC.............................................................................................................................146

Funkcje związane z datą .........................................................................................................146ADD_MONTHS...............................................................................................................146LAST_DAY......................................................................................................................147MONTHS_BETWEEN ....................................................................................................147NEW_TIME .....................................................................................................................148NEXT_DAY.....................................................................................................................149ROUND............................................................................................................................149SYSDATE ........................................................................................................................150TRUNC.............................................................................................................................151

Page 5: Oracle8. Programowanie w języku PL/SQL

8 Oracle8. Programowanie w języku PL/SQL

Funkcje dokonujące konwersji................................................................................................152CHARTOROWID ............................................................................................................152CONVERT .......................................................................................................................153HEXTORAW ...................................................................................................................153RAWTOHEX ...................................................................................................................154ROWIDTOCHAR ............................................................................................................154TO_CHAR(daty) ..............................................................................................................155TO_CHAR(etykiety) ........................................................................................................155TO_CHAR(liczba)............................................................................................................157TO_DATE ........................................................................................................................159TO_LABEL ......................................................................................................................159TO_MULTI_BYTE..........................................................................................................160TO_NUMBER..................................................................................................................160TO_SINGLE_BYTE ........................................................................................................161

Funkcje grupowe.....................................................................................................................161AVG..................................................................................................................................161COUNT.............................................................................................................................162GLB ..................................................................................................................................163LUB ..................................................................................................................................163MAX.................................................................................................................................163MIN...................................................................................................................................164STDDEV...........................................................................................................................164SUM..................................................................................................................................165VARIANCE......................................................................................................................165

Inne funkcje.............................................................................................................................166BFILENAME ...................................................................................................................166DECODE ..........................................................................................................................166DUMP...............................................................................................................................167EMPTY_CLOB/EMPTY_BLOB.....................................................................................169GREATEST......................................................................................................................169GREATEST_LB...............................................................................................................170LEAST..............................................................................................................................170LEAST_UB ......................................................................................................................170NVL ..................................................................................................................................171UID ...................................................................................................................................171USER ................................................................................................................................172USERENV........................................................................................................................172VSIZE...............................................................................................................................173

PL/SQL w działaniu. Drukowanie liczb w postaci tekstowej.................................................174Podsumowanie ........................................................................................................................180

Rozdział 6. Kursory ...............................................................................................181Czym jest kursor?....................................................................................................................181

Przetwarzanie kursorów jawnych .....................................................................................182Przetwarzanie kursorów niejawnych ................................................................................189

Pętle pobierania danych kursora .............................................................................................191Pętle proste........................................................................................................................191Pętle WHILE ....................................................................................................................193Pętle FOR kursora.............................................................................................................194Wyjątek NO_DATA_FOUND kontra atrybut %NOTFOUND .......................................195Kursory z klauzulą FOR UPDATE instrukcji SELECT...................................................196

Zmienne kursora .....................................................................................................................199Deklaracja zmiennej kursora ............................................................................................200Przydzielenie obszaru pamięci dla zmiennych kursora ....................................................201Otwieranie zmiennej kursora dla zapytania......................................................................202

Page 6: Oracle8. Programowanie w języku PL/SQL

Spis treści 9

Zamykanie zmiennych kursora.........................................................................................203Pierwszy przykład zmiennej kursora ................................................................................203Drugi przykład zmiennej kursora .....................................................................................205Ograniczenia użycia zmiennych kursora ..........................................................................206

Podsumowanie ........................................................................................................................207

Rozdział 7. Podprogramy: procedury i funkcje ........................................................209Tworzenie procedur i funkcji ..................................................................................................209

Tworzenie procedury ........................................................................................................210Tworzenie funkcji .............................................................................................................221Wyjątki wywoływane wewnątrz podprogramów .............................................................224Usuwanie procedur i funkcji.............................................................................................226

Położenie podprogramów .......................................................................................................226Składowane podprogramy oraz słownik danych ..............................................................226Podprogramy lokalne........................................................................................................228

Zależności dotyczące podprogramów.....................................................................................231Określanie zależności .......................................................................................................233

Uprawnienia i podprogramy składowane ...............................................................................236Uprawnienie EXECUTE ..................................................................................................236Składowane podprogramy i role .......................................................................................237

Podsumowanie ........................................................................................................................239

Rozdział 8. Pakiety ...............................................................................................241Pakiety.....................................................................................................................................241

Specyfikacja pakietu.........................................................................................................241Ciało pakietu.....................................................................................................................243Pakiety i zakres .................................................................................................................245Przeciążenie podprogramów pakietowych .......................................................................246Inicjalizacja pakietu ..........................................................................................................247Pakiety i zależności...........................................................................................................249

Stosowanie składowanych funkcji w instrukcjach SQL.........................................................251Poziomy czystości ............................................................................................................252Parametry domyślne .........................................................................................................256

PL/SQL w działaniu — Eksporter schematów PL/SQL.........................................................256Podsumowanie ........................................................................................................................264

Rozdział 9. Wyzwalacze.........................................................................................265Tworzenie wyzwalaczy...........................................................................................................265

Komponenty wyzwalacza.................................................................................................267Wyzwalacze i słownik danych..........................................................................................270Kolejność uruchamiania wyzwalaczy...............................................................................272Stosowanie wartości :old oraz :new w wyzwalaczach na poziomie wiersza ...................273Korzystanie z predykatów wyzwalacza: INSERTING, UPDATING oraz DELETING.....276

Tabele mutujące ......................................................................................................................278Przykład tabeli mutującej .................................................................................................280Rozwiązanie problemu błędu tabeli mutującej.................................................................281

PL/SQL w działaniu — wdrażanie techniki kaskadowego uaktualniania ..............................283Program narzędziowy kaskadowego uaktualniania..........................................................285Działanie pakietu kaskadowego uaktualniania .................................................................288

Podsumowanie ........................................................................................................................292

Rozdział 10. Obsługa błędów ...................................................................................293Zdefiniowanie wyjątku ...........................................................................................................293

Deklarowanie wyjątków ...................................................................................................295Wywoływanie wyjątków ..................................................................................................298Obsługa wyjątków ............................................................................................................299

Page 7: Oracle8. Programowanie w języku PL/SQL

10 Oracle8. Programowanie w języku PL/SQL

Dyrektywa pragma EXCEPTION_INIT ..........................................................................305Stosowanie funkcji RAISE_APPLICATION_ERROR ...................................................305

Propagacja wyjątków ..............................................................................................................308Wyjątki wywołane w sekcji wykonania ...........................................................................308Wyjątki wywołane w sekcji deklaracji .............................................................................310Wyjątki wywołane w sekcji wyjątków.............................................................................312

Wytyczne wyjątków................................................................................................................314Zakres wyjątków...............................................................................................................314Unikanie nieobsługiwanych wyjątków.............................................................................315Maskowanie lokalizacji błędu ..........................................................................................315

PL/SQL w działaniu — ogólny program obsługi błędów.......................................................316Podsumowanie ........................................................................................................................324

Rozdział 11. Obiekty ...............................................................................................325Wprowadzenie ........................................................................................................................325

Podstawy programowania obiektowego ...........................................................................325Obiektowo-relacyjne bazy danych ...................................................................................327

Typy obiektów ........................................................................................................................328Definiowanie typów obiektowych....................................................................................328Deklarowanie i inicjalizacja obiektów..............................................................................330Metody..............................................................................................................................332Zmiana i usuwanie typów.................................................................................................338Zależności między obiektami ...........................................................................................340

Obiekty w bazie danych..........................................................................................................340Położenie obiektów...........................................................................................................341Obiekty w instrukcjach DML ...........................................................................................344Metody MAP i ORDER....................................................................................................349

Podsumowanie ........................................................................................................................351

Rozdział 12. Kolekcje..............................................................................................353Tabele zagnieżdżone ...............................................................................................................353

Deklarowanie tabeli zagnieżdżonej ..................................................................................353Zagnieżdżone tabele w bazie danych ...............................................................................356Tabele zagnieżdżone a tabele indeksowe .........................................................................361

Tablice o zmiennym rozmiarze...............................................................................................361Deklarowanie tablicy o zmiennym rozmiarze ..................................................................362Tablice o zmiennym rozmiarze w bazie danych...............................................................363Tablice o zmiennym rozmiarze a tabele zagnieżdżone ....................................................365

Metody dla kolekcji ................................................................................................................366EXISTS.............................................................................................................................366COUNT.............................................................................................................................367LIMIT ...............................................................................................................................368FIRST i LAST ..................................................................................................................368NEXT i PRIOR.................................................................................................................369EXTEND ..........................................................................................................................369TRIM ................................................................................................................................371DELETE ...........................................................................................................................373

Podsumowanie ........................................................................................................................374

Rozdział 13. Środowiska wykonawcze PL/SQL.........................................................375Różne mechanizmy języka PL/SQL .......................................................................................375

Implikacje umieszczenia mechanizmu PL/SQL po stronie klienta ..................................377Mechanizm PL/SQL po stronie serwera .................................................................................378

Program SQL*Plus ...........................................................................................................378Prekompilatory Oracle......................................................................................................383

Page 8: Oracle8. Programowanie w języku PL/SQL

Spis treści 11

OCI ...................................................................................................................................389Program SQL-Station .......................................................................................................392

Mechanizm PL/SQL po stronie klienta...................................................................................396Przyczyny wykorzystywania mechanizmu PL/SQL po stronie klienta............................396Program Oracle Forms......................................................................................................397Program Procedure Builder ..............................................................................................399

Wrapper PL/SQL ....................................................................................................................401Wykonanie wrappera ........................................................................................................401Pliki wejścia i wyjścia ......................................................................................................402Sprawdzanie syntaktyki i semantyki ................................................................................402Wytyczne dla programu wrapper......................................................................................403

Podsumowanie ........................................................................................................................403

Rozdział 14. Testowanie i wykrywanie błędów..........................................................405Diagnostyka problemu ............................................................................................................405

Wytyczne wykrywania i usuwania błędów ......................................................................405Pakiet Debug służący do wykrywania i usuwania błędów...............................................407

Wstawianie do tabeli testowania.............................................................................................407Problem 1..........................................................................................................................407

Pakiet DBMS_OUTPUT ........................................................................................................415Składniki pakietu DBMS_OUTPUT ................................................................................416Problem 2..........................................................................................................................420

Programy PL/SQL służące do wykrywania i usuwania błędów.............................................426Program Procedure Builder.....................................................................................................426

Problem 3..........................................................................................................................426Program SQL-Station..............................................................................................................432

Problem 4..........................................................................................................................433Porównanie programów Procedure Builder i SQL-Station.....................................................437Metodyka programowania ......................................................................................................438

Programowanie modularne...............................................................................................438Projektowanie zstępujące..................................................................................................439Abstrakcja danych ............................................................................................................440

Podsumowanie ........................................................................................................................440

Rozdział 15. Dynamiczny PL/SQL ............................................................................441Wprowadzenie ........................................................................................................................441

Instrukcje SQL statyczne a instrukcje dynamiczne ..........................................................441Ogólny opis pakietu DBMS_SQL....................................................................................442

Wykonywanie instrukcji DML oraz DDL nie będących zapytaniami....................................446Otwieranie kursora............................................................................................................447Parsowanie instrukcji........................................................................................................447Wiązanie każdej zmiennej wejściowej .............................................................................448Wykonanie instrukcji........................................................................................................450Zamykanie kursora ...........................................................................................................450Przykład ............................................................................................................................451Wykonywanie instrukcji DDL..........................................................................................452Wykonywanie zapytań......................................................................................................453Parsowanie instrukcji........................................................................................................454Zdefiniowanie zmiennych wyjściowych ..........................................................................454Pobieranie wierszy............................................................................................................456Zwracanie wyników do zmiennych PL/SQL....................................................................456Przykład ............................................................................................................................458

Wykonywanie bloku PL/SQL.................................................................................................461Parsowanie instrukcji........................................................................................................461Pobranie wartości każdej zmiennej wyjściowej ...............................................................462

Page 9: Oracle8. Programowanie w języku PL/SQL

12 Oracle8. Programowanie w języku PL/SQL

Przykład ............................................................................................................................463Zastosowanie parametru out_value_size ..........................................................................465

PL/SQL w działaniu — wykonywanie dowolnych procedur składowanych .........................466Udoskonalenia pakietu DBMS_SQL w wydaniu PL/SQL 8.0 ...............................................472

Parsowanie dużych ciągów znaków instrukcji SQL.........................................................473Przetwarzanie tablicowe za pomocą pakietu DBMS_SQL ..............................................474Opisywanie listy instrukcji SELECT................................................................................478

Różne procedury .....................................................................................................................481Pobieranie danych typu LONG ........................................................................................481Dodatkowe funkcje obsługi błędów .................................................................................482

PL/SQL w działaniu — zapisywanie wartości typu LONG do pliku .....................................484Uprawnienia a pakiet DBMS_SQL.........................................................................................486

Uprawnienia wymagane dla pakietu DBMS_SQL...........................................................486Role a pakiet DBMS_SQL ...............................................................................................487

Porównanie pakietu DBMS_SQL z innymi metodami przetwarzania dynamicznego ...........487Opisywanie listy instrukcji SELECT................................................................................488Przetwarzanie tablicowe ...................................................................................................488Operacje dzielenia na części danych typu LONG ............................................................488Różnice interfejsów ..........................................................................................................489

Wskazówki i techniki..............................................................................................................489Ponowne zastosowanie kursorów.....................................................................................489Zezwolenia........................................................................................................................489Zawieszenia programu związane z operacjami DDL .......................................................490

Podsumowanie ........................................................................................................................490

Rozdział 16. Komunikacja między sesjami................................................................491Pakiet DBMS_PIPE ................................................................................................................491

Wysyłanie komunikatu .....................................................................................................495Odbieranie komunikatu ....................................................................................................496Tworzenie potoków i zarządzanie nimi............................................................................498Uprawnienia i bezpieczeństwo .........................................................................................500Ustanawianie protokołu komunikacji ...............................................................................501Przykład ............................................................................................................................503

Pakiet DBMS_ALERT ...........................................................................................................509Wysyłanie ostrzeżenia ......................................................................................................509Odbieranie ostrzeżenia......................................................................................................509Inne procedury ..................................................................................................................511Ostrzeżenia i słownik danych ...........................................................................................512

Porównanie pakietów DBMS_PIPE i DBMS_ALERT..........................................................514Podsumowanie ........................................................................................................................515

Rozdział 17. Zaawansowane kolejkowanie w Oracle.................................................517Wprowadzenie ........................................................................................................................517

Elementy systemu zaawansowanego kolejkowania .........................................................518Realizacja zaawansowanego kolejkowania ......................................................................520

Operacje na kolejkach.............................................................................................................520Typy pomocnicze..............................................................................................................521Operacja ENQUEUE........................................................................................................525Operacja DEQUEUE........................................................................................................526

Administrowanie kolejką ........................................................................................................526Podprogramy pakietu DBMS_AQADM ..........................................................................526Uprawnienia do kolejek....................................................................................................533Kolejki i słownik danych ..................................................................................................533

Przykłady ................................................................................................................................536Tworzenie kolejek i tabel kolejek.....................................................................................536Proste wstawianie i odbieranie komunikatów ..................................................................538

Page 10: Oracle8. Programowanie w języku PL/SQL

Spis treści 13

„Czyszczenie” kolejek ......................................................................................................539Wstawianie i odbieranie komunikatów z uwzględnieniem priorytetów...........................540Wstawianie i odbieranie komunikatów z wykorzystaniem identyfikatora

korelacji lub identyfikatora komunikatu ....................................................................542Przeglądanie kolejek.........................................................................................................544Stosowanie kolejek wyjątków ..........................................................................................546Usuwanie kolejek..............................................................................................................548

Podsumowanie ........................................................................................................................549

Rozdział 18. Obsługa zadań i plików w bazie danych ................................................551Zadania w bazie danych..........................................................................................................551

Procesy drugoplanowe......................................................................................................551Uruchamianie zadania ......................................................................................................552Zadania niewykonane .......................................................................................................556Usuwanie zadania .............................................................................................................557Dokonywanie zmian w zadaniu........................................................................................557Przeglądanie zadań w słowniku danych ...........................................................................558Warunki wykonywania zadań...........................................................................................558

Obsługa plików .......................................................................................................................558Zabezpieczenia .................................................................................................................559Wyjątki w pakiecie UTL_FILE ........................................................................................560Otwieranie i zamykanie plików........................................................................................561Zapis do pliku ...................................................................................................................563Odczyt z pliku...................................................................................................................566Przykłady ..........................................................................................................................566

Podsumowanie ........................................................................................................................573

Rozdział 19. Serwer WWW Oracle............................................................................575Środowisko serwera WWW Oracle ........................................................................................575

Agent PL/SQL ..................................................................................................................577Określanie wartości parametrów w procedurach..............................................................578

Narzędzia WWW w PL/SQL..................................................................................................580Pakiety HTP i HTF ...........................................................................................................580Pakiet OWA_UTIL...........................................................................................................594Pakiet OWA_IMAGE.......................................................................................................601Pakiet OWA_COOKIE.....................................................................................................604

Tworzenie procedur OWA......................................................................................................607Procedura OWA_UTIL.SHOWPAGE .............................................................................607SQL-Station ......................................................................................................................608

Podsumowanie ........................................................................................................................608

Rozdział 20. Procedury zewnętrzne ..........................................................................609Czym jest procedura zewnętrzna?...........................................................................................609

Wywoływanie procedury zewnętrznej .............................................................................610Odwzorowywanie parametrów.........................................................................................617Funkcje i procedury zewnętrzne w pakietach...................................................................624

Połączenie zwrotne z bazą danych..........................................................................................626Podprogramy usługowe ....................................................................................................626Wykonywanie instrukcji SQL w procedurze zewnętrznej ...............................................629

Wskazówki, wytyczne i ograniczenia.....................................................................................630Wykrywanie błędów w procedurach zewnętrznych .........................................................630Wytyczne ..........................................................................................................................632Ograniczenia .....................................................................................................................633

Podsumowanie ........................................................................................................................634

Page 11: Oracle8. Programowanie w języku PL/SQL

14 Oracle8. Programowanie w języku PL/SQL

Rozdział 21. Duże obiekty .......................................................................................635Czym są duże obiekty? ...........................................................................................................635

Składowanie dużych obiektów .........................................................................................636Duże obiekty w instrukcjach DML...................................................................................637

Obiekty typu BFILE................................................................................................................639Katalogi.............................................................................................................................639Otwieranie i zamykanie plików BFILE............................................................................641Pliki BFILE w instrukcjach DML ....................................................................................641

Pakiet DBMS_LOB ................................................................................................................643Podprogramy pakietu DBMS_LOB .................................................................................643Wyjątki zgłaszane przez podprogramy z pakietu DBMS_LOB.......................................658Porównanie interfejsów DBMS_LOB i OCI....................................................................658

PL/SQL w działaniu: Kopiowanie danych typu LONG do postaci LOB...............................659Podsumowanie ........................................................................................................................661

Rozdział 22. Wydajność i strojenie ..........................................................................663Obszar wspólny.......................................................................................................................663

Struktura instancji bazy Oracle.........................................................................................663Jak funkcjonuje obszar wspólny? .....................................................................................667Rozmiar obszaru wspólnego.............................................................................................669Unieruchamianie obiektów...............................................................................................670

Strojenie instrukcji SQL..........................................................................................................672Generowanie planu wykonania.........................................................................................672Wykorzystywanie planu ...................................................................................................678

Sieć..........................................................................................................................................679Wykorzystywanie środowiska PL/SQL po stronie klienta...............................................679Unikanie powtórnej analizy składni .................................................................................679Przetwarzanie tablicowe ...................................................................................................680

Podsumowanie ........................................................................................................................680

Dodatek A Słowa zastrzeżone w PL/SQL ...............................................................681

Dodatek B Pakiety dostępne w PL/SQL ................................................................683Tworzenie pakietów................................................................................................................683Opis pakietów .........................................................................................................................683

DBMS_ALERT ................................................................................................................683DBMS_APPLICATION_INFO .......................................................................................684DBMS_AQ i DBMS_AQADM........................................................................................686DBMS_DEFER, DBMS_DEFER_SYS i DBMS_DEFER_QUERY..............................686DBMS_DDL.....................................................................................................................686DBMS_DESCRIBE..........................................................................................................687DBMS_JOB......................................................................................................................688DBMS_LOB.....................................................................................................................688DBMS_LOCK..................................................................................................................688DBMS_OUTPUT .............................................................................................................693DBMS_PIPE.....................................................................................................................693DBMS_REFRESH i DBMS_SNAPSHOT ......................................................................693DBMS_REPCAT, DBMS_REPCAT_AUTH i DBMS_REPCAT_ADMIN ..................693DBMS_ROWID ...............................................................................................................693DBMS_SESSION.............................................................................................................694DBMS_SHARED_POOL.................................................................................................695DBMS_SQL .....................................................................................................................696DBMS_TRANSACTION.................................................................................................696DBMS_UTILITY .............................................................................................................698UTL_FILE ........................................................................................................................700

Page 12: Oracle8. Programowanie w języku PL/SQL

Spis treści 15

Dodatek C Słownik wybranych elementów PL/SQL ................................................701

Dodatek D Słownik danych ...................................................................................721Czym jest słownik danych?.....................................................................................................721

Standardy nazewnictwa ....................................................................................................721Uprawnienia......................................................................................................................722

Perspektywy DBA, All i User w słowniku danych.................................................................722Zależności .........................................................................................................................723Kolekcje............................................................................................................................724Błędy kompilacji...............................................................................................................724Katalogi.............................................................................................................................725Zadania .............................................................................................................................725Biblioteki ..........................................................................................................................726Duże obiekty (LOB) .........................................................................................................726Metody obiektów..............................................................................................................727Parametry metod obiektów...............................................................................................727Wartości zwracane przez metody obiektów .....................................................................728Typy obiektowe ................................................................................................................729Odwołania do obiektów....................................................................................................729Atrybuty typów obiektowych ...........................................................................................729Obiekty w schemacie........................................................................................................730Kod źródłowy ...................................................................................................................730Tabele ...............................................................................................................................731Kolumny tabeli .................................................................................................................732Wyzwalacze......................................................................................................................733Kolumny wyzwalaczy ......................................................................................................734Perspektywy......................................................................................................................734

Inne perspektywy słownika danych ........................................................................................735dbms_alert_info ................................................................................................................735dict_columns.....................................................................................................................735

Skorowidz ...........................................................................................737

Page 13: Oracle8. Programowanie w języku PL/SQL

Rozdział 4.

SQL w PL/SQL

Strukturalny język zapytań (SQL) określa sposób manipulowania danymi w bazie danych

Oracle. Konstrukcje proceduralne, które przedstawiono w rozdziale 2. i 3., stają się znacznie

bardziej użyteczne w połączeniu z mocą przetwarzania języka SQL, ponieważ wtedy

konstrukcje te pozwalają programom PL/SQL na manipulowanie danymi w bazie danych

Oracle. W niniejszym rozdziale zostaną omówione instrukcje SQL, które są dozwolone

w języku PL/SQL i instrukcje sterowania transakcjami, które gwarantują utrzymanie

spójności danych. W rozdziale 5. Czytelnik zapozna się z wbudowanymi funkcjami SQL.

Instrukcje SQL

Instrukcje SQL można podzielić na sześć kategorii, które wymieniono poniżej. W tabeli

4.1 znajduje się kilka przykładowych instrukcji. Szczegółowy opis wszystkich instrukcji

SQL znajduje się w publikacji Server SQL Reference.

Tabela 4.1. Kategorie instrukcji SQL

Kategoria Przykładowe instrukcje SQL

Instrukcje języka manipulowania danymi DML

(Data Manipulation Language)

������, ������, ����, ������, ������������� �,����������

Instrukcje języka definicji danych DDL

(Data Definition Language)

�� , ������, �����, �����, ��� ��

Instrukcje sterowania transakcją � ����, � ������, ���� ���

Instrukcje sterowania sesji ����� ����� �, ��� � ��

Instrukcje sterowania systemu ����� ������

Wbudowane polecenia SQL � �����, ������� ��� �, ��� ����1

� instrukcje języka manipulowania danymi DML (Data Manipulation Language)

służą do zmieniania danych w tabelach lub danych zapytań w tabeli bazy danych,

ale nie umożliwiają zmiany struktury tabeli lub innych obiektów;

1Wbudowane polecenie SQL ��� ���� jest dostępne w wydaniu Oracle 7.2 i wyższym.

Page 14: Oracle8. Programowanie w języku PL/SQL

98 Oracle8. Programowanie w języku PL/SQL

� instrukcje języka definicji danych DDL (Data Definition Language) służą

do tworzenia, usuwania lub zmieniania struktury obiektu schematu. Polecenia,

które zmieniają uprawnienia do obiektów schematu, są również instrukcjami DDL;

� instrukcje sterowania transakcji gwarantują zachowanie spójności danych dzięki

zorganizowaniu instrukcji SQL w logiczne transakcje, których wykonywanie

jako jednostki kończy się powodzeniem lub niepowodzeniem;

� instrukcje sterowania sesji służą do zmieniania ustawień dla pojedynczego

połączenia z bazą danych, np. do aktywacji śledzenia sesji SQL;

� instrukcje sterowania systemu służą do zmieniania ustawień dla całej bazy danych,

np. do aktywowania lub dezaktywowania procesu archiwizacji;

� wbudowane polecenia SQL są wykorzystywane w programach prekompilatora

Oracle.

Wykorzystanie instrukcji SQL w języku PL/SQL

Jedynymi instrukcjami SQL, które są dozwolone w programie PL/SQL, są instrukcje DML

oraz instrukcje sterowania transakcji. W szczególności instrukcje DDL są niedozwolone.

Także instrukcja ������������, mimo że jest klasyfikowana jako instrukcja DML, jest

niedozwolona. Aby to wyjaśnić, konieczna jest znajomość założeń projektowych przy-

jętych dla języka PL/SQL.

Ogólnie język programowania może wiązać zmienne na dwa sposoby: przez wiązanie

wczesne lub wiązanie późne. Wiązanie zmiennej jest procesem identyfikowania lokacji

pamięci skojarzonej z identyfikatorem programu. W języku PL/SQL wiązanie uwzględ-

nia również sprawdzenie istnienia zezwolenia na uzyskanie dostępu do odwoływanego

obiektu schematu w bazie danych. W przypadku języka, w którym stosuje się wiązanie

wczesne, wiązanie zmiennej następuje podczas etapu kompilacji, natomiast w przypad-

ku języka, w którym stosuje się wiązanie późne, proces wiązania zmiennej jest odkładany aż

do czasu uruchomienia programu. Uwzględnienie procesu wiązania wczesnego oznacza, że

etap kompilacji będzie trwać dłużej (ponieważ musi być wykonane wiązanie zmiennych),

ale sam program będzie wykonywany szybciej, ponieważ wiązanie będzie już zakończone.

Wiązanie późne skraca czas kompilacji, ale wydłuża czas wykonywania programu.

Język PL/SQL celowo zaprojektowano w taki sposób, aby zastosować wiązanie wczesne.

Decyzję tę podjęto w celu zapewnienia jak najszybszego wykonywania bloku, ponieważ

wszystkie obiekty bazy danych są sprawdzane przez kompilator. Jest to sensowne rozwią-

zanie, ponieważ bloki PL/SQL mogą być składowane w bazie danych za pomocą procedur,

funkcji, pakietów i wyzwalaczy. Obiekty te są składowane w skompilowanej formie,

a zatem w razie potrzeby mogą być bezpośrednio ładowane z bazy danych do pamięci

i uruchamiane. Więcej informacji na temat obiektów składowanych znajduje się w roz-

działach 7., 8. oraz 9. Konsekwencją podjęcia takiej decyzji projektowej jest zakaz stoso-

wania instrukcji DDL. Instrukcje DDL modyfikują obiekt bazy danych, w więc zachodzi

konieczność ponownego sprawdzania zezwoleń. Sprawdzanie zezwoleń wymagałoby po-

nownego wiązania identyfikatorów, a ten proces jest przeprowadzany podczas kompilacji.

W tym punkcie warto rozważyć następujący, hipotetyczny blok PL/SQL:

Page 15: Oracle8. Programowanie w języku PL/SQL

Rozdział 4. � SQL w PL/SQL 99

��������������������������������������� ��!�� �������"����#$�%�!�� ���&���'())*������������ �������������� ��!�� �"�#$�%�!�� �)�����������'("�+&���,+)*���*

W celu kompilacji tego bloku identyfikator ���������� wymaga dowiązania. Podczas tego

procesu następuje sprawdzenie faktu istnienia tabeli. Jednak tabela nie może istnieć przed

uruchomieniem bloku. Z powyższego wynika, że omawiany blok nie może zostać skom-

pilowany, a zatem nie ma sposobu na uruchomienie go.

Instrukcje sterowania transakcji są jedynymi instrukcjami SQL, które nie mają możliwości

modyfikowania obiektów schematu lub uprawnień do obiektów schematu i w ten sposób

są jedynymi poprawnymi instrukcjami SQL, stosowanymi w języku PL/SQL.

Stosowanie instrukcji DDL

Istnieje alternatywne rozwiązanie problemu przedstawionego w poprzednim pod-

rozdziale. Od wydania PL/SQL 2.1 jest dostępny wbudowany pakiet �� ���.

Jest to pakiet, który umożliwia dynamiczne tworzenie instrukcji SQL podczas 1 tworzona

aż do czasu uruchomienia programu, a więc kompilator PL/SQL nie musi wiązać identyfi-

katorów w instrukcji, co pozwala na kompilowanie bloku. Pakiet �� ��� jest szczegółowo

opisany w rozdziale 15. Przykładowo, do wykonania instrukcji ����������� z poprzed-

niego bloku można użyć pakietu �� ���. Jednak nawet wtedy kompilacja instrukcji

������ nie powiedzie się, ponieważ tabela nie istnieje ć przed uruchomieniem bloku.

Rozwiązaniem tego problemu jest zastosowanie pakietu �� ��� również do wykony-

wania instrukcji ������.

Stosowanie instrukcji DMLw języku PL/SQL

Dozwolonymi instrukcjami DML w języku PL/SQL są instrukcje: ������, ������, �����

oraz �����. Instrukcje te działają w następujący sposób: instrukcja ������ zwraca te

wiersze z tabeli bazy danych, które odpowiadają kryteriom podanym w jej klauzuli �����,

instrukcja ������ dodaje wiersze do tabeli bazy danych, instrukcja ����� modyfikuje te

wiersze w tabeli bazy danych, które odpowiadają klauzuli �����, natomiast instrukcja �����

usuwa wiersze identyfikowane przez klauzulę �����. Poza klauzulą ����� powyższe instruk-

cje mogą uwzględniać także inne klauzule. Klauzule te opisano w kolejnych podrozdziałach

niniejszego rozdziału.

Podczas wykonywania instrukcji SQL w programie SQL*Plus wyniki tego wykonania

są wyświetlane na ekranie. Przykładowy sposób takiego wyświetlania przedstawiono na

rysunku 4.1. W przypadku wykonywania instrukcji �����, ������ lub ����� SQL*Plus

zwraca liczbę przetwarzanych wierszy. W razie wykonywania instrukcji ������ wiersze,

które odpowiadają zapytaniu, są wyświetlane na ekranie.

Page 16: Oracle8. Programowanie w języku PL/SQL

100 Oracle8. Programowanie w języku PL/SQL

Rysunek 4.1.Wyniki

wykonania

instrukcji SQL

w programie

SQL*Plus

Należy zwrócić uwagę na sposób zastosowania instrukcji �����. Wyniki wykonania tej

instrukcji pokazano na rysunku 4.1.

������������������� ��#%�-.�/�0�1��2&����-���%������0�+&��+������#, %/��0�'('*

Wszystkie wartości, które są wykorzystane w celu zmiany zawartości tabeli ���, sąustalone — są znane podczas tworzenia instrukcji. Język PL/SQL usuwa to ogranicze-nie za pomocą zmiennych. Stosowanie zmiennych jest dozwolone wszędzie tam, gdziew instrukcji SQL jest dozwolone stosowanie wyrażeń. Jeśli zmienne są używane w opi-sywany sposób, są nazywane zmiennymi dowiązanymi. Przykładowo, w poprzedniej in-strukcji ����� można zastąpić wartość ustaloną liczby zaliczeń (��� �������) zmiennądowiązaną:

Dostępne na płycie CD w skrypcie bindvar.sql

����������� ���������#��//�/3� ��#%�-.�/4���*�������56�%78�./7�9�%�,/#�7�.����:�!�� ��%�-.�/�65���� ������������������������������������ ��#%�-.�/�0��� �����������2&����-���%������0�+&��+��������#, %/��0�'('*���*

Page 17: Oracle8. Programowanie w języku PL/SQL

Rozdział 4. � SQL w PL/SQL 101

Nie wszystkie elementy w instrukcji SQL mogą być zastępowane zmiennymi — zastępować

można tylko wyrażenia. W szczególności muszą być znane nazwy tabel i kolumn. Jest

to wymagane ze względu na wiązanie wczesne — nazwy obiektów Oracle muszą być

znane w czasie kompilacji. Z definicji wartość zmiennej nie jest znana aż do czasu uru-

chomienia programu. W celu przezwyciężenia tego ograniczenia można również wyko-

rzystywać pakiet �� ���.

Instrukcja SELECT

Instrukcja SELECT pobiera dane z bazy danych do zmiennych PL/SQL. Poniżej przedsta-

wiono składnię instrukcji SELECT:

W poniższej tabeli opisano wszystkie elementy.

Tabela 4.2. Klauzule wyboru instrukcji SELECT

Klauzula wyboru Opis

���������./�8�98�,% Kolumna (lub wyrażenie) do wybrania. Każdy element listy wyboru jest oddzielonyprzecinkiem i może być opcjonalnie identyfikowany przez alias (zamiennik).Cały zbiór elementów listy w instrukcji ������ nazywa się listą wyboru.Znak 6 w składni jest skrótem zastępującym cały wiersz. W ten sposób są zwracaneposzczególne pola w tabeli w kolejności, w jakiej zdefiniowano pola.

;�.���� Zmienna PL/SQL, do której będzie przekazany element listy wyboru. Każda zmiennapowinna być kompatybilna ze swoim skojarzonym elementem listy wyboru.Dlatego elementy listy oraz zmienne wyjściowe powinny istnieć w tej samej liczbie.

%�<,%-��5�=� Może być stosowany zamiast listy zmiennych. Rekord powinien zawierać pola,które odpowiadają elementom z listy wyboru, ale również pozwalają na łatwiejsząmanipulację zwracanymi danymi. Rekordy łączą powiązane pola w jednej jednostceskładniowej. W ten sposób można manipulować tymi polami zarówno jako grupą,jak również indywidualnie. Zagadnienia dotyczące rekordów opisano w dalszejczęści niniejszego rozdziału. Jeżeli listą wyboru jest znak 6, wtedy ten rekord możebyć zdefiniowany jako ,-9,���.�������.4� 2���.

,-9,���.�������. Identyfikuje tabelę, z której mają być pobrane dane. Może być synonimem lub tabeląw odległej bazie danych, określonej przez powiązanie z bazą danych. Więcej informacjina temat odwołań tabel znajduje się w dalszej części niniejszego rozdziału.

<�� 7 ���9$�%� Kryterium dla tego zapytania. Klauzula ta identyfikuje wiersz, który będzie zwróconyprzez zapytanie. Kryterium składa się z warunków logicznych (boole’owskich)łączonych operatorami logicznymi. Zagadnienia związane z kryteriami wyboru opisanobardziej szczegółowo w dalszej części niniejszego rozdziału.

Page 18: Oracle8. Programowanie w języku PL/SQL

102 Oracle8. Programowanie w języku PL/SQL

Ogólnie więcej klauzul jest dostępnych dla instrukcji ������. Przykładowo, zaliczają siędo nich klauzule ��������� oraz �� ���. Szczegółowo omówiono je w rozdziale 6.Więcej informacji na ich temat znajduje się w publikacji Server SQL Reference.

Instrukcja ������ według podanej powyżej składni powinna zwracać najwyżej jeden wiersz.Klauzula ����� jest sprawdzana dla każdego wiersza w tabeli. Jeżeli odpowiada ona więcejniż jednemu wierszowi, PL\SQL zwraca następujący komunikat o błędzie:

��>'?@AB��.�C��>%,9�D �%8�%�� %�/��,%���$���,���%,9����������;��8���.��,�:�-���9.�%/7�79%�#��9.�#�:��.7�:�-���9.�%/7)

W takim przypadku do pobrania każdego wiersza osobno konieczne jest zastosowaniekursora. Więcej informacji na ten temat znajduje się w rozdziale 6.

W poniższym przykładzie przedstawiono sposób zastosowania dwóch różnych instrukcji������:

Dostępne na płycie CD w skrypcie select.sql

���������!��� -�����#,%-��/� -���/4� 2���*��!�����%����������#��//�/3-���%�����4���*��!��, %/����������#��//�/3#, %/�4���*�������>>�,�.�%7�:�-���%�<,%-�7������.�/� -���/�.�7�#$,9�:�9�%�<,%-7.���>>�!��� -�����#,%-3�����78�79%,#.#� 9�C�"�7��<�� 7 ���2&�����>>�,-�,9.�-���8�<,�:�-��� �9.�%/7,9.������.3�����78�%,9�.�7�79%,#.#��>>� 9�C�"�7��7��8���.��79%�#��9/78/�<.���,���9������.�/� -���/��>>���,�.�9�7�/�,/,9��8�:�/��7��<�6)3�2�����/�,/,����-,9��8�%�<,%-��>>�:�/��7-�E.�.,9��8�:�<,�/� -���/4� 2���3���������6������� �!��� -�����#,%-����F� ��/� -���/����2&����.-�0�'((((*

��>>�,�.�%7�-9���,���7������.�#��//�/�.�7�#$,9�:�:��9�7�.���8#$��>>�!�����%������,%�7�!��, %/�3�;�,9 �7�����<�� 7 ���2&����,-�,9.�-���>>��8�<,�:�-��� �9.�%/7,9.������.3���������-���%�����"�#, %/�������� �!�����%�����"�!��, %/�����F� ��#��//�/����2&����%,,��.-�0�GGGGA*���*

Instrukcja INSERT

Składnię instrukcji ������ przedstawiono poniżej. Należy zwrócić uwagę, że bezpośredniow instrukcji nie występuje klauzula WHERE (chociaż może ona występować w podza-pytaniu).

Klauzula �� �!"��� �"#�!� odwołuje się do tabeli Oracle, �"$ " %�!���& odwołuje siędo kolumny w tej tabeli, a &�"$���� jest wyrażeniem SQL lub PL/SQL, co zdefiniowanow poprzednim rozdziale. Odwołania do tabel omówiono bardziej szczegółowo w dalszej

Page 19: Oracle8. Programowanie w języku PL/SQL

Rozdział 4. � SQL w PL/SQL 103

części niniejszego rozdziału. Jeżeli instrukcja ������ zawiera ������%�'" ��!���, wtedy

elementy listy instrukcji ��!��� powinny odpowiadać kolumnom, do których mają być

wstawiane dane.

Prawidłowe zastosowanie kilku instrukcji ������ przedstawiono w poniższym przykładzie:

Dostępne na płycie CD w skrypcie insert.sql

���������!��� -�������/� -���/3.-4���*�������>>�,�.�%7��,98�.-���8E.<��,%����/� -�������������/� -����/�D ��#�3�������������� �!��� -���������F� ��- ��*

��>>��,-�:�9.�%/7�-,������.�/� -���/3������������ �/� -���/��.-"�E.%/������"���/������)�����������!��� -�����"�+�.�,�$8+"�+�����%+)*

��>>��,-�:�-% C.�9.�%/7"����� 78:�� ��% �/�<9��#:.���7�,/%�-�.,�9��>>�.�/�% <#:.�������3������������ �/� -���/��.-"�E.%/������"���/������)�����������/� -����/�D ��#�3�������"�+��%.#<+"�+,��+)*���*

W następnym przykładzie przedstawiono nieprawidłowy sposób wykonania polecenia

������. Elementy listy instrukcji ������ podzapytania nie odpowiadają kolumnom, które

mają być wstawiane. Taka instrukcja powoduje zwrócenie błędu Oracle ORA-913:�too

many values.

���������� �%,,�/���������6�F� ��#��//�/*

Kolejny przykład przedstawia prawidłowo wydaną instrukcję ������. Przez wstawienie

kopii każdego wiersza następuje podwojenie wielkości tabeli �!"����.

���������� �#��//�/���������6�F� ��#��//�/*

Wersja Oracle8 z opcją obiektów dostarcza dodatkową klauzulę dla instrukcji ������ —

klauzuli ��(����). W razie zastosowania tej klauzuli z tabelami obiektów jest zwracane

odwołanie do wstawianego obiektu. Więcej informacji na ten temat znajduje się w roz-

dziale 11.

Page 20: Oracle8. Programowanie w języku PL/SQL

104 Oracle8. Programowanie w języku PL/SQL

Instrukcja UPDATE

Poniżej przedstawiono składnię instrukcji �����:

Klauzula �� �!"��� �"#�!� odwołuje się do modyfikowanej tabeli, �"$ " %�!���& jest

nazwą kolumny, której wartość ma być zmieniona, a &�"$���� jest wyrażeniem SQL,

co zdefiniowano w rozdziale 2. Jeżeli instrukcja ����� zawiera ������%�'" ������,

elementy listy wyboru powinny odpowiadać kolumnom w klauzuli ���.

W poniższym przykładzie pokazano zastosowanie instrukcji �����:

Dostępne na płycie CD w skrypcie update.sql

���������!���:,%�����������/� -���/3��:,%4���*��!��%�-.���#%��/���������B0�1*�������>>����.�/�% <#:�������-,-��1�-,��,���# %%����#%�-.�/��>>�-���9/78/�<.#$�/� -���,9"�<�,%78�/� -. :��&./�,%.�3��!���:,%�B0�+&./�,%8+*�������/� -���/��������# %%����#%�-.�/�0�# %%����#%�-.�/�H�!��%�-.���#%��/�����2&������:,%�0�!���:,%*���*

Instrukcja DELETE

Instrukcja ����� usuwa wiersze z tabeli bazy danych. Klauzula ����� wskazuje, które

wiersze mają być usunięte. Poniżej podana jest składnia instrukcji �����:

Page 21: Oracle8. Programowanie w języku PL/SQL

Rozdział 4. � SQL w PL/SQL 105

Klauzula �� �!"��� �"#�!� odwołuje się do tabeli z bazy danych Oracle, a %!"�$�!" *���

definiuje zbiór wierszy, które mają być usunięte. Specjalna składnia ��������)(�%�����

jest używana wraz z definicją kursora i jest omówiona w rozdziale 6. Odwołania do tabeli

oraz klauzula ����� są omawiane szczegółowo w kolejnej części tego rozdziału, w pod-

rozdziale „Klauzula WHERE”.

W poniższym przykładzie przedstawiono sposób stosowania kilku różnych instrukcji �����:

Dostępne na płycie CD w skrypcie delete.sql

���������!��� -���� �,EE�������*�������!��� -���� �,EE�B0�'(*��>>�/ ��-����-,�8#7�#��<��/"�9�<�,%8#$��.�����98/��%#7�:�#�:��.#7�8��>>�7�%�:�/�%,9��8#$�/� -���,93���������F� ��#��//�/����2&����# %%����/� -���/�I�!��� -���� �,EE*

��>>�/ ��-����-,�8#7�#��<�7-�C,�/� -�����/� -. :�#�C,��<,�,�.�"�<�J%8��>>��.���,/.�-��:�/7#7��7�-�8#$�7��.#7��3���������F� ��/� -���/����2&����# %%����#%�-.�/�0�(������������:,%�0�+�#,�,�.#/+*���*

Klauzula WHERE

Wraz z instrukcjami ������, ����� oraz ����� stosuje się klauzulę �����, będącą inte-

gralną częścią wykonywanych przez te instrukcje operacji. Klauzula ta definiuje, które

instrukcje tworzą zestaw aktywny — zestaw wierszy zwracanych przez zapytanie (������)

lub na których są wykonywane instrukcje ����� oraz �����.

Klauzula ����� składa się z warunków połączonych operatorami logicznymi ��, )� oraz

�)�. Warunki zwykle przyjmują formę porównań, tak jak w poniższym przykładzie zasto-

sowania instrukcji �����:

���������!�����%�������&���1)*�������!�����%������B0�+��+*��>>�/ ��9/78/�<.��<��/8�98-7.�� ���E,%���8<����������F� ��#��//�/����2&���������� ������������ ���*���*

Powyższy, przykładowy blok usuwa wszystkie te wiersze z tabeli ���, dla których

warunek został oceniony na wartość ���� (dla których kolumna �������� � = +��+,. Przy

tego typu porównaniach należy zwracać uwagę na właściwe stosowanie nazw zmiennych

oraz sposób porównywania znaków.

Page 22: Oracle8. Programowanie w języku PL/SQL

106 Oracle8. Programowanie w języku PL/SQL

Nazwy zmiennych

Na potrzeby kolejnego przykładu przyjęto, że w poprzednim bloku programu zmieniononazwę zmiennej z ���������� � na �������� �:

��������������� �����&���1)*�����������%������B0�+��+*��>>�/ ��9/78/�<.��<��/8�98-7.�� ���E,%���8<����������F� ��#��//�/����2&����-���%������0������� ���*���*

Ta prosta zmiana radykalnie wpływa na otrzymane wyniki wykonania tej instrukcji — takzmodyfikowany blok usunie wszystkie wiersze tabeli ���, a nie tylko te, dla którychzachodzi równość ��-"�������.�+��+. Wynika to ze sposobu parsowania identyfikatoróww instrukcji SQL. Kiedy mechanizm PL/SQL napotyka na warunek taki jak:

�������������������

najpierw następuje sprawdzenie identyfikatorów / &�"$���� oraz 0 &�"$���� w celu usta-lenia, czy odpowiadają one kolumnom tabeli, na których jest wykonywana dana operacja.Następnie identyfikatory te są sprawdzane, czy są zmiennymi w bloku PL/SQL. JęzykPL/SQL nie rozróżnia małych i dużych liter, zatem w poprzednim bloku obydwa identy-fikatory �������� � oraz �������� � są skojarzone z kolumną w tabeli ���, a nie zezmienną. Wynikiem sprawdzenia tego warunku dla każdego wiersza tabeli będzie wartość���� i dlatego wszystkie wiersze zostaną usunięte.

Jeżeli blok posiada etykietę, można w dalszym ciągu użyć tej samej nazwy dla zmiennejjak dla kolumny tabeli — dzięki nadanej etykiecie do odwołania do zmiennej. Przedsta-wiony poniżej blok daje pożądany efekt, a mianowicie usuwa tylko te wiersze, dla których��-"�������.�+��+:

II����������,#<KK�������������%�������&���1)*�����������%������B0�+��+*��>>�/ ��9/78/�<.��<��/8�98-7.�� ���E,%���8<����������F� ��#��//�/����2&����-���%������0������������� ������ ���*���*

Mimo że ten sposób działania prowadzi do uzyskania pożądanego wyniku, jednak stoso-wanie tej samej nazwy dla zmiennej PL/SQL i dla kolumny tabeli nie jest cechą dobregostylu programowania. Te i inne wytyczne dotyczące stylu programowania w języku PL/SQLomówiono w końcowej części rozdziału 2.

Porównania znaków

W poprzednim przykładzie znajduje się fragment kodu służący do porównywania wartościdwóch znaków. W systemie Oracle mogą być zastosowane dwa różne rodzaje porównań:z dopełnieniem odstępu (blank-padded) lub bez dopełnienia odstępu (non-blank-padded).

Page 23: Oracle8. Programowanie w języku PL/SQL

Rozdział 4. � SQL w PL/SQL 107

Te dwa rodzaje porównań różnią się w sposobie porównywania ciągów znaków o różnychdługościach. Przyjęto, że są porównywane dwa ciągi znaków: ���� ����� oraz ���� �����.Do porównania z dopełnieniem odstępu stosuje się następujący algorytm.

1. Jeżeli ciągi znaków ���� ����� oraz ���� ����� są różnej długości, krótszy ciąg

należy dopełnić znakami odstępu (spacjami), tak aby obydwa miały tą samą długość.

2. Następnie porównuje się każdy ciąg znaków, znak po znaku, zaczynając

od lewej strony. Przykładowo, w ciągu znaków ���� ����� znakiem jest � ���,

a w ciągu znaków ���� ����� znakiem jest � ���.

3. Jeżeli ASCII(� ���) < ASCII(� ���), to ���� ����� < ���� �����.

Jeżeli ASCII(� ���) > ASCII(� ���), to ���� ����� > ���� �����.

Jeżeli ASCII(� ���) = ASCII(� ���), to odpowiednio w ciągach znaków

���� ����� oraz ���� ����� przechodzi się do następnego znaku.

4. Jeżeli możliwe jest osiągnięcie końców ciągów znaków ���� �����

oraz ���� �����, wtedy te ciągi są sobie równe.

Przy zastosowaniu algorytmu porównania z dopełnieniem odstępu wszystkie poniższe

warunki zwrócą wartość ����:

+��#+�0�+��#++��#���+�0�+��#+��>>�����78�79%,#.#� 9�C�����<,�#,9��7��<.�,-/��� ������������������>>�9��.�%9/78��#.�C �7��<,93+��+�I�+��#++��#-+�K�+��##+

Algorytm porównania bez dopełnienia odstępu jest nieco inny.

1. Należy porównać każdy ciąg znaków, znak po znaku, zaczynając od lewej strony.

Przykładowo, w ciągu znaków ���� ����� znakiem jest � ���, a w ciągu znaków

���� ����� znakiem jest � ���.

2. Jeżeli ASCII(� ���) < ASCII(� ���), to ���� ����� < ���� �����.

Jeżeli ASCII(� ���) > ASCII(� ���), to ���� ����� > ���� �����.

Jeżeli ASCII(� ���) = ASCII(� ���), to należy przejść do następnego znaku

odpowiednio w ciągach znaków ���� ����� oraz ���� �����.

3. Jeżeli ciąg znaków ���� ����� kończy się przed ciągiem znaków ���� �����,

wtedy ���� ����� < ���� �����. Jeżeli ciąg znaków ���� ����� kończy

się przed ciągiem znaków ���� �����, wtedy ���� ����� > ���� �����.

Przy zastosowaniu algorytmu porównania bez dopełnienia odstępu poniższe warunki

zwrócą wartość ����:

+��#+�0�+��#++��+�I�+��#++��#-+�K�+��##+

Jednak poniższe porównanie bez dopełnienia odstępu zwróci wartość (����, ponieważ ciągiznaków są różnej długości. Jest to podstawowa różnica pomiędzy powyższymi dwomametodami porównań.

+��#���+�0�+��#+��>>�����78�79%,#.#� 9�C�����<,�#,9��7��<.�,-/��� ������������������>>�9��.�%9/78��#.�C �7��<,93

Page 24: Oracle8. Programowanie w języku PL/SQL

108 Oracle8. Programowanie w języku PL/SQL

Po zdefiniowaniu tych dwóch różnych metod porównań warto się zastanowić, kiedy należystosować każdą z nich. Język PL/SQL wykorzystuje metody porównania z dopełnieniemodstępu tylko wtedy, gdy obydwa porównywane ciągi znaków są stałej długości. Jeżelidane ciągi znaków są różnej długości, stosuje się metodę porównywania bez dopełnianiaodstępu. Typ danych ���� określa ciąg znaków o stałej długości, a typ danych 1������0określa ciąg znaków o zmiennej długości. Stałe znakowe (objęte znakami apostrofu) sązawsze uważane za ciągi znaków o stałej długości.

Jeżeli dana instrukcja nie jest wykonywana na poprawnych wierszach, należy sprawdzić ty-py danych użyte w klauzuli �����. Wykonanie poniższego bloku nie spowoduje usunięciajakichkolwiek wierszy, ponieważ zmienna ���������� � jest typu 1������0, a nie typu ����:

���������!�����%������!���"��#�1)*�������!�����%������B0�+��+*��>>�/ ��9/78/�<.��<��/8�98-7.�� ���E,%���8<����������F� ��#��//�/����2&����-���%������0�!�����%�����*���*

Kolumna �������� � tabeli ��� ma zdefiniowany typ danych ����. Wszystkie klasyinformatyki (computer science) posiadają wartości +��+ dla kolumny �������� � — należyzwrócić uwagę na końcowy znak odstępu. Zmienna ���������� � = +��+ nie ma końcowegoznaku odstępu i zdefiniowano dla niej typ danych o zmiennej długości, a zatem instrukcja����� nie będzie miała żadnego wpływu na wiersze.

Aby klauzula ����� dała pożądany efekt, dla zmiennych w bloku PL/SQL należy zdefi-niować ten sam typ danych, co dla porównywanych kolumn bazy danych. Taki efektgwarantuje zastosowanie atrybutu 2�3��.

Odwołania do tabel

Wszystkie operacje DML odwołują się do tabeli. Poniżej przedstawiono przykład takiegoodwołania:

L ������3M�����LN������������������M

gdzie ��*��"� identyfikuje właściciela tabeli, a -� �"$"���#"$&�"�&�* identyfikuje tabelęw odległej bazie danych.

W celu nawiązania połączenia z bazą danych konieczne jest podanie nazwy użytkownikai hasła dla odpowiedniego schematu użytkownika. Późniejsze instrukcje SQL, wydawanepodczas sesji, będą domyślnie odwoływać się do tego schematu. Jeżeli odwołanie do tabelijest niesklasyfikowane, jak w poniższym przykładzie:

���������������������:,%�0�+� /.#+��2&����.-�0�'(((O*

wtedy ta nazwa tabeli (w tym przykładzie ���� �) musi być nazwą tabeli w schemaciedomyślnym. Jeżeli tak nie jest, wystąpi błąd:

��>G?@B�������,%�!.�9�-,�/��,���P./������������������ ����%/��<�89���.��./��.�:�)

Page 25: Oracle8. Programowanie w języku PL/SQL

Rozdział 4. � SQL w PL/SQL 109

��>@('B�.-���.E.�%�� /�����-�#��%�-���������.-���8E.<��,%�� /.��8#�7�-�<��%,9��8)

Schemat domyślny jest schematem, z którym użytkownik jest połączony przed wyko-

nywaniem jakichkolwiek instrukcji. Jeżeli dana tabela znajduje się w innym schemacie,

może być kwalifikowana przez nazwę schematu, jak w kolejnym przykładzie:

������$� ��� /� -���/��������:,%�0�+� /.#+��2&����.-�0�'(((O*

Instrukcja ����� w powyższym przykładzie będzie wykonana, jeżeli zostanie nawiązane

połączenie ze schematem tabeli ������� lub z innym schematem, dla którego przyznano

uprawnienie ����� na tabeli ���� �.

Powiązania bazy danych

Jeżeli w systemie operacyjnym zainstalowano program SQL*Net, można wykorzystywać

powiązania bazy danych. Powiązanie bazy danych jest odwołaniem do odległej bazy

danych. Odległa baza danych może pracować w zupełnie innym systemie operacyjnym

niż lokalna baza danych. Poniżej przedstawiono instrukcję DDL, która tworzy powiąza-

nie bazy danych:

�������������������������������������� ������� �����������������������F��������� ������������������� ��*

Nazwa powiązania bazy danych �"$ " -� �"$"��" podlega tym samym regułom składnio-

wym, co identyfikator bazy danych. Schemat w odległej bazie danych jest identyfikowany

przez nazwę użytkownika �"$ "�$&�%� ��%" oraz hasło *"�!�, a ��"4$�"%� �5! jest po-

prawnym ciągiem znaków połączenia dla odległej bazy danych. Zakładając, że utworzono

odpowiednie schematy i że jest zainstalowany program SQL*Net wersja 2., poniższy,

przykładowy fragment kodu tworzy powiązanie bazy danych:

�������������%���&�'��P��������#< ���� ������� ��P������������F��������P������������+��#< ��-�����/�+*

Więcej informacji dotyczących sposobów instalowania i konfigurowania programu

SQL*Net znajduje się w publikacji SQL*Net User’s Guide and Reference. Kontynuując

powyższy przykład, za pomocą utworzonego powiązania można zdalnie modyfikować

tabelę ��������. W tym celu wpisuje się poniższy fragment kodu:

�����/� -���/(�$� ���)�������������:,%�0�+� /.#+��2&����.-�0�'(((O*

Jeśli powiązanie bazy danych stanowi część transakcji, wtedy ta transakcja jest nazywana

transakcją rozproszoną, ponieważ jej rezultatem jest zmodyfikowanie więcej niż jednej

bazy danych. Więcej informacji dotyczących transakcji rozproszonych i sposobów za-

rządzania nimi znajduje się w publikacji Server SQL Reference.

Page 26: Oracle8. Programowanie w języku PL/SQL

110 Oracle8. Programowanie w języku PL/SQL

Synonimy

Odwołania do tabel mogą być skomplikowane, szczególnie kiedy obejmują operacje

związane ze schematem użytkownika i (lub) powiązaniem bazy danych. Aby ułatwić

obsługę skomplikowanych odwołań, system Oracle pozwala na tworzenie ich synonimów.

Synonim w zasadzie zmienia nazwę odwołania do tabeli, podobnie jak alias dla elementu

listy wyboru instrukcji ������. Synonim jest obiektem słownika danych i jest tworzony

przez instrukcję DDL ��������3�)�3�:

���������� ���������� �������F ����������*

W celu utworzenia synonimu należy za pomocą powyższego polecenia wstawić w miejsce

�"$ " �&������ nazwę synonimu, a w miejsce �� �!"��� obiekt schematu, do którego

ma nastąpić odwołanie. Obiektem tym może być tabela, jak w poniższym przykładzie,

ale może to być również procedura, sekwencja lub inny obiekt bazy danych.

�������%*�+�*,��P������/� -���/��F ��/� -���/(�P��������#< �*

Kontynuując powyższy przykład, za pomocą utworzonego synonimu można zapisać roz-

proszoną instrukcję �����:

������$� �������������������:,%�0�+� /.#+��2&����.-�0�'(((O*

Utworzenie synonimu nie powoduje przyznania żadnych uprawnień na odwoływanymobiekcie — po prostu umożliwia wykorzystywanie jego alternatywnej nazwy. Jeżeli obiektwymaga odwołania z innego schematu, dostęp do tego obiektu powinien być przyznanyalbo jawnie, albo przez rolę (za pomocą instrukcji �����).

Pseudokolumny

Pseudokolumny są dodatkowymi obiektami, które mogą być wywoływane tylko z poziomu

instrukcji SQL. Pod względem składniowym pseudokolumny są traktowane jak kolumny

w tabeli. Jednak faktycznie nie istnieją w ten sam sposób jak kolumny. Zamiast tego są

one określane jako część wykonania instrukcji SQL.

Pseudokolumny CURRVAL oraz NEXTVAL

Pseudokolumny ����1�� oraz ����1�� są używane wraz z sekwencjami. Sekwencją jest

obiekt Oracle, który jest używany do generowania unikatowych liczb. Sekwencja jest

tworzona za pomocą polecenia DDL ���������������. Po utworzeniu sekwencji można

uzyskać do niej dostęp. W tym celu wydaje się polecenie:

��������3������

oraz

��������3�������

Page 27: Oracle8. Programowanie w języku PL/SQL

Rozdział 4. � SQL w PL/SQL 111

gdzie ��% ���'" jest nazwą sekwencji. Pseudokolumna ����1�� zwraca bieżącą wartość

sekwencji, a pseudokolumna�����1�� inkrementuje sekwencję i zwraca nową wartość.

Obydwie pseudokolumny ����1�� oraz ����1�� zwracają wartości typu �����.

Wartości sekwencji mogą być używane w liście wyboru zapytania, w klauzuli 1�����

instrukcji ������ oraz w klauzuli ��� instrukcji �����. Jednak nie mogą być one zasto-

sowane w klauzuli ����� lub w instrukcji proceduralnej PL/SQL. Poniżej podano przykłady

poprawnego wykorzystania pseudokolumn ����1�� oraz ����1��:

���������=�����/� -����/�D ��#���������2��&�'((((*

>>�2���:�.�/�% <#:.�'((((�7,/���.��98<,%78/�����:�<,�9�%�,/#�.-���8E.<��,%�������������� �/� -���/��.-"�E.%/������"���/������)������������������-����� ��.�!��"�+�#,��+"�+��.�$+)*

>>�2���:�.�/�% <#:.�'((('�7,/���.��98<,%78/�����:�<,�9�%�,/#�.-���8E.<��,%�������������� �/� -���/��.-"�E.%/������"���/������)������������������-����� ��.�!��"�+��%C�%��+"�+��/,�+)*

����������������-����� ��.�!���Q��� �Q��F� ��- ��*�>>���:�.�%9�.�<%����� :���.#7���/�<9��#:.��� �>>>>>>>>>>'(((@

����������������-����� �/��!���Q��� �Q��F� ��- ��*�>>�;9%�#���.�7�#��9�%�,/#��� �>>>>>>>>>>'(((@

Pseudokolumna LEVEL

Pseudokolumna ��1�� jest wykorzystywana tylko wewnątrz instrukcji ������, która umoż-liwia poruszanie się po drzewie hierarchii, obejmującym daną tabelę. Podczas tego procesusą stosowane klauzule ���������� oraz �)������3. Pseudokolumna ��1�� zwraca bieżącypoziom drzewa jako wartość typu �����. Więcej informacji na ten temat znajduje sięw publikacji Server SQL Reference.

Pseudokolumna ROWID

Pseudokolumna �)�� jest wykorzystywana w liście wyboru zapytania. Zwraca ona iden-tyfikator danego wiersza. Formatem pseudokolumny jest 18-znakowy ciąg znaków, coopisano w rozdziale 2. Pseudokolumna �)�� zwraca wartość typu �)��. W poniższymprzykładzie zapytanie zwraca wszystkie identyfikatory wierszy w tabeli ���� (pokoje):

�������� 2����F� ��%,,�/*

� 2��>>>>>>>>>>>>>>>>>>((((((?O3((((3(((@((((((?O3((('3(((@

Page 28: Oracle8. Programowanie w języku PL/SQL

112 Oracle8. Programowanie w języku PL/SQL

((((((?O3(((@3(((@((((((?O3(((13(((@((((((?O3(((?3(((@

Identyfikator � 2�� w wersji Oracle8 różni się od identyfikatora � 2�� w wersji Oracle7.Mimo to format zewnętrzny dla obydwóch wersji jest w dalszym ciągu 18-znakowymciągiem znaków. Więcej informacji na ten temat znajduje się w rozdziale 2.

Pseudokolumna ROWNUM

Pseudokolumna �)���� zwraca bieżący numer wiersza w zapytaniu. Umożliwia to ograni-

czenie całkowitej liczby wierszy. Pseudokolumna �)���� jest wykorzystywana głównie

w klauzuli ����� zapytań oraz w klauzuli ��� instrukcji �����. Pseudokolumna �)����

zwraca wartość typu �����. Wykonanie poniższego zapytania spowoduje zwrócenie

tylko dwóch pierwszych wierszy z tabeli ���� �:

�������6��F� ��/� -���/��2&����� 2���I�1*

Pierwszy wiersz posiada �)�����/, drugi — �)�����0, itd.

Wartość � 2�� jest przypisywana wierszowi przed wykonaniem operacji sortowania(za pomocą klauzuli �������). W rezultacie nie można zastosować tej pseudokolumnyw celu pobrania wierszy o najniższych wartościach ROWNUM dla określonej kolejnościwyszukiwania. Warto rozważyć przykładową, poniższą instrukcję:

�������E.%/������"���/��������F� ��/� -���/��2&����� 2���I�1�� ��������E.%/������*

Wprawdzie powyższa instrukcja zwraca dwa wiersze z tabeli �������� (studenci), posor-towane według kolumny 0������ � (imię), jednak niekoniecznie te wiersze są dwomapierwszymi wierszami według kolejności w całym sortowaniu. Aby to osiągnąć, najlepiejzadeklarować kursor dla tego zapytania i pobrać tylko dwa pierwsze wiersze. Informacjedotyczące kursorów i sposobów ich stosowania przedstawiono w rozdziale 6.

Instrukcje GRANT i REVOKE. Uprawnienia

Wprawdzie instrukcje DDL, takie jak 6���� i ��1)7�, nie mogą być bezpośrednio stoso-

wane w programie PL/SQL, jednak mają one pewien wpływ na poprawność instrukcji SQL.

W celu wykonania instrukcji, takiej jak ������ lub �����, na tabeli Oracle jest konieczne

posiadanie pewnych uprawnień. Manipulowanie tymi uprawnieniami następuje za pomocą

instrukcji SQL: 6���� oraz ��1)7�.

Page 29: Oracle8. Programowanie w języku PL/SQL

Rozdział 4. � SQL w PL/SQL 113

Uprawnienia obiektowe a uprawnienia systemowe

Istnieją dwa różne rodzaje uprawnień: obiektowe i systemowe. Uprawnienie obiektowepozwala na wykonywanie operacji na danym obiekcie (takim jak tabela). Uprawnieniesystemowe pozwala na wykonanie operacji na całej klasie obiektów.

W tabeli 4.3 opisano dostępne uprawnienia obiektowe. Uprawnienia obiektowe DDL(�����, ����, ��(�������) nie mogą być zastosowane bezpośrednio w języku PL/SQL(z wyjątkiem pakietu �� ���), ponieważ pozwalają one na przeprowadzenie operacjiDDL na rozpatrywanym obiekcie.

Tabela 4.3. Uprawnienia obiektowe SQL

Uprawnienieobiektowe

Opis Typy obiektówschematu

����� Pozwala użytkownikowi, któremu przyznano uprawnienie,na wydawanie instrukcji ����� (takiej jak ����� �����)dotyczącej obiektu.

Tabele, sekwencje

������ Pozwala użytkownikowi, któremu przyznano uprawnienie,na wydawanie instrukcji ������ dotyczącej obiektu.

Tabele, perspektywy

������ Pozwala użytkownikowi, któremu przyznano uprawnienie,na wykonanie składowanego obiektu PL/SQL (informacjedotyczące obiektów składowanych znajdują się w rozdziałachod 7. do 9.).

Procedury, funkcje, pakiety

����� Pozwala użytkownikowi, któremu przyznano uprawnienie,na utworzenie indeksu na tabeli za pomocą polecenia������ �����.

Tabele

������ Pozwala użytkownikowi, któremu przyznano uprawnienie,na wydawanie instrukcji ������ w odniesieniu do obiektu.

Tabele, perspektywy

��F������� Pozwala użytkownikowi, któremu przyznano uprawnienie,na utworzenie ograniczenia, które odwołuje się do tabeli.

Tabele

������ Pozwala użytkownikowi, któremu przyznano uprawnienie,na wydawanie instrukcji ������ dotyczącej obiektu.

Tabele, perspektywy,sekwencje, migawki

���� Pozwala użytkownikowi, któremu przyznano uprawnienie,na wydawanie instrukcji ���� dotyczącej obiektu.

Tabele, perspektywy

Istnieje wiele uprawnień systemowych, dotyczą one prawie każdej możliwej operacji DDL.Na przykład, uprawnienie systemowe ����������� pozwala użytkownikowi, któremuprzyznano to uprawnienie, na tworzenie tabel. Uprawnienie systemowe ���������3�����pozwala użytkownikowi, któremu przyznano uprawnienie, na tworzenie tabel w innymschemacie użytkownika. Publikacja Server SQL Reference dokumentuje wszystkie dostępneuprawnienia systemowe.

Instrukcje GRANT oraz REVOKE

Instrukcja 6���� jest używana w celu umożliwienia innemu schematowi uzyskania dostępudo danego uprawnienia, natomiast instrukcja ��1)7� służy do blokowania dostępu do upraw-nienia, uzyskanego za pomocą instrukcji 6����. Obydwie instrukcje mogą być stosowanedo zarządzania uprawnieniami systemowymi i obiektowymi.

Page 30: Oracle8. Programowanie w języku PL/SQL

114 Oracle8. Programowanie w języku PL/SQL

Instrukcja GRANT

Poniżej przedstawiono składnię instrukcji 6���� dla uprawnień obiektowych:

���������������� ��������� �����������L2��&������� �� �M*

gdzie �-�" ������ jest nadawanym uprawnieniem, �#��%� jest obiektem, do którego jest

przyznawany dostęp, a �$&�%� ��%� jest użytkownikiem, który otrzymuje uprawnienie.

Przykładowo, jeśli �$&�%� ��%� jest poprawnym schematem bazy danych, poniższa instruk-

cja 6���� jest prawidłowa:

������������� ��#��//�/�� � 78�<,9�.<�*

W razie określenia opcji �����6�����)���)� użytkownik �$&�%� ��%� otrzymuje prawo

przyznawania tego uprawnienia innym użytkownikom. W jednej instrukcji 6���� można

określać więcej niż jedno uprawnienie obiektowe, przykładowo:

����������"�������� ��/� -���/�� � 78�<,9�.<�*

Poniżej przedstawiono składnię instrukcji 6���� służącej do przydzielania uprawnień

systemowych:

����������������� �����������L2��&������� �� �M*

gdzie �-�" ������ jest uprawnieniem systemowym, a �$&�%� ��% jest użytkownikiem,

który otrzymuje uprawnienie. W razie określenia opcji ����������)���)� użytkownik

�$&�%� ��% otrzymuje prawo przyznawania tego uprawnienia innym użytkownikom.

Na przykład:

������������������"������������ �������,� 78�<,9�.<�*

Podobnie jak w przypadku instrukcji 6���� dla uprawnień obiektowych, w jednej instrukcji

6���� można określać większą liczbę uprawnień systemowych.

6���� jest instrukcją DDL, a więc jest natychmiast uaktywniana i po jej wykonaniu jest

wydawana niejawnie instrukcja potwierdzenia �)����.

Instrukcja REVOKE

Poniżej przedstawiono składnię instrukcji ��1)7�, która służy do odbierania uprawnień

obiektowych:

��� ������������� ��������F� ������������L��������� ���������M*

gdzie �-�" ������ jest odbieranym uprawnieniem, �#��%� jest obiektem, dla którego

uprawnienie jest odbierane, a �$&�%� ��% jest użytkownikiem, któremu uprawnienie jest

odbierane. Przykładowo, poniżej przedstawiono poprawny sposób zastosowania instrukcji

��1)7�:

��� ���������� ��#��//�/�F� �� 78�<,9�.<�*

W razie odbierania uprawnienia ��(������� i uwzględnienia klauzuli ��������)���������

następuje usunięcie wszystkich więzów integralności referencyjnej, utworzonych przez

użytkownika, któremu odbiera się to uprawnienie.

Page 31: Oracle8. Programowanie w języku PL/SQL

Rozdział 4. � SQL w PL/SQL 115

Istnieje możliwość odbierania wielu uprawnień za pomocą jednej instrukcji.

��� �������"�������"�������� ��/� -���/�F� �� 78�<,9�.<�*

Poniżej przedstawiono składnię instrukcji ��1)7�, za pomocą odbiera się uprawnieniasystemowe:

��� �������������F� �����������*

gdzie �-�" ������ jest odbieranym uprawnieniem systemowym, a �$&�%� ��% jest użyt-kownikiem, któremu jest odbierane dane uprawnienie. Poniżej podano przykładowe,poprawne zastosowanie instrukcji ��1)7�:

��� ��������������"������������� ������F� �� 78�<,9�.<�*

Role

W przypadku dużego systemu Oracle, gdzie istnieje wiele różnych kont użytkowników,zarządzanie uprawnieniami może być skomplikowanym zadaniem. W celu ułatwieniazarządzania kontami w systemie Oracle stosuje się role. Rola w zasadzie jest zbioremuprawnień, zarówno systemowych, jak i obiektowych. Warto przeanalizować następującyzestaw instrukcji:

�������� ���������D �%8*������������� ��/� -���/�� �������D �%8*������������� ��#��//�/�� �������D �%8*������������� ��%,,�/�� �������D �%8*

Z powyższego wynika, że roli ����������� przydzielono uprawnienie ������ na trzechróżnych tabelach. Teraz można przyznać tę rolę użytkownikom:

������������D �%8�� � 78�<,9�.<�*������������D �%8�� � 78�<,9�.<�*

W ten sposób użytkownicy: ������� ��� i ������� ��� otrzymali uprawnienie ������na trzech tabelach. Taki sposób postępowania może ułatwić zarządzanie systemem, po-nieważ powyższym działaniem zastąpiono sześć oddzielnych operacji przyznawaniauprawnienia ������.

Rola ����� jest rolą predefiniowaną w systemie Oracle. Jest ona przyznawana automa-tycznie każdemu użytkownikowi. A zatem można wykonywać poniższą instrukcję:

������ �%�9�.��.��� �����*

W ten sposób dane uprawnienie jest przyznawane każdemu użytkownikowi systemu Oracle.

W systemie Oracle istnieją także inne predefiniowane role. Zawierają one typowe upraw-nienia systemowe. Role te wymieniono w tabeli 4.4. Warto zauważyć, ze wszystkie wy-mienione w tej tabeli role są automatycznie przyznawane użytkownikowi �3����, któryjest predefiniowanym użytkownikiem systemu Oracle.

Zwykle role �)����� oraz ���)���� są przyznawane użytkownikom bazy danych, którzymają tworzyć obiekty schematu, a sama rola �)����� jest przyznawana użytkownikom,którzy wykonują zapytania na obiektach schematu. Użytkownicy, którym przyznano tylkorolę �)�����, mogą wymagać dodatkowych uprawnień na obiektach schematu, do którychmuszą mieć dostęp.

Page 32: Oracle8. Programowanie w języku PL/SQL

116 Oracle8. Programowanie w języku PL/SQL

Tabela 4.4. Predefiniowane role systemowe

Nazwa roli Przyznane uprawnienia

� ����� ����������� �, �������������, ��������������������, ������ ��=����,������������ �, ���������� ���, ������������, ������ ���2

��� ��� �������������, �������� �����, ���������=����, ������ �����, �������� �����

��� Wszystkie uprawnienia systemowe (z opcją ����� �� �, więc właściciel roli ���może je przyznawać z kolei innym użytkownikom), plus ���F�����������oraz ���F�����������

���F����������� ������ ��� �����, ���� ��� �����, plus ������, ����, ������ na tabelachsystemowych �1� ����$�, �1� ����� oraz �1� ���0��

���F����������� ��� ������

Sterowanie transakcjami

Transakcja jest serią instrukcji SQL, których wykonanie w ramach pewnej jednostki kończysię powodzeniem lub niepowodzeniem. Transakcje są standardowym elementem pracyrelacyjnej bazy danych i stanowią zabezpieczenie przed utratą spójności danych. Klasycz-nym przykładem powyższego jest transakcja bankowa. Warto rozważyć następujące dwieinstrukcje SQL, które przeprowadzają transfer kwoty transakcji ��������� ���� pomiędzydwoma kontami bankowymi, identyfikowanymi jako �� ��� ����� i �� ����������.

�����<,���������/��-,�0�/��-,�R�<9,����%��/�<#:.���%�<,����0�<,��,���-�9#8*�����<,���������/��-,�0�/��-,�H�<9,����%��/�<#:.���%�<,����0�<,��,�,-�.,%#8*

Na potrzeby niniejszego przykładu przyjęto, że pierwsza instrukcja ����� została wyko-nana z powodzeniem, ale wykonanie drugiej instrukcji zakończyło się niepowodzeniemz powodu wystąpienia pewnego błędu (przykładowo, uszkodzenie w bazie danych lubw sieci). W takiej sytuacji dane są niespójne — stan konta �� ��� ����� został zmniej-szony, ale stan konta �� ���������� nie został zwiększony. Jest oczywiste, że nie jestto pożądana sytuacja, zwłaszcza dla właściciela konta �� ��� �����. Przed taką sekwencjązdarzeń można się zabezpieczyć dzięki połączeniu powyższych dwóch instrukcji w jednątransakcję. W ten sposób albo obydwie transakcje zakończą się powodzeniem, albo oby-dwie transakcje zakończą się niepowodzeniem. Taki sposób postępowania zabezpieczaprzed utratą spójności danych.

Transakcja rozpoczyna się od pierwszej instrukcji SQL, wydanej po poprzedniej transakcji,lub pierwszą instrukcją SQL po nawiązaniu połączenia z bazą danych. Transakcja kończysię instrukcją �)���� lub �)����7.

Instrukcja COMMIT a instrukcja ROLLBACK

Po wydaniu instrukcji �)���� transakcja przeprowadzana w bazie danych zostanie zakoń-

czona. Wystąpią również poniższe zdarzenia:

Page 33: Oracle8. Programowanie w języku PL/SQL

Rozdział 4. � SQL w PL/SQL 117

� wyniki pracy wykonane przez transakcję zostaną trwale zachowane;

� zmiany dokonane przez transakcję będą widoczne w innych sesjach;

� wszystkie blokady ustawione przez transakcję zostaną zwolnione.

Poniżej przedstawiono składnię instrukcji �)����:

� �����L2 ��M

Opcjonalne słowo kluczowe �)�7 udostępniono w celu zwiększenia zgodności ze stan-

dardem SQL. Dopóki transakcja nie zostanie potwierdzona za pomocą instrukcji �)����,

zmiany dokonane przez tę transakcję są widoczne tylko w sesji, w której dana transakcja

jest wykonywana. Taką sytuację pokazano na rysunku 4.2. Najpierw w sesji A jest wyda-

wana instrukcja ������. W sesji B jest wykonywane zapytanie na tabeli ����, jednak

w sesji B nie jest widoczne wykonanie instrukcji ������ przeprowadzanej w sesji A, po-

nieważ nie zostało one potwierdzone. Następnie w sesji A następuje wydanie instrukcji

potwierdzenia �)����, a druga instrukcja ������ w sesji B pokaże nowo wstawiony wiersz.

Rysunek 4.2.Dwie sesje

Po wydaniu instrukcji �)����7 transakcja przeprowadzana w bazie danych zostaje za-

kończona oraz zachodzą następujące zdarzenia:

� wszystkie wyniki pracy wykonanej przez transakcję zostają wycofane, jak gdyby

transakcja nie była przeprowadzana;

� wszystkie blokady ustawiane przez transakcję zostają zwolnione.

Poniżej przedstawiono składnię instrukcji �)����7:

� �������L2 ��M

Podobnie jak w instrukcji �)����, opcjonalne słowo kluczowe �)�7 jest dostępne dla zwięk-

szenia zgodności ze standardem SQL. Niejawna instrukcja �)����7 jest często wykonywa-

na w razie wykrycia w programie błędu, który uniemożliwia dalszą pracę. W razie nagłego

zakończenia sesji (na przykład w razie zerwania połączenia z bazą danych) bez zakończenia

Page 34: Oracle8. Programowanie w języku PL/SQL

118 Oracle8. Programowanie w języku PL/SQL

przeprowadzanej transakcji za pomocą instrukcji �)���� lub �)����7, transakcja jest

automatycznie wycofywana z bazy danych.

Program SQL*Plus automatycznie wydaje instrukcję � ���� przy zakańczaniu pracyprogramu. Także uaktywnienie opcji ������ �� powoduje wydawanie instrukcji � ����po przeprowadzeniu każdej instrukcji SQL. Jednak nie ma to wpływu na sposób zacho-wania instrukcji SQL zawartych wewnątrz bloku PL/SQL, ponieważ program SQL*Plusnie ma kontroli nad tymi instrukcjami przed zakończeniem działania bloku PL/SQL.

Punkty zachowania

Z poprzedniego podrozdziału wynika, że wydanie instrukcji �)����7 powoduje wycofanie

całej transakcji. Warto jednak wiedzieć, że po zastosowaniu instrukcji ��1��)��� tylko

część transakcji wymaga wycofania. Poniżej przedstawiono składnię instrukcji ��1��)���:

���� ���������*

gdzie �"$ " jest nazwą punktu zachowania. Nazwy punktów zachowania podlegają tymsamym zasadom składniowym, co identyfikatory SQL (patrz rozdział 2.). Należy zwrócićuwagę, że punkty zachowania nie są deklarowane w sekcji deklaracji, ponieważ dla danejtransakcji mają one znaczenie globalne i wykonywanie transakcji może być kontynuowaneaż do zakończenia bloku. Zatem jeśli zdefiniowano punkt zachowania, wykonywanie pro-gramu może być cofnięte do danego punktu zachowania. W tym celu wydaje się polecenieo następującej składni:

� ������L2 ��M�� ����� ���������*

Po wydaniu polecenia �)����7��)���1��)��� zachodzą następujące zdarzenia:

� każde działanie wykonane od punktu zachowania jest wycofywane. Jednak sampunkt wycofania pozostaje aktywny. W razie potrzeby punkt zachowania możebyć wykorzystany do ponownego wycofania części transakcji;

� blokady i zasoby nabyte dzięki instrukcjom SQL od punktu zachowania zostajązwolnione;

� transakcja nie ulega zakończeniu, ponieważ wykonywanie instrukcji SQLw dalszym ciągu jest zawieszone.

Warto rozważyć następujący fragment bloku PL/SQL:

����������������� �������������#$�%�#,�)��������+2/��9�:�-��+)*������ �����*������������ �������������#$�%�#,�)��������+2/��9�-9�+)*������ �����*������������ �������������#$�%�#,�)��������+2/��9��%78+)*������ �����*��56�� ��:�.�/�% <#:���%�< :�#�65��� ����*���*

Jeżeli do instrukcji brakujących zostanie wprowadzona instrukcja:

� �������� ��*

Page 35: Oracle8. Programowanie w języku PL/SQL

Rozdział 4. � SQL w PL/SQL 119

wtedy trzecia instrukcja ������ oraz punkt zachowania C zostaną wycofane. Jednak dwie

pierwsze instrukcje ������ będą przetwarzane. Z drugiej strony, jeżeli do instrukcji bra-

kujących zostanie wprowadzona instrukcja:

� �������� ��*

wtedy druga i trzecia instrukcja ������ zostanie wycofana i do przetwarzania pozostanie

tylko pierwsza instrukcja ������.

Instrukcja ��1��)��� jest często używana przed rozpoczęciem skomplikowanej sekcji trans-

akcji. Jeżeli część transakcji nie powiedzie się, można ją wycofać, a następnie kontynuować

jej wcześniejszą część.

Transakcje a bloki

Należy zwrócić uwagę na pewne różnice między transakcjami a blokami PL/SQL. Roz-

poczęcie wykonywania bloku nie oznacza rozpoczęcia wykonywania transakcji. Podobnie

rozpoczęcie wykonywania transakcji nie musi wiązać się z rozpoczęciem wykonywania

bloku. Przykładowo, warto rozważyć sytuację, w której z wiersza poleceń programu

SQL*Plus wydano następujące instrukcje:

Dostępne na płycie CD w skrypcie 1trans.sql

���������� �#��//�/����-���%�����"�#, %/�"�-�/#%.��.,�"���P�/� -���/"����# %%����/� -���/"�� ��#%�-.�/"�%,,��.-)���������+��+"�'('"�+�,�� ��%��#.��#��'('+"�O("�'("�?"�GGGGS)*������������%,,�/��������%,,��.-�0�%,,��.-�>�'(((*��� �������2 ��*���*

Z powyższego fragmentu kodu wynika, ze wydano instrukcję ������, a następnie ano-

nimowy blok PL/SQL. W bloku tym znajduje się instrukcja ����� i następnie instrukcja

�)����7. Instrukcja �)����7 wycofuje nie tylko instrukcję �����, ale również wcze-

śniejszą instrukcję ������. Zarówno instrukcja ������, jak i blok są częścią tej samej sesji

bazy danych, a w ten sposób także tej samej transakcji.

W podobny sposób jeden blok może zawierać w sobie wiele transakcji. Przykładowo:

Dostępne na płycie CD w skrypcie 1block.sql

���������!�� ����%��.,�/��������*�������>>�28<,��:�������,-�'�-,�O(("�9/��9.�:�#����9�%�,/#.�-,������.��>>�����������3�28<,� :�.�/�% <#:��� ������,�<�7-8#$�O(�9.�%/7�#$3��F ��!��,,��, ���%����'33O((�� �������������� �������������� ��#,�)��������!��,,��, ���%)*����!�� ����%��.,�/�B0�!�� ����%��.,�/�H�'*

Page 36: Oracle8. Programowanie w języku PL/SQL

120 Oracle8. Programowanie w języku PL/SQL

�����F�!�� ����%��.,�/�0�O(��&��������� ����*������!�� ����%��.,�/�B0�(*���������F*������� *���*

Powyższy blok powoduje wstawianie liczb o wartościach od 1 do 500 do tabeli ����������

i potwierdza wstawienie tych liczb po każdych 50 wierszach. Zatem podczas wykonania

jednego bloku zostanie przeprowadzonych 10 transakcji.

Podsumowanie

W niniejszym rozdziale ogólnie omówiono zagadnienia dotyczące instrukcji SQL, DML

oraz instrukcji sterowania transakcjami, dozwolonymi w szczególności w języku PL/SQL.

Podano również informacje związane z uprawnieniami i rolami, a także przedstawiono

sposób zabezpieczania danych przed utratą spójności za pomocą mechanizmu transakcji.

W następnym rozdziale zostaną opisane wbudowane funkcje SQL. W rozdziale 6. zostaną

omówione kursory, które są stosowane dla zapytań wielowierszowych. W celu prawi-

dłowego zrozumienia prezentowanych tam zagadnień należy przeanalizować koncepcje

przedstawione w niniejszym oraz w kolejnym rozdziale.