SlideShare a Scribd company logo
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TRE CI   Oracle9i. Programowanie
                                         w jêzyku PL-SQL
           KATALOG KSI¥¯EK
                                         Autor: Scott Urman
                      KATALOG ONLINE     T³umaczenie: Rados³aw Meryk
                                         ISBN: 83-7361-065-0
       ZAMÓW DRUKOWANY KATALOG           Format: B5, stron: 536


              TWÓJ KOSZYK                Wykorzystanie wbudowanego w system Oracle jêzyka PL/SQL w znacz¹cy sposób
                                         zwiêksza wydajno æ programisty systemów bazodanowych. PL/SQL ³¹czy w sobie
                    DODAJ DO KOSZYKA     mo¿liwo ci i elastyczno æ jêzyka czwartej generacji (4GL) SQL z konstrukcjami
                                         proceduralnymi jêzyka trzeciej generacji (3GL). Konstrukcje proceduralne s¹ w pe³ni
                                         zintegrowane z Oracle SQL, co daje w rezultacie jêzyk strukturalny o ogromnym
         CENNIK I INFORMACJE             potencjale. Programy napisane w tym jêzyku umo¿liwiaj¹ obs³ugê danych zarówno
                                         w samym systemie Oracle, jak i w zewnêtrznych aplikacjach.
                   ZAMÓW INFORMACJE      Ksi¹¿ka „Oracle9i. Programowanie w jêzyku PL/SQL” wyja nia g³ówne w³a ciwo ci
                     O NOWO CIACH        jêzyka oraz ró¿nice w PL/SQL dla ró¿nych wersji bazy danych. Dziêki niej nauczysz siê
                                         projektowaæ, testowaæ i uruchamiaæ aplikacje PL/SQL dzia³aj¹ce w wielu rodowiskach,
                       ZAMÓW CENNIK      jak równie¿ poznasz szczegó³y zastosowania jêzyków SQL i PL/SQL, obs³ugi b³êdów,
                                         zbioru podprogramów i pakietów, a tak¿e wiele zaawansowanych w³a ciwo ci.
                                         Niniejsza pozycja umo¿liwia:
                 CZYTELNIA                  • Zapoznanie siê z ró¿nymi rodowiskami programistycznymi jêzyka PL/SQL,
                                              których kopie znajduj¹ siê na do³¹czonej p³ycie CD
          FRAGMENTY KSI¥¯EK ONLINE
                                            • Poznanie szczegó³ów sk³adni jêzyka PL/SQL: zmienne, typy danych, wyra¿enia,
                                              operatory oraz struktury steruj¹ce
                                            • Zapewnienie spójno ci danych dziêki instrukcjom sterowania transakcjami
                                              dostêpnym w SQL-u
                                            • Wykorzystanie kursorów, które pozwalaj¹ na tworzenie zapytañ zwracaj¹cych
                                              wiele wierszy oraz jawn¹ kontrolê przetwarzania instrukcji SQL
                                            • Tworzenie programów PL/SQL, które wykrywaj¹ i inteligentnie reaguj¹ na b³êdy
                                              fazy wykonania
                                            • Wykorzystanie mo¿liwo ci tworzenia kolekcji wielopoziomowych w systemie
                                              Oracle9i
                                            • Tworzenie i korzystanie z procedur, funkcji i pakietów
Wydawnictwo Helion                          • Tworzenie wyzwalaczy DML zastêpuj¹cych i systemowych w celu wymuszania
ul. Chopina 6                                 z³o¿onych ograniczeñ danych
44-100 Gliwice                              • Korzystanie z zalet jêzyka PL/SQL, takich jak: procedury zewnêtrzne, wbudowany
tel. (32)230-98-63                            dynamiczny SQL, masowe powi¹zania oraz typy obiektowe
e-mail: helion@helion.pl
Spis treści
O Autorze.................................................................................................................13
Wstęp......................................................................................................................15

Część I          Wstęp i środowiska programisty ...........................................21
Rozdział 1. Wprowadzenie do języka PL/SQL............................................................23
                 Dlaczego język PL/SQL?............................................................................................... 23
                     PL/SQL a praca w sieci............................................................................................ 25
                     Normy.................................................................................................................... 26
                 Właściwości języka PL/SQL.......................................................................................... 26
                     Struktura bloku ....................................................................................................... 26
                     Obsługa błędów....................................................................................................... 27
                     Zmienne i typy danych............................................................................................. 27
                     Instrukcje warunkowe.............................................................................................. 28
                     Konstrukcje pętli ..................................................................................................... 29
                     Kursory .................................................................................................................. 29
                     Procedury i funkcje ................................................................................................. 30
                     Pakiety ................................................................................................................... 31
                     Kolekcje ................................................................................................................. 32
                 Konwencje stosowane w ksią ce .................................................................................... 32
                     Wersje języka PL/SQL oraz bazy danych Oracle........................................................ 32
                     Czcionki ................................................................................................................. 34
                     Dokumentacja Oracle .............................................................................................. 34
                     Kod dostępny na płycie CD ...................................................................................... 34
                 Przykładowe tabele ....................................................................................................... 35
                 Podsumowanie.............................................................................................................. 40
Rozdział 2. Środowiska programisty oraz wykonawcze..............................................41
                 Modele aplikacji a PL/SQL............................................................................................ 41
                    Model dwuwarstwowy............................................................................................. 41
                    Model trójwarstwowy .............................................................................................. 45
                    Połączenie z bazą danych......................................................................................... 46
                 Narzędzia programisty PL/SQL...................................................................................... 47
                    Program SQL*Plus.................................................................................................. 48
                    Program Rapid SQL ................................................................................................ 52
                    Program DBPartner Debugger .................................................................................. 56
                    Program SQL Navigator........................................................................................... 60
                    Program TOAD....................................................................................................... 64
                    Program SQL-Programmer....................................................................................... 68
                    Program PL/SQL Developer..................................................................................... 71
                    Narzędzia programistyczne — podsumowanie ........................................................... 73
                 Podsumowanie.............................................................................................................. 74
6          Oracle9i. Programowanie w języku PL/SQL


Część II       Podstawowe właściwości języka PL/SQL ..............................75
Rozdział 3. Podstawy języka PL/SQL .......................................................................77
               Blok PL/SQL................................................................................................................ 77
                   Podstawowa struktura bloku..................................................................................... 82
               Jednostki leksykalne ...................................................................................................... 84
                   Identyfikatory ......................................................................................................... 84
                   Ograniczniki ........................................................................................................... 87
                   Literały................................................................................................................... 87
                   Komentarze ............................................................................................................ 89
               Deklaracje zmiennych.................................................................................................... 91
                   Składnia deklaracji .................................................................................................. 91
                   Inicjowanie zmiennych ............................................................................................ 93
               Typy danych w języku PL/SQL...................................................................................... 93
                   Typy skalarne ......................................................................................................... 94
                   Typy zło one ........................................................................................................ 103
                   Typy odnośników.................................................................................................. 103
                   Typy LOB ............................................................................................................ 103
                   Typy obiektowe .................................................................................................... 104
                   Wykorzystanie atrybutu %Type.............................................................................. 104
                   Podtypy definiowane przez u ytkownika ................................................................. 105
                   Konwersja pomiędzy typami danych ....................................................................... 106
                   Zakres i widoczność zmiennej ................................................................................ 108
               Wyra enia i operatory.................................................................................................. 109
                   Przypisanie ........................................................................................................... 109
                   Wyra enia ............................................................................................................ 110
               Struktury sterowania PL/SQL ...................................................................................... 113
                   Instrukcja IF-THEN-ELSE..................................................................................... 113
                   Instrukcja CASE ................................................................................................... 117
                   Pętle..................................................................................................................... 121
                   Instrukcje GOTO oraz etykiety ............................................................................... 125
                   Dyrektywy pragma ................................................................................................ 127
               Rekordy w języku PL/SQL .......................................................................................... 128
                   Przypisanie rekordu ............................................................................................... 129
                   Zastosowanie operatora %ROWTYPE .................................................................... 131
               Styl programowania w języku PL/SQL ......................................................................... 131
                   Wprowadzanie komentarzy .................................................................................... 132
                   Styl nazw zmiennych ............................................................................................. 133
                   Stosowanie du ych liter ......................................................................................... 133
                   Stosowanie odstępów............................................................................................. 133
                   Ogólne uwagi dotyczące stylu programowania ......................................................... 134
               Podsumowanie............................................................................................................ 134
Rozdział 4. SQL w języku PL/SQL ..........................................................................135
               Instrukcje SQL ........................................................................................................... 135
                   Wykorzystanie instrukcji SQL w języku PL/SQL..................................................... 136
                   Stosowanie dynamicznego SQL.............................................................................. 137
               Stosowanie instrukcji DML w języku PL/SQL............................................................... 137
                   Instrukcja SELECT ............................................................................................... 139
                   Instrukcja INSERT................................................................................................ 141
                   Instrukcja UPDATE .............................................................................................. 142
                   Instrukcja DELETE............................................................................................... 143
                   Klauzula WHERE ................................................................................................. 144
                   Wiązania zbiorcze ................................................................................................. 147
                   Klauzula RETURNING ......................................................................................... 149
Spis treści                   7


                    Odnośniki do tabel................................................................................................. 150
                    Powiązania bazy danych ........................................................................................ 151
                    Synonimy ............................................................................................................. 151
                Pseudokolumny .......................................................................................................... 152
                    Pseudokolumny CURRVAL oraz NEXTVAL.......................................................... 152
                    Pseudokolumna LEVEL......................................................................................... 153
                    Pseudokolumna ROWID........................................................................................ 153
                    Pseudokolumna ROWNUM ................................................................................... 154
                Instrukcje GRANT i REVOKE. Uprawnienia ................................................................ 154
                    Uprawnienia obiektowe a uprawnienia systemowe ................................................... 155
                    Instrukcje GRANT oraz REVOKE.......................................................................... 155
                    Role ..................................................................................................................... 157
                Sterowanie transakcjami .............................................................................................. 159
                    Instrukcja COMMIT a instrukcja ROLLBACK ........................................................ 159
                    Punkty zachowania................................................................................................ 160
                    Transakcje a bloki ................................................................................................. 161
                    Transakcje autonomiczne ....................................................................................... 162
                Podsumowanie............................................................................................................ 167
Rozdział 5. Wbudowane funkcje SQL......................................................................169
                Wstęp ........................................................................................................................ 169
                Funkcje znakowe zwracające wartości znakowe............................................................. 170
                    Funkcje SUBSTR, SUBSTRB, SUBSTRC, SUBSTR2 oraz SUBSTR4 ..................... 173
                    SOUNDEX........................................................................................................... 174
                Funkcje znakowe zwracające wartości liczbowe............................................................. 175
                    Funkcje INSTR, INSTRB, INSTRC, INSTR2 oraz INSTR4 ..................................... 176
                    Funkcje LENGTH, LENGTHB, LENGTHC, LENGTH2 ? oraz LENGTH4............... 177
                Funkcje NLS .............................................................................................................. 178
                Funkcje numeryczne ................................................................................................... 180
                    Funkcja WIDTH_BUCKET ................................................................................... 181
                Funkcje związane z datą .............................................................................................. 182
                    Arytmetyka dat ..................................................................................................... 184
                Funkcje konwersji ....................................................................................................... 186
                    Funkcja TO_CHAR (daty lub etykiety) ................................................................... 189
                    Funkcja TO_CHAR (liczby)................................................................................... 191
                    Funkcja TO_DATE ............................................................................................... 193
                    Funkcja TO_NUMBER ......................................................................................... 193
                    Funkcje TO_TIMESTAMP oraz TO_TIMESTAMP_TZ .......................................... 194
                Funkcje agregacji oraz funkcje analityczne .................................................................... 194
                Inne funkcje ............................................................................................................... 196
                    Funkcja DUMP..................................................................................................... 199
                    Funkcja USERENV............................................................................................... 201
                Podsumowanie............................................................................................................ 202
Rozdział 6. Kursory ...............................................................................................203
                Czym jest kursor? ....................................................................................................... 203
                    Przetwarzanie kursorów jawnych............................................................................ 204
                    Przetwarzanie kursorów niejawnych ....................................................................... 212
                Pętle pobierania danych kursora ................................................................................... 214
                    Pętle proste........................................................................................................... 214
                    Pętle WHILE ........................................................................................................ 216
                    Pętle FOR kursora................................................................................................. 217
                    Wyjątek NO_DATA_FOUND a atrybut %NOTFOUND .......................................... 219
                    Kursory z klauzulą FOR UPDATE instrukcji SELECT............................................. 219
8           Oracle9i. Programowanie w języku PL/SQL


                Zmienne kursora ......................................................................................................... 223
                   Deklaracja zmiennej kursora................................................................................... 224
                   Przydzielenie obszaru pamięci dla zmiennych kursora .............................................. 225
                   Otwieranie zmiennej kursora dla zapytania .............................................................. 226
                   Zamykanie zmiennych kursora ............................................................................... 227
                   Pierwszy przykład zmiennej kursora ....................................................................... 227
                   Drugi przykład zmiennej kursora ............................................................................ 229
                   Ograniczenia u ycia zmiennych kursora .................................................................. 230
                Podsumowanie............................................................................................................ 231
Rozdział 7. Obsługa błędów ...................................................................................233
                Czym jest wyjątek? ..................................................................................................... 233
                   Deklarowanie wyjątków......................................................................................... 235
                   Zgłaszanie wyjątków ............................................................................................. 239
                   Obsługa wyjątków................................................................................................. 240
                   Dyrektywa pragma EXCEPTION_INIT .................................................................. 246
                   Zastosowanie funkcji RAISE_APPLICATION_ERROR .......................................... 247
                Propagacja wyjątków .................................................................................................. 250
                   Wyjątki wywołane w sekcji wykonania ................................................................... 250
                   Wyjątki zgłaszane w sekcji deklaracji...................................................................... 252
                   Wyjątki zgłaszane w sekcji wyjątków...................................................................... 254
                Wskazówki dotyczące wyjątków .................................................................................. 256
                   Zakres wyjątków................................................................................................... 256
                   Unikanie nieobsługiwanych wyjątków..................................................................... 257
                   Maskowanie lokalizacji błędu................................................................................. 258
                Ogólny program obsługi błędów ................................................................................... 259
                Podsumowanie............................................................................................................ 266
Rozdział 8. Kolekcje..............................................................................................267
                Deklaracje i stosowanie typów kolekcji ......................................................................... 267
                   Tabele indeksowane .............................................................................................. 268
                   Tabele zagnie d one.............................................................................................. 272
                   Tablice VARRAY ................................................................................................. 276
                   Kolekcje wielopoziomowe ..................................................................................... 278
                   Porównanie pomiędzy typami kolekcji .................................................................... 279
                Kolekcje w bazie danych ............................................................................................. 281
                   Implikacje dotyczące kolekcji zapisanych w bazie danych......................................... 281
                   Modyfikowanie całych kolekcji .............................................................................. 285
                   Działania z indywidualnymi elementami kolekcji ..................................................... 291
                Metody kolekcji .......................................................................................................... 297
                   EXISTS ............................................................................................................... 297
                   COUNT ............................................................................................................... 299
                   LIMIT.................................................................................................................. 300
                   FIRST i LAST ...................................................................................................... 301
                   NEXT i PRIOR..................................................................................................... 301
                   EXTEND ............................................................................................................. 302
                   TRIM................................................................................................................... 304
                   DELETE .............................................................................................................. 306
                Podsumowanie............................................................................................................ 308

Część III Dodatkowe właściwości języka PL/SQL ..............................309
Rozdział 9. Tworzenie procedur, funkcji i pakietów.................................................311
                Procedury i funkcje ..................................................................................................... 311
                   Tworzenie podprogramu ........................................................................................ 312
                   Parametry podprogramów ...................................................................................... 318
Spis treści                   9


                   Instrukcja CALL ................................................................................................... 336
                   Procedury a funkcje............................................................................................... 339
                Pakiety....................................................................................................................... 339
                   Specyfikacja pakietu .............................................................................................. 339
                   Treść pakietu ........................................................................................................ 341
                   Pakiety i zakres ..................................................................................................... 343
                   Przecią anie podprogramów pakietowych................................................................ 345
                   Inicjalizacja pakietu ............................................................................................... 348
                Podsumowanie............................................................................................................ 350
Rozdział 10. Zastosowanie procedur, funkcji i pakietów...........................................351
                Poło enie podprogramów............................................................................................. 351
                    Podprogramy składowane oraz słownik danych........................................................ 351
                    Podprogramy lokalne ............................................................................................. 354
                    Podprogramy składowane a podprogramy lokalne .................................................... 359
                Zagadnienia dotyczące podprogramów składowanych i pakietów .................................... 360
                    Zale ności pomiędzy podprogramami ..................................................................... 360
                    Stan pakietów w czasie wykonywania ..................................................................... 370
                    Uprawnienia i podprogramy składowane ................................................................. 375
                Stosowanie składowanych funkcji w instrukcjach SQL................................................... 385
                    Poziomy czystości ................................................................................................. 386
                    Parametry domyślne .............................................................................................. 393
                    Wywołanie funkcji składowanych z instrukcji SQL w systemie Oracle8i.................... 393
                Przytwierdzanie obiektów w obszarze wspólnym ........................................................... 396
                    KEEP................................................................................................................... 397
                    UNKEEP ............................................................................................................. 398
                    SIZES .................................................................................................................. 398
                    ABORTED_REQUEST_THRESHOLD ................................................................. 398
                Podsumowanie............................................................................................................ 398
Rozdział 11. Wyzwalacze.........................................................................................399
                Rodzaje wyzwalaczy ................................................................................................... 399
                Tworzenie wyzwalaczy................................................................................................ 403
                   Tworzenie wyzwalaczy DML................................................................................. 403
                   Tworzenie wyzwalaczy zastępujących..................................................................... 413
                   Tworzenie wyzwalaczy systemowych ..................................................................... 419
                   Inne zagadnienia związane z wyzwalaczami ............................................................ 426
                   Wyzwalacze a słownik danych ............................................................................... 430
                Tabele mutujące.......................................................................................................... 432
                   Przykład tabeli mutującej ....................................................................................... 434
                   Rozwiązanie problemu błędu tabeli mutującej.......................................................... 435
                Podsumowanie............................................................................................................ 438
Rozdział 12. Zaawansowane właściwości ................................................................439
                Właściwości języka ..................................................................................................... 439
                   Procedury zewnętrzne............................................................................................ 439
                   Wbudowany dynamiczny SQL ............................................................................... 442
                   Masowe powiązania............................................................................................... 447
                   Typy obiektowe .................................................................................................... 454
                   Du e obiekty......................................................................................................... 458
                   Potokowe funkcje tabel.......................................................................................... 461
                Zaawansowane pakiety ................................................................................................ 462
                   DBMS_SQL ......................................................................................................... 462
                   DBMS_PIPE ........................................................................................................ 463
                   DBMS_ALERT .................................................................................................... 465
10         Oracle9i. Programowanie w języku PL/SQL


                  UTL_FILE ........................................................................................................... 466
                  UTL_TCP ............................................................................................................ 467
                  UTL_SMTP ......................................................................................................... 468
                  UTL_HTTP.......................................................................................................... 469
                  UTL_INADDR ..................................................................................................... 470
                  DBMS_JOB ......................................................................................................... 470
                  DBMS_LOB......................................................................................................... 472
               Podsumowanie............................................................................................................ 475

Dodatki ...............................................................................................477
Dodatek A Pakiety dostępne w języku PL/SQL ......................................................479
               Opis pakietów ............................................................................................................. 479
                  DBMS_ALERT .................................................................................................... 479
                  DBMS_APPLICATION_INFO.............................................................................. 480
                  DBMS_AQ........................................................................................................... 480
                  DBMS_AQADM .................................................................................................. 480
                  DBMS_AQELM ................................................................................................... 480
                  DBMS_BACKUP_RESTORE ............................................................................... 481
                  DBMS_DDL ........................................................................................................ 481
                  DBMS_DEBUG ................................................................................................... 481
                  DBMS_DEFER .................................................................................................... 482
                  DBMS_DEFER_QUERY ...................................................................................... 482
                  DBMS_DEFER_SYS ............................................................................................ 482
                  DBMS_DESCRIBE .............................................................................................. 482
                  DBMS_DISTRIBUTED_TRUST_ADMIN ............................................................. 483
                  DBMS_FGA......................................................................................................... 483
                  DBMS_FLASHBACK........................................................................................... 483
                  DBMS_HS ........................................................................................................... 483
                  DBMS_HS_PASSTHROUGH ............................................................................... 484
                  DBMS_IOT.......................................................................................................... 484
                  DBMS_JAVA....................................................................................................... 484
                  DBMS_JOB ......................................................................................................... 484
                  DBMS_LDAP ...................................................................................................... 485
                  DBMS_LIBCACHE .............................................................................................. 485
                  DBMS_LOB......................................................................................................... 485
                  DBMS_LOCK ...................................................................................................... 485
                  DBMS_LOGMNR ................................................................................................ 485
                  DBMS_LOGMNR_CDC_PUBLISH ...................................................................... 486
                  DBMS_LOGMNR_CDC_SUBSCRIBE.................................................................. 486
                  DBMS_LOGMNR_D............................................................................................ 486
                  DBMS_METADATA............................................................................................ 486
                  DBMS_MVIEW (DBMS_SNAPSHOT) ................................................................. 487
                  DBMS_OBFUSCATION_TOOLKIT ..................................................................... 487
                  DBMS_ODCI ....................................................................................................... 487
                  DBMS_OFFLINE_OG .......................................................................................... 487
                  DBMS_OFFLINE_SNAPSHOT ............................................................................ 487
                  DBMS_OLAP ...................................................................................................... 488
                  DBMS_ORACLE_TRACE_AGENT...................................................................... 488
                  DBMS_ORACLE_TRACE_USER ......................................................................... 488
                  DBMS_OUTLN ................................................................................................... 488
                  DBMS_OUTLN_EDIT ......................................................................................... 488
                  DBMS_OUTPUT ................................................................................................. 489
                  DBMS_PCLXUTIL .............................................................................................. 489
Spis treści                11


                    DBMS_PIPE ........................................................................................................ 489
                    DBMS_PROFILER............................................................................................... 489
                    DBMS_RANDOM ................................................................................................ 490
                    DBMS_RECTIFIER_DIFF.................................................................................... 490
                    DBMS_REDIFINITION........................................................................................ 490
                    DBMS_REFRESH ................................................................................................ 490
                    DBMS_REPAIR ................................................................................................... 490
                    DBMS_REPCAT, DBMS_REPCAT_ADMIN, DBMS_REPCAT_ INSTANTIATE,
                     DBMS_REPCAT_RGT oraz DBMS_REPUTIL.................................................... 491
                    DBMS_RESOURCE_MANAGER i DBMS_RESOURCE_ MANAGER_PRIVS....... 491
                    DBMS_RESUMABLE .......................................................................................... 491
                    DBMS_RLS ......................................................................................................... 492
                    DBMS_ROWID.................................................................................................... 492
                    DBMS_SESSION ................................................................................................. 492
                    DBMS_SHARED_POOL ...................................................................................... 492
                    DBMS_SPACE i DBMS_SPACE_ADMIN............................................................. 493
                    DBMS_SQL ......................................................................................................... 493
                    DBMS_STANDARD i STANDARD ...................................................................... 493
                    DBMS_STATS..................................................................................................... 493
                    DBMS_TRACE .................................................................................................... 493
                    DBMS_TRANSACTION ...................................................................................... 494
                    DBMS_TRANSFORM.......................................................................................... 494
                    DBMS_TTS ......................................................................................................... 494
                    DBMS_TYPES..................................................................................................... 494
                    DBMS_UTILITY ................................................................................................. 495
                    DBMS_WM ......................................................................................................... 495
                    DBMS_XMLQUERY, DBMS_XMLSAVE i XMLGEN .......................................... 495
                    DEBUG_EXTPROC ............................................................................................. 495
                    SDO_CS, SDO_GEOM, SDE_LRS, SDO_MIGRATE i SDO_TUNE ....................... 495
                    UTL_COLL ......................................................................................................... 496
                    UTL_ENCODE .................................................................................................... 496
                    UTL_FILE ........................................................................................................... 496
                    UTL_HTTP.......................................................................................................... 496
                    UTL_INADDR ..................................................................................................... 497
                    UTL_PG .............................................................................................................. 497
                    UTL_RAW........................................................................................................... 497
                    UTL_REF ............................................................................................................ 497
                    UTL_SMTP ......................................................................................................... 498
                    UTL_TCP ............................................................................................................ 498
                    UTL_URL............................................................................................................ 498
Dodatek B Słowa kluczowe w języku PL/SQL.........................................................499
               Tablica zarezerwowanych słów .................................................................................... 499
Dodatek C Słownik danych ...................................................................................503
               Czym jest słownik danych? .......................................................................................... 503
                   Standardy nazewnictwa.......................................................................................... 503
                   Uprawnienia ......................................................................................................... 504
                   Rodzaje perspektyw .............................................................................................. 504
               Zestawienie dostępnych perspektyw ............................................................................. 505
                   Relacyjne klastry, tabele i perspektywy ................................................................... 505
                   Kolekcje, obiekty LOB oraz typy obiektowe............................................................ 507
                   Perspektywy wprowadzone w systemach Oracle8i oraz Oracle9i .............................. 508
                   Inne obiekty bazy danych....................................................................................... 510
                   Partycje i podpartycje ............................................................................................ 511
12           Oracle9i. Programowanie w języku PL/SQL


                    Indeksy ................................................................................................................ 513
                    Materializowane perspektywy, podsumowania i migawki.......................................... 514
                    Podprogramy, metody i wyzwalacze ....................................................................... 516
                    Kody źródłowe i błędy kompilacji........................................................................... 517
                    Zale ności i ograniczenia ....................................................................................... 518
                    Statystyki i audyt................................................................................................... 518
                 Uprawnienia i ich nadawanie........................................................................................ 519
Skorowidz .............................................................................................................521
Rozdział 11.
Wyzwalacze
    Wyzwalacze stanowią czwarty typ bloków nazwanych PL/SQL. Posiadają wiele właści-
    wości charakterystycznych dla podprogramów (które omówiono w poprzednich dwóch
    podrozdziałach), ale tak e ró nią się od nich w istotny sposób. W niniejszym rozdziale
    Czytelnik zapozna się ze sposobem tworzenia wyzwalaczy oraz z niektórymi mo liwymi
    zastosowaniami tych obiektów.



Rodzaje wyzwalaczy
    Wyzwalacze są podobne do procedur lub funkcji pod tym względem, e są nazwanymi
    blokami PL/SQL, w których występują sekcje deklaracji, wykonania i obsługi wyjątków.
    Podobnie jak pakiety, wyzwalacze muszą być składowane jako samodzielne obiekty
    w bazie danych i nie mogą występować lokalnie w bloku lub w pakiecie. Jak napisano
    w ostatnich dwóch rozdziałach, procedura jest wykonywana jawnie z innego bloku za
    pośrednictwem wywołania procedury, które daje mo liwość przekazania argumentów.
    Wyzwalacz natomiast jest wykonywany niejawnie, jeśli wystąpi zdarzenie wyzwalają-
    ce. Poza tym wyzwalacz nie akceptuje argumentów. Rozpoczęcie wykonywania wyzwa-
    lacza jest nazywane uruchamianiem wyzwalacza (firing). Zdarzeniem wyzwalającym mo-
     e być operacja DML (instrukcje +05'46, 72&#6' lub &'.'6') wykonywana dla tabeli bazy
    danych lub odpowiedniego rodzaju perspektyw. W systemie Oracle8i rozszerzono mo li-
    wości uruchamiania wyzwalaczy o zdarzenia systemowe, takie jak: uruchomienie lub za-
    mknięcie bazy danych, a tak e określone rodzaje operacji DDL. Zdarzenia wyzwalające
    zostaną szczegółowo omówione w dalszej części tego rozdziału.

    Wyzwalacze mo na stosować do wielu celów, przykładowo:
        Utrzymywanie zło onych więzów integralności, niemo liwych do uzyskania
        przez więzy deklaracji uaktywniane podczas tworzenia tabeli.
        Kontrola danych w tabeli przez rejestrowanie dokonywanych zmian oraz autorów
        tych zmian.
        Automatyczne przekazywanie do innych programów informacji, e jest wymagane
        podjęcie określonych działań w razie dokonania zmian w tabeli.
        Publikowanie informacji na temat ró nego rodzaju zdarzeń w środowisku
        publikowanie-subskrypcja.
400   Część III   Dodatkowe właściwości języka PL/SQL


      Istnieją trzy podstawowe rodzaje wyzwalaczy: DML, zastępujące (instead-of) oraz syste-
      mowe. W następnych podrozdziałach będzie omówiony ka dy z tych typów, szczegó-
      łowo w podrozdziale „Tworzenie wyzwalaczy”.

        W systemie Oracle8i oraz w wersjach wyższych istnieje możliwość pisania wyzwalaczy
        zarówno w języku PL/SQL, jak i innych. Wyzwalacze te można następnie wywołać ja-
        ko procedury zewnętrzne. Więcej informacji na ten temat znajduje się w podrozdziale
        „Treść wyzwalaczy”, a także w rozdziale 12.


Wyzwalacze DML
      Wyzwalacze DML są uruchamiane przez instrukcje DML, a typ wyzwalacza DML jest
      określany przez typ instrukcji. Mo na je definiować dla operacji +05'46, 72&#6' lub &'.'6',
      uruchamiać przed operacją lub po niej, a tak e w związku z operacjami dotyczącymi wier-
      sza lub instrukcji.

      Przykładowo, mo e zachodzić potrzeba śledzenia danych statystycznych, dotyczących ró -
      nych specjalności, włącznie z liczbą studentów zarejestrowanych i liczbą zaliczeń. Dane te
      mogą być przechowywane w tabeli UVCV[UV[MCAURGELCNPQUEK:

      Dostępne na płycie CD jako część skryptu tabele.sql.


       %4'#6' 6#$.' URGEAUVCVU 

         URGELCNPQUE         8#4%*#4

         QIQNGOACNKEGPKC   07/$'4
         QIQNGOAUVWFGPEK     07/$'4

      W celu zapewnienia ciągłej aktualności danych z tabeli URGEAUVCVU mo na utworzyć wy-
      zwalacz dla tabeli UVWFGPEK, który będzie poprawiał tę pierwszą po ka dej zmianie dokona-
      nej w tabeli UVWFGPEK. Zadanie to mo e wykonywać poni szy wyzwalacz 7CMVWCNPKL
      5RGE5VCVU. Po ka dej operacji DML wykonanej na tabeli UVWFGPEK nastąpi uruchomienie
      wyzwalacza. Zawartość wyzwalacza wykonuje zapytanie na tabeli UVWFGPEK i uaktualnia
      statystykę w URGEAUVCVU:

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


       %4'#6' 14 4'2.#%' 64+))'4 7CMVWCNPKL5RGE5VCVU
CRGYPKC EKæI æ CMVWCNPQ è VCDGNK URGEAUVCVU
            YRTQYCFCLæE OKCP[ FQMQP[YCPG Y VCDGNK UVWFGPEK
#(6'4 +05'46 14 '.'6' 14 72#6' 10 UVWFGPEK
       '%.#4'
         %74514 MA5VCV[UV[MC +5
           5'.'%6 URGELCNPQUE %1706
QIQNGOAUVWFGPEK
                  57/
DKGCEGACNKEGPKC QIQNGOACNKEGPKC
             (41/ UVWFGPEK
             )4172 $; URGELCNPQUE
Rozdział 11.    Wyzwalacze          401


       $')+0
0CLRKGTY QUVCPæ WUWPKúVG YKGTUG  VCDGNK URGEAUVCVU 5RQYQFWLG VQ Y[GTQYCPKG
             UVCV[UV[MK K MQPKGEPQ è TQNKEGPKC YU[UVMKEJ UVWFGPVÎY QMTG NQPGL
             URGELCNPQ EK
'.'6' (41/ URGEAUVCVU
0CUVúRPKG DúFKG Y[MQPCPC RúVNC FNC MC FGL URGELCNPQ EK K YUVCYKQPG QFRQYKGFPKG
             YKGTUG FQ VCDGNK URGEAUVCVU
(14 A4GMQTF5VCV KP MA5VCV[UV[MC .112
           +05'46 +061 URGEAUVCVU
URGELCNPQUE QIQNGOACNKEGPKC QIQNGOAUVWFGPEK
              8#.7'5
A4GMQTF5VCVURGELCNPQUE A4GMQTF5VCVQIQNGOACNKEGPKC
                     A4GMQTF5VCVQIQNGOAUVWFGPEK
         '0 .112
       '0 7CMVWCNPKL5RGE5VCVU

      Wyzwalacz mo na uruchomić dla więcej ni jednego typu instrukcji wyzwalających.
      Na przykład, wyzwalacz 7CMVWCNPKL5RGE5VCVU mo na uruchomić dla instrukcji +05'46,
      72#6' oraz '.'6'. Zdarzenie wyzwalające określa jedną operację DML lub więcej, które
      powinny spowodować uruchomienie wyzwalacza.

Wyzwalacze zastępujące
      W systemie Oracle8 wprowadzono dodatkowy typ wyzwalacza. Wyzwalacze zastępujące
      (Instead-of) mogą być definiowane tylko dla perspektyw (relacyjnych lub obiektowych).
      Inaczej ni wyzwalacze DML, które uruchamiają się obok operacji DML, wyzwalacze za-
      stępujące uruchamiają się zamiast wyzwalającej je instrukcji DML. Wyzwalacze zastę-
      pujące działają na poziomie wierszy. Dla przykładu proszę przeanalizować perspektywę
      ITWR[ARQMQLG:

      Dostępne na płycie CD jako część skryptu Zamiast.sql.


       %4'#6' 14 4'2.#%' 8+'9 ITWR[ARQMQLG #5
         5'.'%6 Y[FKCN MWTU DWF[PGM RQMQLAPWOGT
         (41/ RQMQLG ITWR[
         9*'4' RQMQLGRQMQLAKF  ITWR[RQMQLAKF

      Bezpośrednia operacja wstawienia wierszy do tej perspektywy jest nieprawidłowa, ponie-
      wa jest to złączenie dwóch tabel, a do wykonania operacji +05'46 potrzebna jest mody-
      fikacja obu tabel. Taką sytuację pokazano w poni szej sesji programu SQL*Plus:

      Dostępne na płycie CD jako część skryptu Zamiast.sql.


       53.   +05'46 +061 ITWR[ARQMQLG 
Y[FKCN MWTU DWF[PGM RQMQLAPWOGT
               8#.7'5 
 /7   $WF[PGM /W[MK  
       +05'46 +061 ITWR[ARQMQLG 
Y[FKCN MWTU DWF[PGM RQMQLAPWOGT
$ ä Y NKPKK 
       14# PKG OQ PC OQF[HKMQYCè YKúEGL PK LGFPGL VCDGNK DCQYGL C RQ TGFPKEVYGO
       RGTURGMV[Y[ DúFæEGL  æEGPKGO
402   Część III   Dodatkowe właściwości języka PL/SQL


      Mo na jednak utworzyć wyzwalacz zastępujący, wykonujący poprawne operacje dla in-
      strukcji +05'46, a mianowicie modyfikację obu tabel:

      Dostępne na płycie CD jako część skryptu Zamiast.sql.


       %4'#6' 64+))'4 +PUGTV)TWR[2QMQLG
         +056'# 1( +05'46 10 ITWR[ARQMQLG
       '%.#4'
         ARQMQL+ RQMQLGRQMQLAKF 6;2'
       $')+0
          0CLRKGTY QMTG NQPQ KFGPV[HKMCVQT RQMQLW
         5'.'%6 RQMQLAKF
           +061 ARQMQL+
           (41/ RQMQLG
           9*'4' DWF[PGM  PGYDWF[PGM
           #0 RQMQLAPWOGT  PGYRQMQLAPWOGT

          6GTC WCMVWCNPKC UKú VCDGNú ITWR[
         72#6' )472;
           5'6 RQMQLAKF  ARQMQL+
           9*'4' Y[FKCN  PGYY[FKCN
           #0 MWTU  PGYMWTU
       '0 )TWR[2QMQLG+PUGTV

      Dzięki wyzwalaczowi )TWR[2QMQLG+PUGTV wykonanie instrukcji +05'46 kończy się po-
      wodzeniem.

        W obecnej postaci wyzwalacz )TWR[2QMQLG+PUGTV nie sprawdza błędów. Niedogodność ta
        zostanie zlikwidowana w dalszej części tego rozdziału, w podrozdziale „Tworzenie wy-
        zwalaczy zastępujących”.


Wyzwalacze systemowe
      W systemie Oracle8i oraz w systemach wy szych wprowadzono trzeci typ wyzwalaczy
      — wyzwalacze systemowe, które uruchamiają się w przypadku wystąpienia zdarzenia sys-
      temowego, takiego jak uruchomienie lub zatrzymanie bazy danych, nie zaś w przypadku
      wykonania instrukcji DML na tabeli. Wyzwalacz systemowy mo na tak e uruchomić
      dla operacji DDL, jak np. utworzenia tabeli. Przykładowo, chęć zarejestrowania utwo-
      rzenia obiektu słownika danych mo na zrobić poprzez następującą tabelę:

      Dostępne na płycie CD jako część skryptu ZarejestrujOperTworzenia.sql.


       %4'#6' 6#$.' VYQTGPKGAFFN

          KFAW[VMQYPKMC     8#4%*#4

          V[RAQDKGMVW        8#4%*#4

          PCYCAQDKGMVW      8#4%*#4

          YNCUEKEKGNAQDKGMVW 8#4%*#4

          FCVCAWVYQTGPKC    #6'
Rozdział 11.    Wyzwalacze        403


     Po sformułowaniu tej tabeli mo na utworzyć wyzwalacz systemowy, którego zadaniem bę-
     dzie rejestrowanie interesujących informacji. Zadanie to wypełni wyzwalacz CTGLGUVTWL
     1RGT6YQTGPKC — po ka dej operacji %4'#6' w bie ącym schemacie zarejestruje informa-
     cje na temat właśnie utworzonego obiektu w tabeli VYQTGPKGAFFN:

     Dostępne na płycie CD jako część skryptu ZarejestrujOperTworzenia.sql.


      %4'#6' 14 4'2.#%' 64+))'4 CTGLGUVTWL1RGT6YQTGPKC
        #(6'4 %4'#6' 10 #6#$#5'
      $')+0
        +05'46 +061 VYQTGPKGAFFN 
KFAW[VMQYPKMC V[RAQDKGMVW PCYCAQDKGMVW
                                    YNCUEKEKGNAQDKGMVW FCVCAWVYQTGPKC
          8#.7'5 
75'4 5;5+%6+10#4;A1$,A6;2' 5;5+%6+10#4;A1$,A0#/'
                  5;5+%6+10#4;A1$,A190'4 5;5#6'
      '0 CTGLGUVTWL1RGT6YQTGPKC



Tworzenie wyzwalaczy
     Niezale nie od typu wszystkie wyzwalacze tworzy się za pomocą tej samej składni, która
     — ogólnie — jest następująca:
      %4'#6' =14 4'2.#%'? 64+))'4 PCYCAY[YCNCEC
       ]$'(14' ^ #(6'4 ^ +056'# 1(_ FCTGPKGAY[YCNCLCEG
      =MNCWWNCAAQFYQNCPKGO?
       =9*'0 YCTWPGMAY[YCNCEC?
       =(14 '#%* 419?
       VTGUEAY[YCNCEC 

     W składni PCYCAY[YCNCEC jest nazwą wyzwalacza, FCTGPKGAY[YCNCLCEG określa
     zdarzenie uruchamiające wyzwalacz (mo e równie zawierać odwołanie do tabeli lub
     perspektywy), natomiast VTGUEAY[YCNCEC jest głównym kodem wyzwalacza. Argument
     MNCWWNCAAQFYQNCPKGO jest wykorzystywany w celu odwołania do danych w modyfikowa-
     nym wierszu pod inną nazwą. Najpierw następuje ocena warunku YCTWPGMAY[YCNCEC
     w klauzuli 9*'0. Treść wyzwalacza jest wykonywana tylko wtedy, kiedy ten warunek
     przyjmie wartość 647'. Więcej przykładów ró nych rodzajów wyzwalaczy przeanalizo-
     wano w kolejnych podrozdziałach.

       Rozmiar treści wyzwalacza nie może przekroczyć 32K. W przypadku większego wyzwa-
       lacza można zredukować jego objętość poprzez przeniesienie fragmentów kodu do od-
       dzielnie skompilowanych pakietów lub procedur składowanych i wywołanie ich z treści
       wyzwalacza. Ze względu na dużą częstotliwość wykonywania dobrą praktyką jest utrzy-
       mywanie małego rozmiaru treści wyzwalaczy.


Tworzenie wyzwalaczy DML
     Wyzwalacze DML są uruchamiane dla operacji +05'46, 72#6' lub '.'6' dotyczących
     tabeli bazy danych. Następuje to przed wykonaniem określonej operacji lub po. Wyzwa-
     lacze mogą być wykonane raz w stosunku do wiersza, którego operacja dotyczy lub raz
404           Część III   Dodatkowe właściwości języka PL/SQL


              w stosunku do określonej operacji. Połączenie tych czynników określa rodzaj wyzwalacza.
              W sumie istnieje 12 mo liwych typów: 3 rodzaje instrukcji × 2 rodzaje czasów × 2 mo -
              liwe poziomy. Przykładowo, wszystkie podane ni ej typy wyzwalacza są prawidłowe:
                  $'(14' (przed) na poziomie instrukcji 72#6'.
                  #(6'4 (po) instrukcji +05'46 na poziomie wiersza.
                  $'(14' (przed) instrukcją '.'6' na poziomie wiersza.

              W tabeli 11.1 znajduje się zestawienie tych mo liwości. Wyzwalacz jest tak e uruchamia-
              ny dla więcej ni jednego typu instrukcji DML dla określonej tabeli, np. +05'46 oraz 72#6'.
              Kod w wyzwalaczu jest wykonywany razem z samą instrukcją wyzwalającą, jako część
              tej samej transakcji.

Tabela 11.1. Typy wyzwalaczy
 Kategoria Wartości                          Komentarz
 Instrukcja    +05'46, '.'6', 72#6'        Definiuje rodzaj instrukcji DML powodującej uruchomienie
                                             wyzwalacza.
 Czas          $'(14' (przed) lub #(6'4 (po) Określa, czy wyzwalacz zostanie uruchomiony przed wykonaniem
                                             instrukcji czy te po jej wykonaniu.
 Poziom        Wiersz lub instrukcja         Je eli dany wyzwalacz istnieje na poziomie wiersza, jest
                                             uruchamiany po jednym razie dla ka dego wiersza, którego
                                             dotyczy instrukcja. Je eli dany wyzwalacz jest wyzwalaczem
                                             na poziomie instrukcji, to jest uruchamiany jeden raz — przed
                                             wykonaniem instrukcji albo po. Wyzwalacz na poziomie wiersza
                                             jest identyfikowany przez klauzulę (14 '#%* 419 w definicji
                                             wyzwalacza.

              Dla tabeli mo na zdefiniować dowolną liczbę wyzwalaczy włącznie z mo liwością zde-
              finiowania więcej ni jednego wyzwalacza dla określonego rodzaju instrukcji DML, np.
              mo na zdefiniować dwa wyzwalacze #(6'4 '.'6' poziomu instrukcji. Wszystkie wyzwa-
              lacze tego samego typu będą uruchamiały się sekwencyjnie (więcej informacji na temat
              kolejności uruchamiania wyzwalaczy znajduje się w następnym podrozdziale).

                Przed wydaniem języka PL/SQL w wersji 2.1 (system Oracle7 wydanie 7.1) dla tabeli
                można było zdefiniować tylko jeden wyzwalacz określonego typu — maksymalnie 12.
                A zatem, aby można było definiować podwójne wyzwalacze tego samego typu dla okre-
                ślonej tabeli, parametr inicjalizacji %1/2#6+$.' musi mieć wartość 7.1 lub wyższą (co jest
                niemal pewne).


              Zdarzenie wyzwalające dla wyzwalacza DML określa nazwę tabeli (oraz kolumny), dla
              której nastąpi uruchomienie wyzwalacza. W systemie Oracle8i oraz w wersjach wy szych
              wyzwalacze mo na tak e uruchamiać dla kolumny tabeli zagnie d onej. Więcej informacji
              na temat tabel zagnie d onych znajduje się w rozdziale 8.

Kolejność uruchamiania wyzwalaczy
              Uruchamianie wyzwalaczy następuje podczas wykonywania instrukcji DML. Poni ej poda-
              no algorytm ich wykonywania:
Rozdział 11.    Wyzwalacze          405


 1. Wykonanie wyzwalacza $'(14' na poziomie instrukcji, o ile taki istnieje.
 2. Dla ka dego wiersza, na którym wykonywana jest instrukcja:
      wykonanie wyzwalacza $'(14' na poziomie wiersza, o ile taki istnieje;
      wykonanie samej instrukcji, o ile taka istnieje;
      wykonanie wyzwalacza #(6'4 na poziomie wiersza, o ile taki istnieje.
 3. Wykonanie wyzwalacza #(6'4 na poziomie instrukcji, o ile taki istnieje.

Aby to zilustrować, proszę sobie wyobrazić, e utworzono wszystkie cztery rodzaje wy-
zwalaczy 72#6' dla tabeli grupy — $'(14' oraz #(6'4 — na poziomie instrukcji oraz na
poziomie wiersza. Zostaną utworzone trzy wyzwalacze $'(14' poziomu wiersza oraz dwa
wyzwalacze #(6'4 poziomu instrukcji:

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


 %4'#6' 5'37'0%' MQNGLPAY[YCNCE[
   56#46 9+6* 
   +0%4'/'06 $; 

 %4'#6' 14 4'2.#%' 2#%-#)' 2CMKGV9[YCNCE[ #5
    )NQDCNP[ NKEPKM FQ Y[MQT[UVCPKC Y Y[YCNCECEJ
   A.KEPKM 07/$'4
 '0 2CMKGV9[YCNCE[


 %4'#6' 14 4'2.#%' 64+))'4 )TWR[$+PUVTWMELC
   $'(14' 72#6' 10 ITWR[
 $')+0
    0CLRKGTY NKEPKM QUVCPKG Y[GTQYCP[
   2CMKGV9[YCNCE[A.KEPKM  

   +05'46 +061 VCDGNCAV[OE 
MQNAPWO MQNAPCM
     8#.7'5 
MQNGLPAY[YCNCE[0':68#.
        $'(14' PC RQKQOKG KPUVTWMELK NKEPKM      ^^ 2CMKGV9[YCNCE[A.KEPKM

    # VGTC QUVCPKG YKúMUQPC LGIQ YCTVQ è Q LGFGP FNC MQNGLPGIQ Y[YCNCEC
   2CMKGV9[YCNCE[A.KEPKM  2CMKGV9[YCNCE[A.KEPKM 
 
 '0 )TWR[$+PUVTWMELC


 %4'#6' 14 4'2.#%' 64+))'4 )TWR[#+PUVTWMELC
   #(6'4 72#6' 10 ITWR[
 $')+0
   +05'46 +061 VCDGNCAV[OE 
MQNAPWO MQNAPCM
     8#.7'5 
MQNGLPAY[YCNCE[0':68#.
        #(6'4 PC RQKQOKG KPUVTWMELK  NKEPKM       ^^ 2CMKGV9[YCNCE[A.KEPKM

    YKúMUGPKG Q LGFGP FNC PCUVúRPGIQ Y[YCNCEC
   2CMKGV9[YCNCE[A.KEPKM  2CMKGV9[YCNCE[A.KEPKM 
 
 '0 )TWR[#+PUVTWMELC
406   Część III   Dodatkowe właściwości języka PL/SQL


       %4'#6' 14 4'2.#%' 64+))'4 )TWR[#+PUVTWMELC
         #(6'4 72#6' 10 ITWR[
       $')+0
         +05'46 +061 VCDGNCAV[OE 
MQNAPWO MQNAPCM
           8#.7'5 
MQNGLPAY[YCNCE[0':68#.
              #(6'4 PC RQKQOKG KPUVTWMELK  NKEPKM      ^^ 2CMKGV9[YCNCE[A.KEPKM

          YKúMUGPKG NKEPKMC FNC PCUVúRPGIQ Y[YCNCEC
         2CMKGV9[YCNCE[A.KEPKM  2CMKGV9[YCNCE[A.KEPKM 
 
       '0 )TWR[#+PUVTWMELC

       %4'#6' 14 4'2.#%' 64+))'4 )TWR[$9KGTU
         $'(14' 72#6' 10 ITWR[
         (14 '#%* 419
       $')+0
         +05'46 +061 VCDGNCAV[OE 
MQNAPWO MQNAPCM
           8#.7'5 
MQNGLPAY[YCNCE[0':68#.
              $'(14' PC RQKQOKG YKGTUC  NKEPKM      ^^ 2CMKGV9[YCNCE[A.KEPKM

          YKúMUGPKG NKEPKMC FNC PCUVúRPGIQ Y[YCNCEC
         2CMKGV9[YCNCE[A.KEPKM  2CMKGV9[YCNCE[A.KEPKM 
 
       '0 )TWR[$9KGTU


       %4'#6' 14 4'2.#%' 64+))'4 )TWR[$9KGTU
         $'(14' 72#6' 10 ITWR[
         (14 '#%* 419
       $')+0
         +05'46 +061 VCDGNCAV[OE 
MQNAPWO MQNAPCM
           8#.7'5 
MQNGLPAY[YCNCE[0':68#.
              $'(14' PC RQKQOKG YKGTUC  NKEPKM      ^^ 2CMKGV9[YCNCE[A.KEPKM

          YKúMUGPKG NKEPKMC FNC PCUVúRPGIQ Y[YCNCEC
         2CMKGV9[YCNCE[A.KEPKM  2CMKGV9[YCNCE[A.KEPKM 
 
       '0 )TWR[$9KGTU

       %4'#6' 14 4'2.#%' 64+))'4 )TWR[$9KGTU
         $'(14' 72#6' 10 ITWR[
         (14 '#%* 419
       $')+0
         +05'46 +061 VCDGNCAV[OE 
MQNAPWO MQNAPCM
           8#.7'5 
MQNGLPAY[YCNCE[0':68#.
              $'(14' PC RQKQOKG YKGTUC  NKEPKM      ^^ 2CMKGV9[YCNCE[A.KEPKM

          YKúMUGPKG NKEPKMC FNC PCUVúRPGIQ Y[YCNCEC
         2CMKGV9[YCNCE[A.KEPKM  2CMKGV9[YCNCE[A.KEPKM 
 
       '0 )TWR[$9KGTU

       %4'#6' 14 4'2.#%' 64+))'4 )TWR[#9KGTU
         #(6'4 72#6' 10 ITWR[
         (14 '#%* 419
       $')+0
         +05'46 +061 VCDGNCAV[OE 
MQNAPWO MQNAPCM
           8#.7'5 
MQNGLPAY[YCNCE[0':68#.
              #(6'4 PC RQKQOKG YKGTUC NKEPKM    ^^ 2CMKGV9[YCNCE[A.KEPKM

          YKúMUGPKG NKEPKMC FNC PCUVúRPGIQ Y[YCNCEC
            2CMKGV9[YCNCE[A.KEPKM  2CMKGV9[YCNCE[A.KEPKM 
 
         '0 )TWR[#YKGTU
Rozdział 11.   Wyzwalacze       407


Teraz mo na wydać następującą instrukcję 72#6':

Dostępne na płycie CD jako część skryptu KolejnoscUruchamiania.sql.


 72#6' ITWR[
   5'6 NKEDCACNKEGP  
   9*'4' Y[FKCN +0 
 *+5    +0( 

Powy sza instrukcja dotyczy czterech wierszy. Ka dy z wyzwalaczy $'(14' oraz #(6'4 po-
ziomu instrukcji jest wykonywany raz oraz wyzwalacze $'(14' i #(6'4 poziomu wiersza
są wykonywane po cztery razy. Je eli następnie będzie pobrany wiersze z tabeli VCDGNCA
V[OE, to uzyska się następujący wynik:

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


 53. 5'.'%6
(41/ VCDGNCAV[OE
    14'4 $; MQNAPWO
   -1.A07/  -1.A0#-
   
           $'(14' PC RQKQOKG KPUVTWMELK NKEPKM  
           $'(14' PC RQKQOKG YKGTUC  NKEPKM  
           $'(14' PC RQKQOKG YKGTUC  NKEPKM  
           $'(14' PC RQKQOKG YKGTUC  NKEPKM  
           #(6'4 PC RQKQOKG YKGTUC NKEPKM  
           $'(14' PC RQKQOKG YKGTUC  NKEPKM  
           $'(14' PC RQKQOKG YKGTUC  NKEPKM  
           $'(14' PC RQKQOKG YKGTUC  NKEPKM  
           #(6'4 PC RQKQOKG YKGTUC NKEPKM  
          $'(14' PC RQKQOKG YKGTUC  NKEPKM  
          $'(14' PC RQKQOKG YKGTUC  NKEPKM  
          $'(14' PC RQKQOKG YKGTUC  NKEPKM  
          #(6'4 PC RQKQOKG YKGTUC NKEPKM  
          $'(14' PC RQKQOKG YKGTUC  NKEPKM  
          $'(14' PC RQKQOKG YKGTUC  NKEPKM  
          $'(14' PC RQKQOKG YKGTUC  NKEPKM  
          #(6'4 PC RQKQOKG YKGTUC NKEPKM  
          #(6'4 PC RQKQOKG KPUVTWMELK  NKEPKM  
          #(6'4 PC RQKQOKG KPUVTWMELK  NKEPKM  

Dla ka dego uruchamianego wyzwalacza są widoczne zmiany dokonane przez wcześniej-
sze wyzwalacze, jak równie inne zmiany w bazie danych dokonane za pomocą instrukcji.
Mo na to zauwa yć, obserwując wartość licznika wyświetlaną przez ka dy z wyzwalaczy
(więcej informacji na temat zastosowania zmiennych pakietowych znajduje się w roz-
dziale 10.).

Kolejność uruchamiania wyzwalaczy tego samego typu nie jest określona. Jak mo na za-
uwa yć w powy szym przykładzie, dla ka dego z wyzwalaczy są widoczne zmiany wyko-
nane przez wyzwalacz uruchomiony wcześniej. Je eli kolejność wykonywanych operacji
jest istotna, mo na je wszystkie połączyć w jednym wyzwalaczu.
408        Część III     Dodatkowe właściwości języka PL/SQL



              Kiedy tworzy się migawkę rejestrującą dla tabeli, wówczas system Oracle automa-
              tycznie utworzy wyzwalacz #(6'4 na poziomie wiersza, który będzie uaktualniał dzien-
              nik po wykonaniu każdej instrukcji DML. Należy o tym pamiętać, chcąc utworzyć dla tej
              tabeli dodatkowy wyzwalacz #(6'4 na poziomie wiersza. Są jeszcze inne ograniczenia
              dotyczące wyzwalaczy i migawek (w systemie Oracle9i znanych pod nazwą materializo-
              wanych perspektyw). Więcej informacji na ten temat znajduje się w dokumentacji Oracle
              Server Replication.


Identyfikatory korelacji w wyzwalaczach na poziomie wiersza
           Wyzwalacze na poziomie wiersza uruchamiają się raz dla wiersza przetwarzanego przez
           instrukcję wyzwalającą. Wewnątrz wyzwalacza mo na uzyskać dostęp do danych w obec-
           nie przetwarzanym wierszu. Mo na to zrobić za pomocą dwóch identyfikatorów korelacji
           — QNF oraz PGY. Identyfikator korelacji jest specjalnym rodzajem zmiennej dowiązanej
           PL/SQL. Dwukropek na początku ka dego z nich wskazuje, e są to zmienne dowiązane
           w znaczeniu zmiennych hosta wykorzystywanych we wbudowanym PL/SQL i znak ten
           określa, e nie są to zwykłe zmienne PL/SQL. Kompilator PL/SQL będzie traktował je ja-
           ko rekordy typu:
             VCDGNCAY[YCNCLCEC 4196;2'

           Tu VCDGNCAY[YCNCLCEC jest tabelą, dla której zdefiniowano wyzwalacz. Zatem odwołanie
           postaci:
             PGYRQNG

           będzie prawidłowe tylko wtedy, gdy RQNG jest polem w tabeli wyzwalającej. Znaczenie
           wartości QNF oraz PGY opisano w tabeli 11.2. Chocia syntaktycznie identyfikatory kore-
           lacji są traktowane jako rekordy, w rzeczywistości nie są nimi (zagadnienie to omówiono
           w podrozdziale „Pseudorekordy”). Z tego powodu QNF i PGY nazywane są tak e pseudo-
           rekordami.

Tabela 11.2. Identyfikatory korelacji :old oraz :new
 Instrukcja       Wartości QNF                          Wartości PGY
 wyzwalająca
 +05'46           Nieokreślone — wszystkie pola mają     Wartości, które będą wstawione po wykonaniu
                  wartość 07...                          instrukcji.
 72#6'           Oryginalne wartości wiersza przed      Nowe wartości, które będą uaktualnione
                  uaktualnieniem.                        po wykonaniu instrukcji.
 '.'6'           Oryginalne wartości przed usunięciem   Nieokreślone — wszystkie pola mają wartość 07...
                  wiersza.


              Wartość QNF jest nieokreślona dla instrukcji +05'46, a wartość PGY jest nieokreślona
              dla instrukcji '.'6'. Kompilator PL/SQL nie wygeneruje błędu w razie zastosowania
              QNF dla instrukcji +05'46 lub PGY dla instrukcji '.'6', ale wartości obydwóch pól wy-
              niosą 07...
Rozdział 11.    Wyzwalacze        409


W systemie Oracle8i zdefiniowano dodatkowy identyfikator korelacji — RCTGPV. Je eli
wyzwalacz zdefiniowano dla tabeli zagnie d onej, to wartości QNF oraz PGY odnoszą się
do wierszy w tabeli zagnie d onej, podczas gdy wartość RCTGPV odnosi się do bie ącego
wiersza w tabeli nadrzędnej. Więcej informacji na temat zastosowania identyfikatora
RCTGPV znajduje się w dokumentacji systemu Oracle.

Zastosowanie identyfikatorów :old oraz :new
W wyzwalaczu 9[IGPGTWL+5VWFGPVC, którego kod przedstawiono w poni szym przykła-
dzie, wykorzystano wartość PGY. Jest to wyzwalacz typu $'(14' na poziomie instrukcji
+05'46 i ma słu yć do wypełniania pola + tabeli UVWFGPEK wartością generowaną z se-
kwencji UVWFGPEKAUGMYGPELC:

Dostępne na płycie CD jako część skryptu WygenerujIDstudenta.sql.


 %4'#6' 14 4'2.#%' 64+))'4 9[IGPGTWL+5VWFGPVC
   $'(14' +05'46 14 72#6' 10 UVWFGPEK
   (14 '#%* 419
 $')+0
9[RG PKGPKG RQNC + VCDGNK UVWFGPEK PCUVúRPæ YCTVQ EKæ  UGMYGPELK
       UVWFGPEKAUGMYGPELC + LGUV MQNWOPæ VCDGNK UVWFGPEK CVGO
       PGY+ LGUV RTCYKF QY[O QFYQ CPKGO
5'.'%6 UVWFGPEKAUGMYGPELCPGZVXCN
     +061 PGY+
     (41/ FWCN
 '0 9[IGPGTWL+5VWFGPVC

Wyzwalacz 9[IGPGTWL+5VWFGPVC faktycznie modyfikuje wartość PGY+. Jest to jed-
na z u ytecznych cech wartości PGY — w czasie wykonywania instrukcji zostaną zastoso-
wane bie ące wartości PGY. Dzięki wyzwalaczowi 9[IGPGTWL+5VWFGPVC mo na wydać na-
stępującą instrukcję +05'46:

Dostępne na płycie CD jako część skryptu WygenerujIDstudenta.sql.


 +05'46 +061 UVWFGPEK 
KOKG PCYKUMQ
   8#.7'5 
 .QNKVC  .CCTWU 

Instrukcja ta jest wykonywana bez wygenerowania błędu. Nawet w przypadku nieokre-
ślenia wartości klucza głównego kolumny + (co jest wymagane) wyzwalacz uzupełni
brakującą wartość. W rzeczywistości w razie zdefiniowania wartości dla kolumny + war-
tość ta zostanie zignorowana, poniewa wyzwalacz ją zmieni. Podobnie będzie po wydaniu
poni szej instrukcji:

Dostępne na płycie CD jako część skryptu WygenerujIDstudenta.sql.


 +05'46 +061 UVWFGPEK 
+ KOKG PCYKUMQ
   8#.7'5 
 GNFC  QQO
410   Część III   Dodatkowe właściwości języka PL/SQL


      Kolumna + będzie wypełniona wartością UVWFGPEKAUGMYGPELCPGZVXCN, nie zaś wartością 

      Z powy szego opisu wynika, e nie mo na zmienić wartości PGY w wyzwalaczu #(6'4
      na poziomie wiersza, poniewa odpowiednia instrukcja została ju wykonana. Uogólnia-
      jąc, wartość PGY jest modyfikowana tylko w wyzwalaczu $'(14' na poziomie wiersza,
      a wartość QNF nigdy nie jest modyfikowana, tylko odczytywana.

      Rekordy PGY oraz QNF są prawidłowe tylko wewnątrz wyzwalaczy na poziomie wier-
      sza. Przy próbie odwołania się do tych wartości wewnątrz wyzwalacza na poziomie in-
      strukcji wystąpi błąd kompilacji. Wyzwalacz na poziomie instrukcji jest wykonywany
      tylko raz, nawet je eli dana instrukcja przetwarza wiele wierszy, a zatem wartości PGY oraz
      QNF nie mają adnego znaczenia. W takiej sytuacji nie istnieje bowiem aden wiersz, do
      którego wartości te mogłyby się odwołać.

      Pseudorekordy
      Chocia wartości PGY oraz QNF są syntaktycznie traktowane jako rekordy typu VCDGNCA
      Y[YCNCLCEC 4196;2', to jednak w rzeczywistości nimi nie są. W efekcie operacje prawi-
      dłowe dla rekordów nie są poprawne dla wartości PGY oraz QNF, np. nie mo na przypi-
      sywać ich wartości jako całych rekordów, jedynie uzyskać dostęp do indywidualnych pól.
      Właściwość tę zilustrowano w poni szym przykładzie:

      Dostępne na płycie CD jako skrypt Pseudorekordy.sql.


       %4'#6' 14 4'2.#%' 64+))'4 7UWP6[OE
         $'(14' '.'6' 10 VCDGNCAV[OE
         (14 '#%* 419
       '%.#4'
         A4GM6[OE VCDGNCAV[OE 4196;2'
       $')+0
6Q PKG LGUV RQRTCYPG RT[RKUCPKG RQPKGYC    QNF PKG LGUV Y C EKYG
             TGMQTFGO
A4GM6[OE  QNF
/Q PC LGFPCM W[UMCè VGP UCO GHGMV RT[RKUWLæE YCTVQ EK
           RQUEGIÎNP[EJ RÎN RQLGF[PEQ
A4GM6[OEMQNAPCM  QNFMQNAPCM
         A4GM6[OEMQNAPWO  QNFMQNAPWO
       '0 7UWP6[OE

      Ponadto nie jest mo liwe przekazanie wartości QNF oraz PGY do procedur lub funkcji,
      które przyjmują argumenty typu VCDGNCAY[YCNCLCEC 4196;2'.

      Klauzula REFERENCING
      Je eli jest taka potrzeba, to wykorzystuje się klauzulę 4'('4'0%+0) w celu nadania in-
      nych nazw wartościom PGY oraz QNF. Klauzula ta występuje po zdarzeniu wyzwalają-
      cym, a przed klauzulą 9*'0 i posiada następującą składnię:
       4'('4'0%+0) =1. #5 PCYCAQNF? =0'9 #5 PCYCAPGY?
Rozdział 11.    Wyzwalacze        411


Wewnątrz treści wyzwalacza mo na wykorzystywać nazwy PCYCAQNF oraz PCYCAPGY
zamiast QNF i PGY. Proszę zauwa yć, e w nazwach identyfikatorów korelacji w klau-
zuli 4'('4'0%+0) nie u ywa się dwukropków. Poni ej znajduje się alternatywna wersja wy-
zwalacza 9[IGPGTWL+5VWFGPVC, gdzie wykorzystano klauzulę 4'('4'0%+0) w celu umo li-
wienia odwoływania się do identyfikatora PGY jako PQY[AUVWFGPV:

Dostępne na płycie CD jako część skryptu WygenerujIDstudenta.sql.


 %4'#6' 14 4'2.#%' 64+))'4 9[IGPGTWL+5VWFGPVC
   $'(14' +05'46 14 72#6' 10 UVWFGPEK
   4'('4'0%+0) PGY #5 PQY[AUVWFGPV
   (14 '#%* 419
 $')+0
9[RG PKGPKG RQNC + VCDGNK UVWFGPEK PCUVúRPæ YCTVQ EKæ  UGMYGPELK
       UVWFGPEKAUGMYGPELC + LGUV MQNWOPæ VCDGNK UVWFGPEK CVGO
       PGY+ LGUV RTCYKF QY[O QFYQ CPKGO
5'.'%6 UVWFGPEKAUGMYGPELCPGZVXCN
     +061 PQY[AUVWFGPV+
     (41/ FWCN
 '0 9[IGPGTWL+5VWFGPVC

Klauzula WHEN
Klauzula 9*'0 jest prawidłowa tylko dla wyzwalaczy na poziomie wiersza. Treść wyzwa-
lacza, o ile istnieje, mo e być wykonywana tylko dla tych wierszy, które spełniają warunek
określony przez tę klauzulę. Poni ej przedstawiono składnię klauzuli 9*'0:
 9*'0 YCTWPGM

W niej YCTWPGM jest wyra eniem logicznym (boolowskim), sprawdzanym dla ka dego wier-
sza. Istnieje mo liwość odwoływania się do pseudorekordów PGY i QNF równie wewnątrz
wyra enia stanowiącego warunek, ale wtedy nie stosuje się znaku dwukropka. Uwzględnie-
nie znaku dwukropka jest prawidłowe tylko w treści wyzwalacza. Przykładowo, treść
wyzwalacza 5RTCYFCNKEGPKC jest wykonywana tylko wówczas, gdy liczba bie ących za-
liczeń studenta jest większa ni 20:
 %4'#6' 14 4'2.#%' 64+))'4 5RTCYFCNKEGPKC
   $'(14' +05'46 14 72#6' 1( DKGCEGACNKEGPKC 10 UVWFGPEK
   (14 '#%* 419
   9*'0 
PGYDKGCEGACNKEGPKC   
 $')+0
6WVCL RQYKPPC UKú PCNG è VTG è Y[YCNCEC
'0

Wyzwalacz 5RTCYFCNKEGPKC mo na tak e zapisać w następujący sposób:
 %4'#6' 14 4'2.#%' 64+))'4 5RTCYFCNKEGPKC
   $'(14' +05'46 14 72#6' 1( DKGCEGACNKEGPKC 10 UVWFGPEK
   (14 '#%* 419
 $')+0
   +( PGYDKGCEGACNKEGPKC    6*'0
6WVCL RQYKPPC UKú PCNG è VTG è Y[YCNCEC
'0 +(
 '0
412   Część III    Dodatkowe właściwości języka PL/SQL


Korzystanie z predykatów wyzwalaczy
INSERTING, UPDATING oraz DELETING
      Omawiany ju w niniejszym rozdziale wyzwalacz 7CMVWCNPKL5VCV5RGE jest wyzwala-
      czem na poziomie instrukcji +05'46, 72#6' oraz '.'6'. Wewnątrz wyzwalacza tego typu
      (który jest uruchamiany dla ró nych instrukcji DML) występują trzy funkcje logiczne
      (boolowskie), które mogą słu yć do określenia rodzaju operacji. Tymi predykatami są
      +05'46+0), 72#6+0) oraz '.'6+0). Sposób ich działania przedstawiono w poni szej tabeli.

       Predykat        Działanie
       +05'46+0)       647', je eli instrukcją wyzwalającą jest +05'46, w przeciwnym razie (#.5'.
       72#6+0)        647', je eli instrukcją wyzwalającą jest 72#6', w przeciwnym razie (#.5'.
       '.'6+0)        647', je eli instrukcją wyzwalającą jest '.'6', w przeciwnym razie (#.5'.


        W systemie Oracle8i zdefiniowano dodatkowe funkcje, podobne do predykatów wy-
        zwalacza, które można wywołać z treści wyzwalacza. Więcej informacji na ten temat
        znajduje się w podrozdziale „Funkcje — atrybuty zdarzeń”, w dalszej części niniejszego
        rozdziału.

      W wyzwalaczu 4GLGUVTWLOKCP[5 wykorzystano powy sze predykaty w celu zapisu
      wszystkich zmian dokonywanych w tabeli CTGLGUVTQYCPKAUVWFGPEK. Oprócz tego wyzwa-
      lacz zapisuje identyfikator u ytkownika wprowadzającego zmiany. Poszczególne rekordy
      są przechowywane w tabeli 5A#WF[V. Poni ej przedstawiono kod słu ący do jej utworzenia:

      Dostępne na płycie CD jako część skryptu tabele.sql.


       %4'#6' 6#$.' 5ACWF[V 

         OKCPCAV[R       %*#4
    016 07..
         OKGPKQPQARTG 8#4%*#4
 016 07..
         FCVCAECU        #6'       016 07..
         UVCT[AUVWFGPVAKF 07/$'4

         UVCT[AY[FKCN    %*#4

         UVCT[AMWTU       07/$'4

         UVCTCAQEGPC      %*#4

         PQY[AUVWFGPVAKF 07/$'4

         PQY[AY[FKCN     %*#4

         PQY[AMWTU        07/$'4

         PQYCAQEGPC       %*#4

         

      Wyzwalacz 4GLGUVTWLOKCP[5 jest tworzony za pomocą poni szego kodu:

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


       %4'#6' 14 4'2.#%' 64+))'4 4GLGUVTWLOKCP[5
         $'(14' +05'46 14 '.'6' 14 72#6' 10 CTGLGUVTQYCPKAUVWFGPEK
         (14 '#%* 419
Rozdział 11.    Wyzwalacze       413


      '%.#4'
        AOKCPC6[R %*#4

      $')+0
CUVQUQYCPQ + FNC KPUVTWMELK +05'46       FNC KPUVTWMELK '.'6' QTC
             7 FNC KPUVTWMELK 72#6'
+( +05'46+0) 6*'0
          AOKCPC6[R  + 
        '.5+( 72#6+0) 6*'0
          AOKCPC6[R  7 
        '.5'
          AOKCPC6[R   
        '0 +(
CRKUCPQ Y VCDGNK 5A#WF[V YU[UVMKG OKCP[ FQMQPCPG Y VCDGNK
           CTGLGUVTQYCPKAUVWFGPEK CUVQUQYCPQ HWPMELú 5;5#6' FQ Y[IGPGTQYCPKC FCVQYPKMC
           QTC 75'4 Y EGNW W[UMCPKC KFGPV[HKMCVQTC DKG æEGIQ W [VMQYPKMC
+05'46 +061 5A#WF[V
          
OKCPCAV[R OKGPKQPQARTG FCVCAECU
           UVCT[AUVWFGPVAKF UVCT[AY[FKCN UVCT[AMWTU UVCTCAQEGPC
           PQY[AUVWFGPVAKF PQY[AY[FKCN PQY[AMWTU PQYCAQEGPC
        8#.7'5
          
AOKCPC6[R 75'4 5;5#6'
           QNFUVWFGPVAKF QNFY[FKCN QNFMWTU QNFQEGPC
           PGYUVWFGPVAKF PGYY[FKCN PGYMWTU PGYQEGPC
      '0 4GLGUVTWLOKCP[5

     Wyzwalacze zwykle są u ywane do prowadzenia kontroli zmian dokonywanych w danych,
     jak następowało w przypadku powy szego wyzwalacza 4GLGUVTWLOKCP[5. Chocia ta-
     kie działanie jest dostępne jako jedna z właściwości bazy danych, to jednak zastoso-
     wanie wyzwalaczy pozwala na bardziej elastyczną kontrolę. Wyzwalacz 4GLGUVTWL
     OKCP[5 mo na zmodyfikować i prowadzić, przykładowo, zapis zmian wprowadzanych
     tylko przez niektórych u ytkowników. Mógłby równie sprawdzać, czy u ytkownicy są
     uprawnieni do dokonywania zmian, a gdyby tak nie było, wywołać błąd (za pomocą pro-
     cedury 4#+5'A#22.+%#6+10A'4414).

Tworzenie wyzwalaczy zastępujących
     Inaczej ni wyzwalacze DML, które uruchamiają się dodatkowo, oprócz instrukcji +05'46,
     72#6' lub '.'6' (przed tymi operacjami lub po nich), wyzwalacze zastępujące urucha-
     miają się zamiast operacji DML. Ponadto zastępujące mo na definiować wyłącznie dla
     perspektyw, podczas gdy wyzwalacze DML są definiowane dla tabel. Wyzwalacze zastę-
     pujące wykorzystuje się w dwóch przypadkach:
         w celu umo liwienia modyfikowania perspektyw (bez wyzwalaczy zastępujących
         byłoby to niemo liwe),
         w celu modyfikowania kolumn tabeli zagnie d onej będącej kolumną
         w perspektywie.

     Pierwszy z tych przypadków zostanie omówiony w tym podrozdziale. Więcej informacji
     na temat tabel zagnie d onych znajduje się w rozdziale 8.

More Related Content

Similar to Oracle9i. Programowanie w języku PL/SQL

SQL Server 2005. Programowanie. Od podstaw
SQL Server 2005. Programowanie. Od podstawSQL Server 2005. Programowanie. Od podstaw
SQL Server 2005. Programowanie. Od podstaw
Wydawnictwo Helion
 
Oracle9i. Przewodnik dla początkujących
Oracle9i. Przewodnik dla początkującychOracle9i. Przewodnik dla początkujących
Oracle9i. Przewodnik dla początkujących
Wydawnictwo Helion
 
Oracle Database 10g. Kompendium administratora
Oracle Database 10g. Kompendium administratoraOracle Database 10g. Kompendium administratora
Oracle Database 10g. Kompendium administratora
Wydawnictwo Helion
 
SQL Server 2005. Wyciśnij wszystko
SQL Server 2005. Wyciśnij wszystkoSQL Server 2005. Wyciśnij wszystko
SQL Server 2005. Wyciśnij wszystko
Wydawnictwo Helion
 
SQL. Leksykon kieszonkowy
SQL. Leksykon kieszonkowySQL. Leksykon kieszonkowy
SQL. Leksykon kieszonkowy
Wydawnictwo Helion
 
Delphi 7 i bazy danych
Delphi 7 i bazy danychDelphi 7 i bazy danych
Delphi 7 i bazy danych
Wydawnictwo Helion
 
Transact-SQL. Czarna księga
Transact-SQL. Czarna księgaTransact-SQL. Czarna księga
Transact-SQL. Czarna księga
Wydawnictwo Helion
 
SQL. Optymalizacja
SQL. OptymalizacjaSQL. Optymalizacja
SQL. Optymalizacja
Wydawnictwo Helion
 
SQL Server 2005
SQL Server 2005SQL Server 2005
SQL Server 2005
Wydawnictwo Helion
 
Bazy danych SQL. Teoria i praktyka
Bazy danych SQL. Teoria i praktykaBazy danych SQL. Teoria i praktyka
Bazy danych SQL. Teoria i praktyka
Wydawnictwo Helion
 
SQL w mgnieniu oka
SQL w mgnieniu okaSQL w mgnieniu oka
SQL w mgnieniu oka
Wydawnictwo Helion
 
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Wydawnictwo Helion
 
PHP5. Zaawansowane programowanie
PHP5. Zaawansowane programowaniePHP5. Zaawansowane programowanie
PHP5. Zaawansowane programowanie
Wydawnictwo Helion
 
Excel 2003. Programowanie. Zapiski programisty
Excel 2003. Programowanie. Zapiski programistyExcel 2003. Programowanie. Zapiski programisty
Excel 2003. Programowanie. Zapiski programisty
Wydawnictwo Helion
 
Delphi 8 .NET. Kompendium programisty
Delphi 8 .NET. Kompendium programistyDelphi 8 .NET. Kompendium programisty
Delphi 8 .NET. Kompendium programisty
Wydawnictwo Helion
 
PHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danych
PHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danychPHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danych
PHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danych
Wydawnictwo Helion
 
Perl. Zaawansowane programowanie
Perl. Zaawansowane programowaniePerl. Zaawansowane programowanie
Perl. Zaawansowane programowanie
Wydawnictwo Helion
 
SQL. Od podstaw
SQL. Od podstawSQL. Od podstaw
SQL. Od podstaw
Wydawnictwo Helion
 
Microsoft SQL Server 2000. Księga eksperta
Microsoft SQL Server 2000. Księga ekspertaMicrosoft SQL Server 2000. Księga eksperta
Microsoft SQL Server 2000. Księga eksperta
Wydawnictwo Helion
 
Delphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowaneDelphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowane
Wydawnictwo Helion
 

Similar to Oracle9i. Programowanie w języku PL/SQL (20)

SQL Server 2005. Programowanie. Od podstaw
SQL Server 2005. Programowanie. Od podstawSQL Server 2005. Programowanie. Od podstaw
SQL Server 2005. Programowanie. Od podstaw
 
Oracle9i. Przewodnik dla początkujących
Oracle9i. Przewodnik dla początkującychOracle9i. Przewodnik dla początkujących
Oracle9i. Przewodnik dla początkujących
 
Oracle Database 10g. Kompendium administratora
Oracle Database 10g. Kompendium administratoraOracle Database 10g. Kompendium administratora
Oracle Database 10g. Kompendium administratora
 
SQL Server 2005. Wyciśnij wszystko
SQL Server 2005. Wyciśnij wszystkoSQL Server 2005. Wyciśnij wszystko
SQL Server 2005. Wyciśnij wszystko
 
SQL. Leksykon kieszonkowy
SQL. Leksykon kieszonkowySQL. Leksykon kieszonkowy
SQL. Leksykon kieszonkowy
 
Delphi 7 i bazy danych
Delphi 7 i bazy danychDelphi 7 i bazy danych
Delphi 7 i bazy danych
 
Transact-SQL. Czarna księga
Transact-SQL. Czarna księgaTransact-SQL. Czarna księga
Transact-SQL. Czarna księga
 
SQL. Optymalizacja
SQL. OptymalizacjaSQL. Optymalizacja
SQL. Optymalizacja
 
SQL Server 2005
SQL Server 2005SQL Server 2005
SQL Server 2005
 
Bazy danych SQL. Teoria i praktyka
Bazy danych SQL. Teoria i praktykaBazy danych SQL. Teoria i praktyka
Bazy danych SQL. Teoria i praktyka
 
SQL w mgnieniu oka
SQL w mgnieniu okaSQL w mgnieniu oka
SQL w mgnieniu oka
 
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
 
PHP5. Zaawansowane programowanie
PHP5. Zaawansowane programowaniePHP5. Zaawansowane programowanie
PHP5. Zaawansowane programowanie
 
Excel 2003. Programowanie. Zapiski programisty
Excel 2003. Programowanie. Zapiski programistyExcel 2003. Programowanie. Zapiski programisty
Excel 2003. Programowanie. Zapiski programisty
 
Delphi 8 .NET. Kompendium programisty
Delphi 8 .NET. Kompendium programistyDelphi 8 .NET. Kompendium programisty
Delphi 8 .NET. Kompendium programisty
 
PHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danych
PHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danychPHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danych
PHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danych
 
Perl. Zaawansowane programowanie
Perl. Zaawansowane programowaniePerl. Zaawansowane programowanie
Perl. Zaawansowane programowanie
 
SQL. Od podstaw
SQL. Od podstawSQL. Od podstaw
SQL. Od podstaw
 
Microsoft SQL Server 2000. Księga eksperta
Microsoft SQL Server 2000. Księga ekspertaMicrosoft SQL Server 2000. Księga eksperta
Microsoft SQL Server 2000. Księga eksperta
 
Delphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowaneDelphi 7. Ćwiczenia zaawansowane
Delphi 7. Ćwiczenia zaawansowane
 

More from Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
Wydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
Wydawnictwo Helion
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
Wydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Wydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
Wydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Wydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Wydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
Wydawnictwo Helion
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
Wydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
Wydawnictwo Helion
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
Wydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
Wydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
Wydawnictwo Helion
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
Wydawnictwo Helion
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
Wydawnictwo Helion
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
Wydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
Wydawnictwo Helion
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
Wydawnictwo Helion
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
Wydawnictwo Helion
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
Wydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

Oracle9i. Programowanie w języku PL/SQL

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI Oracle9i. Programowanie w jêzyku PL-SQL KATALOG KSI¥¯EK Autor: Scott Urman KATALOG ONLINE T³umaczenie: Rados³aw Meryk ISBN: 83-7361-065-0 ZAMÓW DRUKOWANY KATALOG Format: B5, stron: 536 TWÓJ KOSZYK Wykorzystanie wbudowanego w system Oracle jêzyka PL/SQL w znacz¹cy sposób zwiêksza wydajno æ programisty systemów bazodanowych. PL/SQL ³¹czy w sobie DODAJ DO KOSZYKA mo¿liwo ci i elastyczno æ jêzyka czwartej generacji (4GL) SQL z konstrukcjami proceduralnymi jêzyka trzeciej generacji (3GL). Konstrukcje proceduralne s¹ w pe³ni zintegrowane z Oracle SQL, co daje w rezultacie jêzyk strukturalny o ogromnym CENNIK I INFORMACJE potencjale. Programy napisane w tym jêzyku umo¿liwiaj¹ obs³ugê danych zarówno w samym systemie Oracle, jak i w zewnêtrznych aplikacjach. ZAMÓW INFORMACJE Ksi¹¿ka „Oracle9i. Programowanie w jêzyku PL/SQL” wyja nia g³ówne w³a ciwo ci O NOWO CIACH jêzyka oraz ró¿nice w PL/SQL dla ró¿nych wersji bazy danych. Dziêki niej nauczysz siê projektowaæ, testowaæ i uruchamiaæ aplikacje PL/SQL dzia³aj¹ce w wielu rodowiskach, ZAMÓW CENNIK jak równie¿ poznasz szczegó³y zastosowania jêzyków SQL i PL/SQL, obs³ugi b³êdów, zbioru podprogramów i pakietów, a tak¿e wiele zaawansowanych w³a ciwo ci. Niniejsza pozycja umo¿liwia: CZYTELNIA • Zapoznanie siê z ró¿nymi rodowiskami programistycznymi jêzyka PL/SQL, których kopie znajduj¹ siê na do³¹czonej p³ycie CD FRAGMENTY KSI¥¯EK ONLINE • Poznanie szczegó³ów sk³adni jêzyka PL/SQL: zmienne, typy danych, wyra¿enia, operatory oraz struktury steruj¹ce • Zapewnienie spójno ci danych dziêki instrukcjom sterowania transakcjami dostêpnym w SQL-u • Wykorzystanie kursorów, które pozwalaj¹ na tworzenie zapytañ zwracaj¹cych wiele wierszy oraz jawn¹ kontrolê przetwarzania instrukcji SQL • Tworzenie programów PL/SQL, które wykrywaj¹ i inteligentnie reaguj¹ na b³êdy fazy wykonania • Wykorzystanie mo¿liwo ci tworzenia kolekcji wielopoziomowych w systemie Oracle9i • Tworzenie i korzystanie z procedur, funkcji i pakietów Wydawnictwo Helion • Tworzenie wyzwalaczy DML zastêpuj¹cych i systemowych w celu wymuszania ul. Chopina 6 z³o¿onych ograniczeñ danych 44-100 Gliwice • Korzystanie z zalet jêzyka PL/SQL, takich jak: procedury zewnêtrzne, wbudowany tel. (32)230-98-63 dynamiczny SQL, masowe powi¹zania oraz typy obiektowe e-mail: helion@helion.pl
  • 2. Spis treści O Autorze.................................................................................................................13 Wstęp......................................................................................................................15 Część I Wstęp i środowiska programisty ...........................................21 Rozdział 1. Wprowadzenie do języka PL/SQL............................................................23 Dlaczego język PL/SQL?............................................................................................... 23 PL/SQL a praca w sieci............................................................................................ 25 Normy.................................................................................................................... 26 Właściwości języka PL/SQL.......................................................................................... 26 Struktura bloku ....................................................................................................... 26 Obsługa błędów....................................................................................................... 27 Zmienne i typy danych............................................................................................. 27 Instrukcje warunkowe.............................................................................................. 28 Konstrukcje pętli ..................................................................................................... 29 Kursory .................................................................................................................. 29 Procedury i funkcje ................................................................................................. 30 Pakiety ................................................................................................................... 31 Kolekcje ................................................................................................................. 32 Konwencje stosowane w ksią ce .................................................................................... 32 Wersje języka PL/SQL oraz bazy danych Oracle........................................................ 32 Czcionki ................................................................................................................. 34 Dokumentacja Oracle .............................................................................................. 34 Kod dostępny na płycie CD ...................................................................................... 34 Przykładowe tabele ....................................................................................................... 35 Podsumowanie.............................................................................................................. 40 Rozdział 2. Środowiska programisty oraz wykonawcze..............................................41 Modele aplikacji a PL/SQL............................................................................................ 41 Model dwuwarstwowy............................................................................................. 41 Model trójwarstwowy .............................................................................................. 45 Połączenie z bazą danych......................................................................................... 46 Narzędzia programisty PL/SQL...................................................................................... 47 Program SQL*Plus.................................................................................................. 48 Program Rapid SQL ................................................................................................ 52 Program DBPartner Debugger .................................................................................. 56 Program SQL Navigator........................................................................................... 60 Program TOAD....................................................................................................... 64 Program SQL-Programmer....................................................................................... 68 Program PL/SQL Developer..................................................................................... 71 Narzędzia programistyczne — podsumowanie ........................................................... 73 Podsumowanie.............................................................................................................. 74
  • 3. 6 Oracle9i. Programowanie w języku PL/SQL Część II Podstawowe właściwości języka PL/SQL ..............................75 Rozdział 3. Podstawy języka PL/SQL .......................................................................77 Blok PL/SQL................................................................................................................ 77 Podstawowa struktura bloku..................................................................................... 82 Jednostki leksykalne ...................................................................................................... 84 Identyfikatory ......................................................................................................... 84 Ograniczniki ........................................................................................................... 87 Literały................................................................................................................... 87 Komentarze ............................................................................................................ 89 Deklaracje zmiennych.................................................................................................... 91 Składnia deklaracji .................................................................................................. 91 Inicjowanie zmiennych ............................................................................................ 93 Typy danych w języku PL/SQL...................................................................................... 93 Typy skalarne ......................................................................................................... 94 Typy zło one ........................................................................................................ 103 Typy odnośników.................................................................................................. 103 Typy LOB ............................................................................................................ 103 Typy obiektowe .................................................................................................... 104 Wykorzystanie atrybutu %Type.............................................................................. 104 Podtypy definiowane przez u ytkownika ................................................................. 105 Konwersja pomiędzy typami danych ....................................................................... 106 Zakres i widoczność zmiennej ................................................................................ 108 Wyra enia i operatory.................................................................................................. 109 Przypisanie ........................................................................................................... 109 Wyra enia ............................................................................................................ 110 Struktury sterowania PL/SQL ...................................................................................... 113 Instrukcja IF-THEN-ELSE..................................................................................... 113 Instrukcja CASE ................................................................................................... 117 Pętle..................................................................................................................... 121 Instrukcje GOTO oraz etykiety ............................................................................... 125 Dyrektywy pragma ................................................................................................ 127 Rekordy w języku PL/SQL .......................................................................................... 128 Przypisanie rekordu ............................................................................................... 129 Zastosowanie operatora %ROWTYPE .................................................................... 131 Styl programowania w języku PL/SQL ......................................................................... 131 Wprowadzanie komentarzy .................................................................................... 132 Styl nazw zmiennych ............................................................................................. 133 Stosowanie du ych liter ......................................................................................... 133 Stosowanie odstępów............................................................................................. 133 Ogólne uwagi dotyczące stylu programowania ......................................................... 134 Podsumowanie............................................................................................................ 134 Rozdział 4. SQL w języku PL/SQL ..........................................................................135 Instrukcje SQL ........................................................................................................... 135 Wykorzystanie instrukcji SQL w języku PL/SQL..................................................... 136 Stosowanie dynamicznego SQL.............................................................................. 137 Stosowanie instrukcji DML w języku PL/SQL............................................................... 137 Instrukcja SELECT ............................................................................................... 139 Instrukcja INSERT................................................................................................ 141 Instrukcja UPDATE .............................................................................................. 142 Instrukcja DELETE............................................................................................... 143 Klauzula WHERE ................................................................................................. 144 Wiązania zbiorcze ................................................................................................. 147 Klauzula RETURNING ......................................................................................... 149
  • 4. Spis treści 7 Odnośniki do tabel................................................................................................. 150 Powiązania bazy danych ........................................................................................ 151 Synonimy ............................................................................................................. 151 Pseudokolumny .......................................................................................................... 152 Pseudokolumny CURRVAL oraz NEXTVAL.......................................................... 152 Pseudokolumna LEVEL......................................................................................... 153 Pseudokolumna ROWID........................................................................................ 153 Pseudokolumna ROWNUM ................................................................................... 154 Instrukcje GRANT i REVOKE. Uprawnienia ................................................................ 154 Uprawnienia obiektowe a uprawnienia systemowe ................................................... 155 Instrukcje GRANT oraz REVOKE.......................................................................... 155 Role ..................................................................................................................... 157 Sterowanie transakcjami .............................................................................................. 159 Instrukcja COMMIT a instrukcja ROLLBACK ........................................................ 159 Punkty zachowania................................................................................................ 160 Transakcje a bloki ................................................................................................. 161 Transakcje autonomiczne ....................................................................................... 162 Podsumowanie............................................................................................................ 167 Rozdział 5. Wbudowane funkcje SQL......................................................................169 Wstęp ........................................................................................................................ 169 Funkcje znakowe zwracające wartości znakowe............................................................. 170 Funkcje SUBSTR, SUBSTRB, SUBSTRC, SUBSTR2 oraz SUBSTR4 ..................... 173 SOUNDEX........................................................................................................... 174 Funkcje znakowe zwracające wartości liczbowe............................................................. 175 Funkcje INSTR, INSTRB, INSTRC, INSTR2 oraz INSTR4 ..................................... 176 Funkcje LENGTH, LENGTHB, LENGTHC, LENGTH2 ? oraz LENGTH4............... 177 Funkcje NLS .............................................................................................................. 178 Funkcje numeryczne ................................................................................................... 180 Funkcja WIDTH_BUCKET ................................................................................... 181 Funkcje związane z datą .............................................................................................. 182 Arytmetyka dat ..................................................................................................... 184 Funkcje konwersji ....................................................................................................... 186 Funkcja TO_CHAR (daty lub etykiety) ................................................................... 189 Funkcja TO_CHAR (liczby)................................................................................... 191 Funkcja TO_DATE ............................................................................................... 193 Funkcja TO_NUMBER ......................................................................................... 193 Funkcje TO_TIMESTAMP oraz TO_TIMESTAMP_TZ .......................................... 194 Funkcje agregacji oraz funkcje analityczne .................................................................... 194 Inne funkcje ............................................................................................................... 196 Funkcja DUMP..................................................................................................... 199 Funkcja USERENV............................................................................................... 201 Podsumowanie............................................................................................................ 202 Rozdział 6. Kursory ...............................................................................................203 Czym jest kursor? ....................................................................................................... 203 Przetwarzanie kursorów jawnych............................................................................ 204 Przetwarzanie kursorów niejawnych ....................................................................... 212 Pętle pobierania danych kursora ................................................................................... 214 Pętle proste........................................................................................................... 214 Pętle WHILE ........................................................................................................ 216 Pętle FOR kursora................................................................................................. 217 Wyjątek NO_DATA_FOUND a atrybut %NOTFOUND .......................................... 219 Kursory z klauzulą FOR UPDATE instrukcji SELECT............................................. 219
  • 5. 8 Oracle9i. Programowanie w języku PL/SQL Zmienne kursora ......................................................................................................... 223 Deklaracja zmiennej kursora................................................................................... 224 Przydzielenie obszaru pamięci dla zmiennych kursora .............................................. 225 Otwieranie zmiennej kursora dla zapytania .............................................................. 226 Zamykanie zmiennych kursora ............................................................................... 227 Pierwszy przykład zmiennej kursora ....................................................................... 227 Drugi przykład zmiennej kursora ............................................................................ 229 Ograniczenia u ycia zmiennych kursora .................................................................. 230 Podsumowanie............................................................................................................ 231 Rozdział 7. Obsługa błędów ...................................................................................233 Czym jest wyjątek? ..................................................................................................... 233 Deklarowanie wyjątków......................................................................................... 235 Zgłaszanie wyjątków ............................................................................................. 239 Obsługa wyjątków................................................................................................. 240 Dyrektywa pragma EXCEPTION_INIT .................................................................. 246 Zastosowanie funkcji RAISE_APPLICATION_ERROR .......................................... 247 Propagacja wyjątków .................................................................................................. 250 Wyjątki wywołane w sekcji wykonania ................................................................... 250 Wyjątki zgłaszane w sekcji deklaracji...................................................................... 252 Wyjątki zgłaszane w sekcji wyjątków...................................................................... 254 Wskazówki dotyczące wyjątków .................................................................................. 256 Zakres wyjątków................................................................................................... 256 Unikanie nieobsługiwanych wyjątków..................................................................... 257 Maskowanie lokalizacji błędu................................................................................. 258 Ogólny program obsługi błędów ................................................................................... 259 Podsumowanie............................................................................................................ 266 Rozdział 8. Kolekcje..............................................................................................267 Deklaracje i stosowanie typów kolekcji ......................................................................... 267 Tabele indeksowane .............................................................................................. 268 Tabele zagnie d one.............................................................................................. 272 Tablice VARRAY ................................................................................................. 276 Kolekcje wielopoziomowe ..................................................................................... 278 Porównanie pomiędzy typami kolekcji .................................................................... 279 Kolekcje w bazie danych ............................................................................................. 281 Implikacje dotyczące kolekcji zapisanych w bazie danych......................................... 281 Modyfikowanie całych kolekcji .............................................................................. 285 Działania z indywidualnymi elementami kolekcji ..................................................... 291 Metody kolekcji .......................................................................................................... 297 EXISTS ............................................................................................................... 297 COUNT ............................................................................................................... 299 LIMIT.................................................................................................................. 300 FIRST i LAST ...................................................................................................... 301 NEXT i PRIOR..................................................................................................... 301 EXTEND ............................................................................................................. 302 TRIM................................................................................................................... 304 DELETE .............................................................................................................. 306 Podsumowanie............................................................................................................ 308 Część III Dodatkowe właściwości języka PL/SQL ..............................309 Rozdział 9. Tworzenie procedur, funkcji i pakietów.................................................311 Procedury i funkcje ..................................................................................................... 311 Tworzenie podprogramu ........................................................................................ 312 Parametry podprogramów ...................................................................................... 318
  • 6. Spis treści 9 Instrukcja CALL ................................................................................................... 336 Procedury a funkcje............................................................................................... 339 Pakiety....................................................................................................................... 339 Specyfikacja pakietu .............................................................................................. 339 Treść pakietu ........................................................................................................ 341 Pakiety i zakres ..................................................................................................... 343 Przecią anie podprogramów pakietowych................................................................ 345 Inicjalizacja pakietu ............................................................................................... 348 Podsumowanie............................................................................................................ 350 Rozdział 10. Zastosowanie procedur, funkcji i pakietów...........................................351 Poło enie podprogramów............................................................................................. 351 Podprogramy składowane oraz słownik danych........................................................ 351 Podprogramy lokalne ............................................................................................. 354 Podprogramy składowane a podprogramy lokalne .................................................... 359 Zagadnienia dotyczące podprogramów składowanych i pakietów .................................... 360 Zale ności pomiędzy podprogramami ..................................................................... 360 Stan pakietów w czasie wykonywania ..................................................................... 370 Uprawnienia i podprogramy składowane ................................................................. 375 Stosowanie składowanych funkcji w instrukcjach SQL................................................... 385 Poziomy czystości ................................................................................................. 386 Parametry domyślne .............................................................................................. 393 Wywołanie funkcji składowanych z instrukcji SQL w systemie Oracle8i.................... 393 Przytwierdzanie obiektów w obszarze wspólnym ........................................................... 396 KEEP................................................................................................................... 397 UNKEEP ............................................................................................................. 398 SIZES .................................................................................................................. 398 ABORTED_REQUEST_THRESHOLD ................................................................. 398 Podsumowanie............................................................................................................ 398 Rozdział 11. Wyzwalacze.........................................................................................399 Rodzaje wyzwalaczy ................................................................................................... 399 Tworzenie wyzwalaczy................................................................................................ 403 Tworzenie wyzwalaczy DML................................................................................. 403 Tworzenie wyzwalaczy zastępujących..................................................................... 413 Tworzenie wyzwalaczy systemowych ..................................................................... 419 Inne zagadnienia związane z wyzwalaczami ............................................................ 426 Wyzwalacze a słownik danych ............................................................................... 430 Tabele mutujące.......................................................................................................... 432 Przykład tabeli mutującej ....................................................................................... 434 Rozwiązanie problemu błędu tabeli mutującej.......................................................... 435 Podsumowanie............................................................................................................ 438 Rozdział 12. Zaawansowane właściwości ................................................................439 Właściwości języka ..................................................................................................... 439 Procedury zewnętrzne............................................................................................ 439 Wbudowany dynamiczny SQL ............................................................................... 442 Masowe powiązania............................................................................................... 447 Typy obiektowe .................................................................................................... 454 Du e obiekty......................................................................................................... 458 Potokowe funkcje tabel.......................................................................................... 461 Zaawansowane pakiety ................................................................................................ 462 DBMS_SQL ......................................................................................................... 462 DBMS_PIPE ........................................................................................................ 463 DBMS_ALERT .................................................................................................... 465
  • 7. 10 Oracle9i. Programowanie w języku PL/SQL UTL_FILE ........................................................................................................... 466 UTL_TCP ............................................................................................................ 467 UTL_SMTP ......................................................................................................... 468 UTL_HTTP.......................................................................................................... 469 UTL_INADDR ..................................................................................................... 470 DBMS_JOB ......................................................................................................... 470 DBMS_LOB......................................................................................................... 472 Podsumowanie............................................................................................................ 475 Dodatki ...............................................................................................477 Dodatek A Pakiety dostępne w języku PL/SQL ......................................................479 Opis pakietów ............................................................................................................. 479 DBMS_ALERT .................................................................................................... 479 DBMS_APPLICATION_INFO.............................................................................. 480 DBMS_AQ........................................................................................................... 480 DBMS_AQADM .................................................................................................. 480 DBMS_AQELM ................................................................................................... 480 DBMS_BACKUP_RESTORE ............................................................................... 481 DBMS_DDL ........................................................................................................ 481 DBMS_DEBUG ................................................................................................... 481 DBMS_DEFER .................................................................................................... 482 DBMS_DEFER_QUERY ...................................................................................... 482 DBMS_DEFER_SYS ............................................................................................ 482 DBMS_DESCRIBE .............................................................................................. 482 DBMS_DISTRIBUTED_TRUST_ADMIN ............................................................. 483 DBMS_FGA......................................................................................................... 483 DBMS_FLASHBACK........................................................................................... 483 DBMS_HS ........................................................................................................... 483 DBMS_HS_PASSTHROUGH ............................................................................... 484 DBMS_IOT.......................................................................................................... 484 DBMS_JAVA....................................................................................................... 484 DBMS_JOB ......................................................................................................... 484 DBMS_LDAP ...................................................................................................... 485 DBMS_LIBCACHE .............................................................................................. 485 DBMS_LOB......................................................................................................... 485 DBMS_LOCK ...................................................................................................... 485 DBMS_LOGMNR ................................................................................................ 485 DBMS_LOGMNR_CDC_PUBLISH ...................................................................... 486 DBMS_LOGMNR_CDC_SUBSCRIBE.................................................................. 486 DBMS_LOGMNR_D............................................................................................ 486 DBMS_METADATA............................................................................................ 486 DBMS_MVIEW (DBMS_SNAPSHOT) ................................................................. 487 DBMS_OBFUSCATION_TOOLKIT ..................................................................... 487 DBMS_ODCI ....................................................................................................... 487 DBMS_OFFLINE_OG .......................................................................................... 487 DBMS_OFFLINE_SNAPSHOT ............................................................................ 487 DBMS_OLAP ...................................................................................................... 488 DBMS_ORACLE_TRACE_AGENT...................................................................... 488 DBMS_ORACLE_TRACE_USER ......................................................................... 488 DBMS_OUTLN ................................................................................................... 488 DBMS_OUTLN_EDIT ......................................................................................... 488 DBMS_OUTPUT ................................................................................................. 489 DBMS_PCLXUTIL .............................................................................................. 489
  • 8. Spis treści 11 DBMS_PIPE ........................................................................................................ 489 DBMS_PROFILER............................................................................................... 489 DBMS_RANDOM ................................................................................................ 490 DBMS_RECTIFIER_DIFF.................................................................................... 490 DBMS_REDIFINITION........................................................................................ 490 DBMS_REFRESH ................................................................................................ 490 DBMS_REPAIR ................................................................................................... 490 DBMS_REPCAT, DBMS_REPCAT_ADMIN, DBMS_REPCAT_ INSTANTIATE, DBMS_REPCAT_RGT oraz DBMS_REPUTIL.................................................... 491 DBMS_RESOURCE_MANAGER i DBMS_RESOURCE_ MANAGER_PRIVS....... 491 DBMS_RESUMABLE .......................................................................................... 491 DBMS_RLS ......................................................................................................... 492 DBMS_ROWID.................................................................................................... 492 DBMS_SESSION ................................................................................................. 492 DBMS_SHARED_POOL ...................................................................................... 492 DBMS_SPACE i DBMS_SPACE_ADMIN............................................................. 493 DBMS_SQL ......................................................................................................... 493 DBMS_STANDARD i STANDARD ...................................................................... 493 DBMS_STATS..................................................................................................... 493 DBMS_TRACE .................................................................................................... 493 DBMS_TRANSACTION ...................................................................................... 494 DBMS_TRANSFORM.......................................................................................... 494 DBMS_TTS ......................................................................................................... 494 DBMS_TYPES..................................................................................................... 494 DBMS_UTILITY ................................................................................................. 495 DBMS_WM ......................................................................................................... 495 DBMS_XMLQUERY, DBMS_XMLSAVE i XMLGEN .......................................... 495 DEBUG_EXTPROC ............................................................................................. 495 SDO_CS, SDO_GEOM, SDE_LRS, SDO_MIGRATE i SDO_TUNE ....................... 495 UTL_COLL ......................................................................................................... 496 UTL_ENCODE .................................................................................................... 496 UTL_FILE ........................................................................................................... 496 UTL_HTTP.......................................................................................................... 496 UTL_INADDR ..................................................................................................... 497 UTL_PG .............................................................................................................. 497 UTL_RAW........................................................................................................... 497 UTL_REF ............................................................................................................ 497 UTL_SMTP ......................................................................................................... 498 UTL_TCP ............................................................................................................ 498 UTL_URL............................................................................................................ 498 Dodatek B Słowa kluczowe w języku PL/SQL.........................................................499 Tablica zarezerwowanych słów .................................................................................... 499 Dodatek C Słownik danych ...................................................................................503 Czym jest słownik danych? .......................................................................................... 503 Standardy nazewnictwa.......................................................................................... 503 Uprawnienia ......................................................................................................... 504 Rodzaje perspektyw .............................................................................................. 504 Zestawienie dostępnych perspektyw ............................................................................. 505 Relacyjne klastry, tabele i perspektywy ................................................................... 505 Kolekcje, obiekty LOB oraz typy obiektowe............................................................ 507 Perspektywy wprowadzone w systemach Oracle8i oraz Oracle9i .............................. 508 Inne obiekty bazy danych....................................................................................... 510 Partycje i podpartycje ............................................................................................ 511
  • 9. 12 Oracle9i. Programowanie w języku PL/SQL Indeksy ................................................................................................................ 513 Materializowane perspektywy, podsumowania i migawki.......................................... 514 Podprogramy, metody i wyzwalacze ....................................................................... 516 Kody źródłowe i błędy kompilacji........................................................................... 517 Zale ności i ograniczenia ....................................................................................... 518 Statystyki i audyt................................................................................................... 518 Uprawnienia i ich nadawanie........................................................................................ 519 Skorowidz .............................................................................................................521
  • 10. Rozdział 11. Wyzwalacze Wyzwalacze stanowią czwarty typ bloków nazwanych PL/SQL. Posiadają wiele właści- wości charakterystycznych dla podprogramów (które omówiono w poprzednich dwóch podrozdziałach), ale tak e ró nią się od nich w istotny sposób. W niniejszym rozdziale Czytelnik zapozna się ze sposobem tworzenia wyzwalaczy oraz z niektórymi mo liwymi zastosowaniami tych obiektów. Rodzaje wyzwalaczy Wyzwalacze są podobne do procedur lub funkcji pod tym względem, e są nazwanymi blokami PL/SQL, w których występują sekcje deklaracji, wykonania i obsługi wyjątków. Podobnie jak pakiety, wyzwalacze muszą być składowane jako samodzielne obiekty w bazie danych i nie mogą występować lokalnie w bloku lub w pakiecie. Jak napisano w ostatnich dwóch rozdziałach, procedura jest wykonywana jawnie z innego bloku za pośrednictwem wywołania procedury, które daje mo liwość przekazania argumentów. Wyzwalacz natomiast jest wykonywany niejawnie, jeśli wystąpi zdarzenie wyzwalają- ce. Poza tym wyzwalacz nie akceptuje argumentów. Rozpoczęcie wykonywania wyzwa- lacza jest nazywane uruchamianiem wyzwalacza (firing). Zdarzeniem wyzwalającym mo- e być operacja DML (instrukcje +05'46, 72&#6' lub &'.'6') wykonywana dla tabeli bazy danych lub odpowiedniego rodzaju perspektyw. W systemie Oracle8i rozszerzono mo li- wości uruchamiania wyzwalaczy o zdarzenia systemowe, takie jak: uruchomienie lub za- mknięcie bazy danych, a tak e określone rodzaje operacji DDL. Zdarzenia wyzwalające zostaną szczegółowo omówione w dalszej części tego rozdziału. Wyzwalacze mo na stosować do wielu celów, przykładowo: Utrzymywanie zło onych więzów integralności, niemo liwych do uzyskania przez więzy deklaracji uaktywniane podczas tworzenia tabeli. Kontrola danych w tabeli przez rejestrowanie dokonywanych zmian oraz autorów tych zmian. Automatyczne przekazywanie do innych programów informacji, e jest wymagane podjęcie określonych działań w razie dokonania zmian w tabeli. Publikowanie informacji na temat ró nego rodzaju zdarzeń w środowisku publikowanie-subskrypcja.
  • 11. 400 Część III Dodatkowe właściwości języka PL/SQL Istnieją trzy podstawowe rodzaje wyzwalaczy: DML, zastępujące (instead-of) oraz syste- mowe. W następnych podrozdziałach będzie omówiony ka dy z tych typów, szczegó- łowo w podrozdziale „Tworzenie wyzwalaczy”. W systemie Oracle8i oraz w wersjach wyższych istnieje możliwość pisania wyzwalaczy zarówno w języku PL/SQL, jak i innych. Wyzwalacze te można następnie wywołać ja- ko procedury zewnętrzne. Więcej informacji na ten temat znajduje się w podrozdziale „Treść wyzwalaczy”, a także w rozdziale 12. Wyzwalacze DML Wyzwalacze DML są uruchamiane przez instrukcje DML, a typ wyzwalacza DML jest określany przez typ instrukcji. Mo na je definiować dla operacji +05'46, 72&#6' lub &'.'6', uruchamiać przed operacją lub po niej, a tak e w związku z operacjami dotyczącymi wier- sza lub instrukcji. Przykładowo, mo e zachodzić potrzeba śledzenia danych statystycznych, dotyczących ró - nych specjalności, włącznie z liczbą studentów zarejestrowanych i liczbą zaliczeń. Dane te mogą być przechowywane w tabeli UVCV[UV[MCAURGELCNPQUEK: Dostępne na płycie CD jako część skryptu tabele.sql. %4'#6' 6#$.' URGEAUVCVU URGELCNPQUE 8#4%*#4 QIQNGOACNKEGPKC 07/$'4 QIQNGOAUVWFGPEK 07/$'4 W celu zapewnienia ciągłej aktualności danych z tabeli URGEAUVCVU mo na utworzyć wy- zwalacz dla tabeli UVWFGPEK, który będzie poprawiał tę pierwszą po ka dej zmianie dokona- nej w tabeli UVWFGPEK. Zadanie to mo e wykonywać poni szy wyzwalacz 7CMVWCNPKL 5RGE5VCVU. Po ka dej operacji DML wykonanej na tabeli UVWFGPEK nastąpi uruchomienie wyzwalacza. Zawartość wyzwalacza wykonuje zapytanie na tabeli UVWFGPEK i uaktualnia statystykę w URGEAUVCVU: Dostępne na płycie CD w skrypcie UaktualnijSpecStats.sql. %4'#6' 14 4'2.#%' 64+))'4 7CMVWCNPKL5RGE5VCVU
  • 12. CRGYPKC EKæI æ CMVWCNPQ è VCDGNK URGEAUVCVU YRTQYCFCLæE OKCP[ FQMQP[YCPG Y VCDGNK UVWFGPEK
  • 13. #(6'4 +05'46 14 '.'6' 14 72#6' 10 UVWFGPEK '%.#4' %74514 MA5VCV[UV[MC +5 5'.'%6 URGELCNPQUE %1706
  • 14. QIQNGOAUVWFGPEK 57/ DKGCEGACNKEGPKC QIQNGOACNKEGPKC (41/ UVWFGPEK )4172 $; URGELCNPQUE
  • 15. Rozdział 11. Wyzwalacze 401 $')+0
  • 16. 0CLRKGTY QUVCPæ WUWPKúVG YKGTUG VCDGNK URGEAUVCVU 5RQYQFWLG VQ Y[GTQYCPKG UVCV[UV[MK K MQPKGEPQ è TQNKEGPKC YU[UVMKEJ UVWFGPVÎY QMTG NQPGL URGELCNPQ EK
  • 18. 0CUVúRPKG DúFKG Y[MQPCPC RúVNC FNC MC FGL URGELCNPQ EK K YUVCYKQPG QFRQYKGFPKG YKGTUG FQ VCDGNK URGEAUVCVU
  • 19. (14 A4GMQTF5VCV KP MA5VCV[UV[MC .112 +05'46 +061 URGEAUVCVU URGELCNPQUE QIQNGOACNKEGPKC QIQNGOAUVWFGPEK 8#.7'5 A4GMQTF5VCVURGELCNPQUE A4GMQTF5VCVQIQNGOACNKEGPKC A4GMQTF5VCVQIQNGOAUVWFGPEK '0 .112 '0 7CMVWCNPKL5RGE5VCVU Wyzwalacz mo na uruchomić dla więcej ni jednego typu instrukcji wyzwalających. Na przykład, wyzwalacz 7CMVWCNPKL5RGE5VCVU mo na uruchomić dla instrukcji +05'46, 72#6' oraz '.'6'. Zdarzenie wyzwalające określa jedną operację DML lub więcej, które powinny spowodować uruchomienie wyzwalacza. Wyzwalacze zastępujące W systemie Oracle8 wprowadzono dodatkowy typ wyzwalacza. Wyzwalacze zastępujące (Instead-of) mogą być definiowane tylko dla perspektyw (relacyjnych lub obiektowych). Inaczej ni wyzwalacze DML, które uruchamiają się obok operacji DML, wyzwalacze za- stępujące uruchamiają się zamiast wyzwalającej je instrukcji DML. Wyzwalacze zastę- pujące działają na poziomie wierszy. Dla przykładu proszę przeanalizować perspektywę ITWR[ARQMQLG: Dostępne na płycie CD jako część skryptu Zamiast.sql. %4'#6' 14 4'2.#%' 8+'9 ITWR[ARQMQLG #5 5'.'%6 Y[FKCN MWTU DWF[PGM RQMQLAPWOGT (41/ RQMQLG ITWR[ 9*'4' RQMQLGRQMQLAKF ITWR[RQMQLAKF Bezpośrednia operacja wstawienia wierszy do tej perspektywy jest nieprawidłowa, ponie- wa jest to złączenie dwóch tabel, a do wykonania operacji +05'46 potrzebna jest mody- fikacja obu tabel. Taką sytuację pokazano w poni szej sesji programu SQL*Plus: Dostępne na płycie CD jako część skryptu Zamiast.sql. 53. +05'46 +061 ITWR[ARQMQLG Y[FKCN MWTU DWF[PGM RQMQLAPWOGT 8#.7'5 /7 $WF[PGM /W[MK +05'46 +061 ITWR[ARQMQLG Y[FKCN MWTU DWF[PGM RQMQLAPWOGT
  • 20. $ ä Y NKPKK 14# PKG OQ PC OQF[HKMQYCè YKúEGL PK LGFPGL VCDGNK DCQYGL C RQ TGFPKEVYGO RGTURGMV[Y[ DúFæEGL æEGPKGO
  • 21. 402 Część III Dodatkowe właściwości języka PL/SQL Mo na jednak utworzyć wyzwalacz zastępujący, wykonujący poprawne operacje dla in- strukcji +05'46, a mianowicie modyfikację obu tabel: Dostępne na płycie CD jako część skryptu Zamiast.sql. %4'#6' 64+))'4 +PUGTV)TWR[2QMQLG +056'# 1( +05'46 10 ITWR[ARQMQLG '%.#4' ARQMQL+ RQMQLGRQMQLAKF 6;2' $')+0 0CLRKGTY QMTG NQPQ KFGPV[HKMCVQT RQMQLW 5'.'%6 RQMQLAKF +061 ARQMQL+ (41/ RQMQLG 9*'4' DWF[PGM PGYDWF[PGM #0 RQMQLAPWOGT PGYRQMQLAPWOGT 6GTC WCMVWCNPKC UKú VCDGNú ITWR[ 72#6' )472; 5'6 RQMQLAKF ARQMQL+ 9*'4' Y[FKCN PGYY[FKCN #0 MWTU PGYMWTU '0 )TWR[2QMQLG+PUGTV Dzięki wyzwalaczowi )TWR[2QMQLG+PUGTV wykonanie instrukcji +05'46 kończy się po- wodzeniem. W obecnej postaci wyzwalacz )TWR[2QMQLG+PUGTV nie sprawdza błędów. Niedogodność ta zostanie zlikwidowana w dalszej części tego rozdziału, w podrozdziale „Tworzenie wy- zwalaczy zastępujących”. Wyzwalacze systemowe W systemie Oracle8i oraz w systemach wy szych wprowadzono trzeci typ wyzwalaczy — wyzwalacze systemowe, które uruchamiają się w przypadku wystąpienia zdarzenia sys- temowego, takiego jak uruchomienie lub zatrzymanie bazy danych, nie zaś w przypadku wykonania instrukcji DML na tabeli. Wyzwalacz systemowy mo na tak e uruchomić dla operacji DDL, jak np. utworzenia tabeli. Przykładowo, chęć zarejestrowania utwo- rzenia obiektu słownika danych mo na zrobić poprzez następującą tabelę: Dostępne na płycie CD jako część skryptu ZarejestrujOperTworzenia.sql. %4'#6' 6#$.' VYQTGPKGAFFN KFAW[VMQYPKMC 8#4%*#4 V[RAQDKGMVW 8#4%*#4 PCYCAQDKGMVW 8#4%*#4 YNCUEKEKGNAQDKGMVW 8#4%*#4 FCVCAWVYQTGPKC #6'
  • 22. Rozdział 11. Wyzwalacze 403 Po sformułowaniu tej tabeli mo na utworzyć wyzwalacz systemowy, którego zadaniem bę- dzie rejestrowanie interesujących informacji. Zadanie to wypełni wyzwalacz CTGLGUVTWL 1RGT6YQTGPKC — po ka dej operacji %4'#6' w bie ącym schemacie zarejestruje informa- cje na temat właśnie utworzonego obiektu w tabeli VYQTGPKGAFFN: Dostępne na płycie CD jako część skryptu ZarejestrujOperTworzenia.sql. %4'#6' 14 4'2.#%' 64+))'4 CTGLGUVTWL1RGT6YQTGPKC #(6'4 %4'#6' 10 #6#$#5' $')+0 +05'46 +061 VYQTGPKGAFFN KFAW[VMQYPKMC V[RAQDKGMVW PCYCAQDKGMVW YNCUEKEKGNAQDKGMVW FCVCAWVYQTGPKC 8#.7'5 75'4 5;5+%6+10#4;A1$,A6;2' 5;5+%6+10#4;A1$,A0#/' 5;5+%6+10#4;A1$,A190'4 5;5#6' '0 CTGLGUVTWL1RGT6YQTGPKC Tworzenie wyzwalaczy Niezale nie od typu wszystkie wyzwalacze tworzy się za pomocą tej samej składni, która — ogólnie — jest następująca: %4'#6' =14 4'2.#%'? 64+))'4 PCYCAY[YCNCEC ]$'(14' ^ #(6'4 ^ +056'# 1(_ FCTGPKGAY[YCNCLCEG =MNCWWNCAAQFYQNCPKGO? =9*'0 YCTWPGMAY[YCNCEC? =(14 '#%* 419? VTGUEAY[YCNCEC W składni PCYCAY[YCNCEC jest nazwą wyzwalacza, FCTGPKGAY[YCNCLCEG określa zdarzenie uruchamiające wyzwalacz (mo e równie zawierać odwołanie do tabeli lub perspektywy), natomiast VTGUEAY[YCNCEC jest głównym kodem wyzwalacza. Argument MNCWWNCAAQFYQNCPKGO jest wykorzystywany w celu odwołania do danych w modyfikowa- nym wierszu pod inną nazwą. Najpierw następuje ocena warunku YCTWPGMAY[YCNCEC w klauzuli 9*'0. Treść wyzwalacza jest wykonywana tylko wtedy, kiedy ten warunek przyjmie wartość 647'. Więcej przykładów ró nych rodzajów wyzwalaczy przeanalizo- wano w kolejnych podrozdziałach. Rozmiar treści wyzwalacza nie może przekroczyć 32K. W przypadku większego wyzwa- lacza można zredukować jego objętość poprzez przeniesienie fragmentów kodu do od- dzielnie skompilowanych pakietów lub procedur składowanych i wywołanie ich z treści wyzwalacza. Ze względu na dużą częstotliwość wykonywania dobrą praktyką jest utrzy- mywanie małego rozmiaru treści wyzwalaczy. Tworzenie wyzwalaczy DML Wyzwalacze DML są uruchamiane dla operacji +05'46, 72#6' lub '.'6' dotyczących tabeli bazy danych. Następuje to przed wykonaniem określonej operacji lub po. Wyzwa- lacze mogą być wykonane raz w stosunku do wiersza, którego operacja dotyczy lub raz
  • 23. 404 Część III Dodatkowe właściwości języka PL/SQL w stosunku do określonej operacji. Połączenie tych czynników określa rodzaj wyzwalacza. W sumie istnieje 12 mo liwych typów: 3 rodzaje instrukcji × 2 rodzaje czasów × 2 mo - liwe poziomy. Przykładowo, wszystkie podane ni ej typy wyzwalacza są prawidłowe: $'(14' (przed) na poziomie instrukcji 72#6'. #(6'4 (po) instrukcji +05'46 na poziomie wiersza. $'(14' (przed) instrukcją '.'6' na poziomie wiersza. W tabeli 11.1 znajduje się zestawienie tych mo liwości. Wyzwalacz jest tak e uruchamia- ny dla więcej ni jednego typu instrukcji DML dla określonej tabeli, np. +05'46 oraz 72#6'. Kod w wyzwalaczu jest wykonywany razem z samą instrukcją wyzwalającą, jako część tej samej transakcji. Tabela 11.1. Typy wyzwalaczy Kategoria Wartości Komentarz Instrukcja +05'46, '.'6', 72#6' Definiuje rodzaj instrukcji DML powodującej uruchomienie wyzwalacza. Czas $'(14' (przed) lub #(6'4 (po) Określa, czy wyzwalacz zostanie uruchomiony przed wykonaniem instrukcji czy te po jej wykonaniu. Poziom Wiersz lub instrukcja Je eli dany wyzwalacz istnieje na poziomie wiersza, jest uruchamiany po jednym razie dla ka dego wiersza, którego dotyczy instrukcja. Je eli dany wyzwalacz jest wyzwalaczem na poziomie instrukcji, to jest uruchamiany jeden raz — przed wykonaniem instrukcji albo po. Wyzwalacz na poziomie wiersza jest identyfikowany przez klauzulę (14 '#%* 419 w definicji wyzwalacza. Dla tabeli mo na zdefiniować dowolną liczbę wyzwalaczy włącznie z mo liwością zde- finiowania więcej ni jednego wyzwalacza dla określonego rodzaju instrukcji DML, np. mo na zdefiniować dwa wyzwalacze #(6'4 '.'6' poziomu instrukcji. Wszystkie wyzwa- lacze tego samego typu będą uruchamiały się sekwencyjnie (więcej informacji na temat kolejności uruchamiania wyzwalaczy znajduje się w następnym podrozdziale). Przed wydaniem języka PL/SQL w wersji 2.1 (system Oracle7 wydanie 7.1) dla tabeli można było zdefiniować tylko jeden wyzwalacz określonego typu — maksymalnie 12. A zatem, aby można było definiować podwójne wyzwalacze tego samego typu dla okre- ślonej tabeli, parametr inicjalizacji %1/2#6+$.' musi mieć wartość 7.1 lub wyższą (co jest niemal pewne). Zdarzenie wyzwalające dla wyzwalacza DML określa nazwę tabeli (oraz kolumny), dla której nastąpi uruchomienie wyzwalacza. W systemie Oracle8i oraz w wersjach wy szych wyzwalacze mo na tak e uruchamiać dla kolumny tabeli zagnie d onej. Więcej informacji na temat tabel zagnie d onych znajduje się w rozdziale 8. Kolejność uruchamiania wyzwalaczy Uruchamianie wyzwalaczy następuje podczas wykonywania instrukcji DML. Poni ej poda- no algorytm ich wykonywania:
  • 24. Rozdział 11. Wyzwalacze 405 1. Wykonanie wyzwalacza $'(14' na poziomie instrukcji, o ile taki istnieje. 2. Dla ka dego wiersza, na którym wykonywana jest instrukcja: wykonanie wyzwalacza $'(14' na poziomie wiersza, o ile taki istnieje; wykonanie samej instrukcji, o ile taka istnieje; wykonanie wyzwalacza #(6'4 na poziomie wiersza, o ile taki istnieje. 3. Wykonanie wyzwalacza #(6'4 na poziomie instrukcji, o ile taki istnieje. Aby to zilustrować, proszę sobie wyobrazić, e utworzono wszystkie cztery rodzaje wy- zwalaczy 72#6' dla tabeli grupy — $'(14' oraz #(6'4 — na poziomie instrukcji oraz na poziomie wiersza. Zostaną utworzone trzy wyzwalacze $'(14' poziomu wiersza oraz dwa wyzwalacze #(6'4 poziomu instrukcji: Dostępne na płycie CD w skrypcie KolejnoscUruchamiania.sql. %4'#6' 5'37'0%' MQNGLPAY[YCNCE[ 56#46 9+6* +0%4'/'06 $; %4'#6' 14 4'2.#%' 2#%-#)' 2CMKGV9[YCNCE[ #5 )NQDCNP[ NKEPKM FQ Y[MQT[UVCPKC Y Y[YCNCECEJ A.KEPKM 07/$'4 '0 2CMKGV9[YCNCE[ %4'#6' 14 4'2.#%' 64+))'4 )TWR[$+PUVTWMELC $'(14' 72#6' 10 ITWR[ $')+0 0CLRKGTY NKEPKM QUVCPKG Y[GTQYCP[ 2CMKGV9[YCNCE[A.KEPKM +05'46 +061 VCDGNCAV[OE MQNAPWO MQNAPCM 8#.7'5 MQNGLPAY[YCNCE[0':68#. $'(14' PC RQKQOKG KPUVTWMELK NKEPKM ^^ 2CMKGV9[YCNCE[A.KEPKM # VGTC QUVCPKG YKúMUQPC LGIQ YCTVQ è Q LGFGP FNC MQNGLPGIQ Y[YCNCEC 2CMKGV9[YCNCE[A.KEPKM 2CMKGV9[YCNCE[A.KEPKM '0 )TWR[$+PUVTWMELC %4'#6' 14 4'2.#%' 64+))'4 )TWR[#+PUVTWMELC #(6'4 72#6' 10 ITWR[ $')+0 +05'46 +061 VCDGNCAV[OE MQNAPWO MQNAPCM 8#.7'5 MQNGLPAY[YCNCE[0':68#. #(6'4 PC RQKQOKG KPUVTWMELK NKEPKM ^^ 2CMKGV9[YCNCE[A.KEPKM YKúMUGPKG Q LGFGP FNC PCUVúRPGIQ Y[YCNCEC 2CMKGV9[YCNCE[A.KEPKM 2CMKGV9[YCNCE[A.KEPKM '0 )TWR[#+PUVTWMELC
  • 25. 406 Część III Dodatkowe właściwości języka PL/SQL %4'#6' 14 4'2.#%' 64+))'4 )TWR[#+PUVTWMELC #(6'4 72#6' 10 ITWR[ $')+0 +05'46 +061 VCDGNCAV[OE MQNAPWO MQNAPCM 8#.7'5 MQNGLPAY[YCNCE[0':68#. #(6'4 PC RQKQOKG KPUVTWMELK NKEPKM ^^ 2CMKGV9[YCNCE[A.KEPKM YKúMUGPKG NKEPKMC FNC PCUVúRPGIQ Y[YCNCEC 2CMKGV9[YCNCE[A.KEPKM 2CMKGV9[YCNCE[A.KEPKM '0 )TWR[#+PUVTWMELC %4'#6' 14 4'2.#%' 64+))'4 )TWR[$9KGTU $'(14' 72#6' 10 ITWR[ (14 '#%* 419 $')+0 +05'46 +061 VCDGNCAV[OE MQNAPWO MQNAPCM 8#.7'5 MQNGLPAY[YCNCE[0':68#. $'(14' PC RQKQOKG YKGTUC NKEPKM ^^ 2CMKGV9[YCNCE[A.KEPKM YKúMUGPKG NKEPKMC FNC PCUVúRPGIQ Y[YCNCEC 2CMKGV9[YCNCE[A.KEPKM 2CMKGV9[YCNCE[A.KEPKM '0 )TWR[$9KGTU %4'#6' 14 4'2.#%' 64+))'4 )TWR[$9KGTU $'(14' 72#6' 10 ITWR[ (14 '#%* 419 $')+0 +05'46 +061 VCDGNCAV[OE MQNAPWO MQNAPCM 8#.7'5 MQNGLPAY[YCNCE[0':68#. $'(14' PC RQKQOKG YKGTUC NKEPKM ^^ 2CMKGV9[YCNCE[A.KEPKM YKúMUGPKG NKEPKMC FNC PCUVúRPGIQ Y[YCNCEC 2CMKGV9[YCNCE[A.KEPKM 2CMKGV9[YCNCE[A.KEPKM '0 )TWR[$9KGTU %4'#6' 14 4'2.#%' 64+))'4 )TWR[$9KGTU $'(14' 72#6' 10 ITWR[ (14 '#%* 419 $')+0 +05'46 +061 VCDGNCAV[OE MQNAPWO MQNAPCM 8#.7'5 MQNGLPAY[YCNCE[0':68#. $'(14' PC RQKQOKG YKGTUC NKEPKM ^^ 2CMKGV9[YCNCE[A.KEPKM YKúMUGPKG NKEPKMC FNC PCUVúRPGIQ Y[YCNCEC 2CMKGV9[YCNCE[A.KEPKM 2CMKGV9[YCNCE[A.KEPKM '0 )TWR[$9KGTU %4'#6' 14 4'2.#%' 64+))'4 )TWR[#9KGTU #(6'4 72#6' 10 ITWR[ (14 '#%* 419 $')+0 +05'46 +061 VCDGNCAV[OE MQNAPWO MQNAPCM 8#.7'5 MQNGLPAY[YCNCE[0':68#. #(6'4 PC RQKQOKG YKGTUC NKEPKM ^^ 2CMKGV9[YCNCE[A.KEPKM YKúMUGPKG NKEPKMC FNC PCUVúRPGIQ Y[YCNCEC 2CMKGV9[YCNCE[A.KEPKM 2CMKGV9[YCNCE[A.KEPKM '0 )TWR[#YKGTU
  • 26. Rozdział 11. Wyzwalacze 407 Teraz mo na wydać następującą instrukcję 72#6': Dostępne na płycie CD jako część skryptu KolejnoscUruchamiania.sql. 72#6' ITWR[ 5'6 NKEDCACNKEGP 9*'4' Y[FKCN +0 *+5 +0( Powy sza instrukcja dotyczy czterech wierszy. Ka dy z wyzwalaczy $'(14' oraz #(6'4 po- ziomu instrukcji jest wykonywany raz oraz wyzwalacze $'(14' i #(6'4 poziomu wiersza są wykonywane po cztery razy. Je eli następnie będzie pobrany wiersze z tabeli VCDGNCA V[OE, to uzyska się następujący wynik: Dostępne na płycie CD w skrypcie KolejnoscUruchamiania.sql. 53. 5'.'%6
  • 27. (41/ VCDGNCAV[OE 14'4 $; MQNAPWO -1.A07/ -1.A0#- $'(14' PC RQKQOKG KPUVTWMELK NKEPKM $'(14' PC RQKQOKG YKGTUC NKEPKM $'(14' PC RQKQOKG YKGTUC NKEPKM $'(14' PC RQKQOKG YKGTUC NKEPKM #(6'4 PC RQKQOKG YKGTUC NKEPKM $'(14' PC RQKQOKG YKGTUC NKEPKM $'(14' PC RQKQOKG YKGTUC NKEPKM $'(14' PC RQKQOKG YKGTUC NKEPKM #(6'4 PC RQKQOKG YKGTUC NKEPKM $'(14' PC RQKQOKG YKGTUC NKEPKM $'(14' PC RQKQOKG YKGTUC NKEPKM $'(14' PC RQKQOKG YKGTUC NKEPKM #(6'4 PC RQKQOKG YKGTUC NKEPKM $'(14' PC RQKQOKG YKGTUC NKEPKM $'(14' PC RQKQOKG YKGTUC NKEPKM $'(14' PC RQKQOKG YKGTUC NKEPKM #(6'4 PC RQKQOKG YKGTUC NKEPKM #(6'4 PC RQKQOKG KPUVTWMELK NKEPKM #(6'4 PC RQKQOKG KPUVTWMELK NKEPKM Dla ka dego uruchamianego wyzwalacza są widoczne zmiany dokonane przez wcześniej- sze wyzwalacze, jak równie inne zmiany w bazie danych dokonane za pomocą instrukcji. Mo na to zauwa yć, obserwując wartość licznika wyświetlaną przez ka dy z wyzwalaczy (więcej informacji na temat zastosowania zmiennych pakietowych znajduje się w roz- dziale 10.). Kolejność uruchamiania wyzwalaczy tego samego typu nie jest określona. Jak mo na za- uwa yć w powy szym przykładzie, dla ka dego z wyzwalaczy są widoczne zmiany wyko- nane przez wyzwalacz uruchomiony wcześniej. Je eli kolejność wykonywanych operacji jest istotna, mo na je wszystkie połączyć w jednym wyzwalaczu.
  • 28. 408 Część III Dodatkowe właściwości języka PL/SQL Kiedy tworzy się migawkę rejestrującą dla tabeli, wówczas system Oracle automa- tycznie utworzy wyzwalacz #(6'4 na poziomie wiersza, który będzie uaktualniał dzien- nik po wykonaniu każdej instrukcji DML. Należy o tym pamiętać, chcąc utworzyć dla tej tabeli dodatkowy wyzwalacz #(6'4 na poziomie wiersza. Są jeszcze inne ograniczenia dotyczące wyzwalaczy i migawek (w systemie Oracle9i znanych pod nazwą materializo- wanych perspektyw). Więcej informacji na ten temat znajduje się w dokumentacji Oracle Server Replication. Identyfikatory korelacji w wyzwalaczach na poziomie wiersza Wyzwalacze na poziomie wiersza uruchamiają się raz dla wiersza przetwarzanego przez instrukcję wyzwalającą. Wewnątrz wyzwalacza mo na uzyskać dostęp do danych w obec- nie przetwarzanym wierszu. Mo na to zrobić za pomocą dwóch identyfikatorów korelacji — QNF oraz PGY. Identyfikator korelacji jest specjalnym rodzajem zmiennej dowiązanej PL/SQL. Dwukropek na początku ka dego z nich wskazuje, e są to zmienne dowiązane w znaczeniu zmiennych hosta wykorzystywanych we wbudowanym PL/SQL i znak ten określa, e nie są to zwykłe zmienne PL/SQL. Kompilator PL/SQL będzie traktował je ja- ko rekordy typu: VCDGNCAY[YCNCLCEC 4196;2' Tu VCDGNCAY[YCNCLCEC jest tabelą, dla której zdefiniowano wyzwalacz. Zatem odwołanie postaci: PGYRQNG będzie prawidłowe tylko wtedy, gdy RQNG jest polem w tabeli wyzwalającej. Znaczenie wartości QNF oraz PGY opisano w tabeli 11.2. Chocia syntaktycznie identyfikatory kore- lacji są traktowane jako rekordy, w rzeczywistości nie są nimi (zagadnienie to omówiono w podrozdziale „Pseudorekordy”). Z tego powodu QNF i PGY nazywane są tak e pseudo- rekordami. Tabela 11.2. Identyfikatory korelacji :old oraz :new Instrukcja Wartości QNF Wartości PGY wyzwalająca +05'46 Nieokreślone — wszystkie pola mają Wartości, które będą wstawione po wykonaniu wartość 07... instrukcji. 72#6' Oryginalne wartości wiersza przed Nowe wartości, które będą uaktualnione uaktualnieniem. po wykonaniu instrukcji. '.'6' Oryginalne wartości przed usunięciem Nieokreślone — wszystkie pola mają wartość 07... wiersza. Wartość QNF jest nieokreślona dla instrukcji +05'46, a wartość PGY jest nieokreślona dla instrukcji '.'6'. Kompilator PL/SQL nie wygeneruje błędu w razie zastosowania QNF dla instrukcji +05'46 lub PGY dla instrukcji '.'6', ale wartości obydwóch pól wy- niosą 07...
  • 29. Rozdział 11. Wyzwalacze 409 W systemie Oracle8i zdefiniowano dodatkowy identyfikator korelacji — RCTGPV. Je eli wyzwalacz zdefiniowano dla tabeli zagnie d onej, to wartości QNF oraz PGY odnoszą się do wierszy w tabeli zagnie d onej, podczas gdy wartość RCTGPV odnosi się do bie ącego wiersza w tabeli nadrzędnej. Więcej informacji na temat zastosowania identyfikatora RCTGPV znajduje się w dokumentacji systemu Oracle. Zastosowanie identyfikatorów :old oraz :new W wyzwalaczu 9[IGPGTWL+5VWFGPVC, którego kod przedstawiono w poni szym przykła- dzie, wykorzystano wartość PGY. Jest to wyzwalacz typu $'(14' na poziomie instrukcji +05'46 i ma słu yć do wypełniania pola + tabeli UVWFGPEK wartością generowaną z se- kwencji UVWFGPEKAUGMYGPELC: Dostępne na płycie CD jako część skryptu WygenerujIDstudenta.sql. %4'#6' 14 4'2.#%' 64+))'4 9[IGPGTWL+5VWFGPVC $'(14' +05'46 14 72#6' 10 UVWFGPEK (14 '#%* 419 $')+0
  • 30. 9[RG PKGPKG RQNC + VCDGNK UVWFGPEK PCUVúRPæ YCTVQ EKæ UGMYGPELK UVWFGPEKAUGMYGPELC + LGUV MQNWOPæ VCDGNK UVWFGPEK CVGO PGY+ LGUV RTCYKF QY[O QFYQ CPKGO
  • 31. 5'.'%6 UVWFGPEKAUGMYGPELCPGZVXCN +061 PGY+ (41/ FWCN '0 9[IGPGTWL+5VWFGPVC Wyzwalacz 9[IGPGTWL+5VWFGPVC faktycznie modyfikuje wartość PGY+. Jest to jed- na z u ytecznych cech wartości PGY — w czasie wykonywania instrukcji zostaną zastoso- wane bie ące wartości PGY. Dzięki wyzwalaczowi 9[IGPGTWL+5VWFGPVC mo na wydać na- stępującą instrukcję +05'46: Dostępne na płycie CD jako część skryptu WygenerujIDstudenta.sql. +05'46 +061 UVWFGPEK KOKG PCYKUMQ 8#.7'5 .QNKVC .CCTWU Instrukcja ta jest wykonywana bez wygenerowania błędu. Nawet w przypadku nieokre- ślenia wartości klucza głównego kolumny + (co jest wymagane) wyzwalacz uzupełni brakującą wartość. W rzeczywistości w razie zdefiniowania wartości dla kolumny + war- tość ta zostanie zignorowana, poniewa wyzwalacz ją zmieni. Podobnie będzie po wydaniu poni szej instrukcji: Dostępne na płycie CD jako część skryptu WygenerujIDstudenta.sql. +05'46 +061 UVWFGPEK + KOKG PCYKUMQ 8#.7'5 GNFC QQO
  • 32. 410 Część III Dodatkowe właściwości języka PL/SQL Kolumna + będzie wypełniona wartością UVWFGPEKAUGMYGPELCPGZVXCN, nie zaś wartością Z powy szego opisu wynika, e nie mo na zmienić wartości PGY w wyzwalaczu #(6'4 na poziomie wiersza, poniewa odpowiednia instrukcja została ju wykonana. Uogólnia- jąc, wartość PGY jest modyfikowana tylko w wyzwalaczu $'(14' na poziomie wiersza, a wartość QNF nigdy nie jest modyfikowana, tylko odczytywana. Rekordy PGY oraz QNF są prawidłowe tylko wewnątrz wyzwalaczy na poziomie wier- sza. Przy próbie odwołania się do tych wartości wewnątrz wyzwalacza na poziomie in- strukcji wystąpi błąd kompilacji. Wyzwalacz na poziomie instrukcji jest wykonywany tylko raz, nawet je eli dana instrukcja przetwarza wiele wierszy, a zatem wartości PGY oraz QNF nie mają adnego znaczenia. W takiej sytuacji nie istnieje bowiem aden wiersz, do którego wartości te mogłyby się odwołać. Pseudorekordy Chocia wartości PGY oraz QNF są syntaktycznie traktowane jako rekordy typu VCDGNCA Y[YCNCLCEC 4196;2', to jednak w rzeczywistości nimi nie są. W efekcie operacje prawi- dłowe dla rekordów nie są poprawne dla wartości PGY oraz QNF, np. nie mo na przypi- sywać ich wartości jako całych rekordów, jedynie uzyskać dostęp do indywidualnych pól. Właściwość tę zilustrowano w poni szym przykładzie: Dostępne na płycie CD jako skrypt Pseudorekordy.sql. %4'#6' 14 4'2.#%' 64+))'4 7UWP6[OE $'(14' '.'6' 10 VCDGNCAV[OE (14 '#%* 419 '%.#4' A4GM6[OE VCDGNCAV[OE 4196;2' $')+0
  • 33. 6Q PKG LGUV RQRTCYPG RT[RKUCPKG RQPKGYC QNF PKG LGUV Y C EKYG TGMQTFGO
  • 35. /Q PC LGFPCM W[UMCè VGP UCO GHGMV RT[RKUWLæE YCTVQ EK RQUEGIÎNP[EJ RÎN RQLGF[PEQ
  • 36. A4GM6[OEMQNAPCM QNFMQNAPCM A4GM6[OEMQNAPWO QNFMQNAPWO '0 7UWP6[OE Ponadto nie jest mo liwe przekazanie wartości QNF oraz PGY do procedur lub funkcji, które przyjmują argumenty typu VCDGNCAY[YCNCLCEC 4196;2'. Klauzula REFERENCING Je eli jest taka potrzeba, to wykorzystuje się klauzulę 4'('4'0%+0) w celu nadania in- nych nazw wartościom PGY oraz QNF. Klauzula ta występuje po zdarzeniu wyzwalają- cym, a przed klauzulą 9*'0 i posiada następującą składnię: 4'('4'0%+0) =1. #5 PCYCAQNF? =0'9 #5 PCYCAPGY?
  • 37. Rozdział 11. Wyzwalacze 411 Wewnątrz treści wyzwalacza mo na wykorzystywać nazwy PCYCAQNF oraz PCYCAPGY zamiast QNF i PGY. Proszę zauwa yć, e w nazwach identyfikatorów korelacji w klau- zuli 4'('4'0%+0) nie u ywa się dwukropków. Poni ej znajduje się alternatywna wersja wy- zwalacza 9[IGPGTWL+5VWFGPVC, gdzie wykorzystano klauzulę 4'('4'0%+0) w celu umo li- wienia odwoływania się do identyfikatora PGY jako PQY[AUVWFGPV: Dostępne na płycie CD jako część skryptu WygenerujIDstudenta.sql. %4'#6' 14 4'2.#%' 64+))'4 9[IGPGTWL+5VWFGPVC $'(14' +05'46 14 72#6' 10 UVWFGPEK 4'('4'0%+0) PGY #5 PQY[AUVWFGPV (14 '#%* 419 $')+0
  • 38. 9[RG PKGPKG RQNC + VCDGNK UVWFGPEK PCUVúRPæ YCTVQ EKæ UGMYGPELK UVWFGPEKAUGMYGPELC + LGUV MQNWOPæ VCDGNK UVWFGPEK CVGO PGY+ LGUV RTCYKF QY[O QFYQ CPKGO
  • 39. 5'.'%6 UVWFGPEKAUGMYGPELCPGZVXCN +061 PQY[AUVWFGPV+ (41/ FWCN '0 9[IGPGTWL+5VWFGPVC Klauzula WHEN Klauzula 9*'0 jest prawidłowa tylko dla wyzwalaczy na poziomie wiersza. Treść wyzwa- lacza, o ile istnieje, mo e być wykonywana tylko dla tych wierszy, które spełniają warunek określony przez tę klauzulę. Poni ej przedstawiono składnię klauzuli 9*'0: 9*'0 YCTWPGM W niej YCTWPGM jest wyra eniem logicznym (boolowskim), sprawdzanym dla ka dego wier- sza. Istnieje mo liwość odwoływania się do pseudorekordów PGY i QNF równie wewnątrz wyra enia stanowiącego warunek, ale wtedy nie stosuje się znaku dwukropka. Uwzględnie- nie znaku dwukropka jest prawidłowe tylko w treści wyzwalacza. Przykładowo, treść wyzwalacza 5RTCYFCNKEGPKC jest wykonywana tylko wówczas, gdy liczba bie ących za- liczeń studenta jest większa ni 20: %4'#6' 14 4'2.#%' 64+))'4 5RTCYFCNKEGPKC $'(14' +05'46 14 72#6' 1( DKGCEGACNKEGPKC 10 UVWFGPEK (14 '#%* 419 9*'0 PGYDKGCEGACNKEGPKC $')+0
  • 40. 6WVCL RQYKPPC UKú PCNG è VTG è Y[YCNCEC
  • 41. '0 Wyzwalacz 5RTCYFCNKEGPKC mo na tak e zapisać w następujący sposób: %4'#6' 14 4'2.#%' 64+))'4 5RTCYFCNKEGPKC $'(14' +05'46 14 72#6' 1( DKGCEGACNKEGPKC 10 UVWFGPEK (14 '#%* 419 $')+0 +( PGYDKGCEGACNKEGPKC 6*'0
  • 42. 6WVCL RQYKPPC UKú PCNG è VTG è Y[YCNCEC
  • 44. 412 Część III Dodatkowe właściwości języka PL/SQL Korzystanie z predykatów wyzwalaczy INSERTING, UPDATING oraz DELETING Omawiany ju w niniejszym rozdziale wyzwalacz 7CMVWCNPKL5VCV5RGE jest wyzwala- czem na poziomie instrukcji +05'46, 72#6' oraz '.'6'. Wewnątrz wyzwalacza tego typu (który jest uruchamiany dla ró nych instrukcji DML) występują trzy funkcje logiczne (boolowskie), które mogą słu yć do określenia rodzaju operacji. Tymi predykatami są +05'46+0), 72#6+0) oraz '.'6+0). Sposób ich działania przedstawiono w poni szej tabeli. Predykat Działanie +05'46+0) 647', je eli instrukcją wyzwalającą jest +05'46, w przeciwnym razie (#.5'. 72#6+0) 647', je eli instrukcją wyzwalającą jest 72#6', w przeciwnym razie (#.5'. '.'6+0) 647', je eli instrukcją wyzwalającą jest '.'6', w przeciwnym razie (#.5'. W systemie Oracle8i zdefiniowano dodatkowe funkcje, podobne do predykatów wy- zwalacza, które można wywołać z treści wyzwalacza. Więcej informacji na ten temat znajduje się w podrozdziale „Funkcje — atrybuty zdarzeń”, w dalszej części niniejszego rozdziału. W wyzwalaczu 4GLGUVTWLOKCP[5 wykorzystano powy sze predykaty w celu zapisu wszystkich zmian dokonywanych w tabeli CTGLGUVTQYCPKAUVWFGPEK. Oprócz tego wyzwa- lacz zapisuje identyfikator u ytkownika wprowadzającego zmiany. Poszczególne rekordy są przechowywane w tabeli 5A#WF[V. Poni ej przedstawiono kod słu ący do jej utworzenia: Dostępne na płycie CD jako część skryptu tabele.sql. %4'#6' 6#$.' 5ACWF[V OKCPCAV[R %*#4 016 07.. OKGPKQPQARTG 8#4%*#4 016 07.. FCVCAECU #6' 016 07.. UVCT[AUVWFGPVAKF 07/$'4 UVCT[AY[FKCN %*#4 UVCT[AMWTU 07/$'4 UVCTCAQEGPC %*#4 PQY[AUVWFGPVAKF 07/$'4 PQY[AY[FKCN %*#4 PQY[AMWTU 07/$'4 PQYCAQEGPC %*#4 Wyzwalacz 4GLGUVTWLOKCP[5 jest tworzony za pomocą poni szego kodu: Dostępne na płycie CD w skrypcie RejestrujZmianyZS.sql. %4'#6' 14 4'2.#%' 64+))'4 4GLGUVTWLOKCP[5 $'(14' +05'46 14 '.'6' 14 72#6' 10 CTGLGUVTQYCPKAUVWFGPEK (14 '#%* 419
  • 45. Rozdział 11. Wyzwalacze 413 '%.#4' AOKCPC6[R %*#4 $')+0
  • 46. CUVQUQYCPQ + FNC KPUVTWMELK +05'46 FNC KPUVTWMELK '.'6' QTC 7 FNC KPUVTWMELK 72#6'
  • 47. +( +05'46+0) 6*'0 AOKCPC6[R + '.5+( 72#6+0) 6*'0 AOKCPC6[R 7 '.5' AOKCPC6[R '0 +(
  • 48. CRKUCPQ Y VCDGNK 5A#WF[V YU[UVMKG OKCP[ FQMQPCPG Y VCDGNK CTGLGUVTQYCPKAUVWFGPEK CUVQUQYCPQ HWPMELú 5;5#6' FQ Y[IGPGTQYCPKC FCVQYPKMC QTC 75'4 Y EGNW W[UMCPKC KFGPV[HKMCVQTC DKG æEGIQ W [VMQYPKMC
  • 49. +05'46 +061 5A#WF[V OKCPCAV[R OKGPKQPQARTG FCVCAECU UVCT[AUVWFGPVAKF UVCT[AY[FKCN UVCT[AMWTU UVCTCAQEGPC PQY[AUVWFGPVAKF PQY[AY[FKCN PQY[AMWTU PQYCAQEGPC 8#.7'5 AOKCPC6[R 75'4 5;5#6' QNFUVWFGPVAKF QNFY[FKCN QNFMWTU QNFQEGPC PGYUVWFGPVAKF PGYY[FKCN PGYMWTU PGYQEGPC '0 4GLGUVTWLOKCP[5 Wyzwalacze zwykle są u ywane do prowadzenia kontroli zmian dokonywanych w danych, jak następowało w przypadku powy szego wyzwalacza 4GLGUVTWLOKCP[5. Chocia ta- kie działanie jest dostępne jako jedna z właściwości bazy danych, to jednak zastoso- wanie wyzwalaczy pozwala na bardziej elastyczną kontrolę. Wyzwalacz 4GLGUVTWL OKCP[5 mo na zmodyfikować i prowadzić, przykładowo, zapis zmian wprowadzanych tylko przez niektórych u ytkowników. Mógłby równie sprawdzać, czy u ytkownicy są uprawnieni do dokonywania zmian, a gdyby tak nie było, wywołać błąd (za pomocą pro- cedury 4#+5'A#22.+%#6+10A'4414). Tworzenie wyzwalaczy zastępujących Inaczej ni wyzwalacze DML, które uruchamiają się dodatkowo, oprócz instrukcji +05'46, 72#6' lub '.'6' (przed tymi operacjami lub po nich), wyzwalacze zastępujące urucha- miają się zamiast operacji DML. Ponadto zastępujące mo na definiować wyłącznie dla perspektyw, podczas gdy wyzwalacze DML są definiowane dla tabel. Wyzwalacze zastę- pujące wykorzystuje się w dwóch przypadkach: w celu umo liwienia modyfikowania perspektyw (bez wyzwalaczy zastępujących byłoby to niemo liwe), w celu modyfikowania kolumn tabeli zagnie d onej będącej kolumną w perspektywie. Pierwszy z tych przypadków zostanie omówiony w tym podrozdziale. Więcej informacji na temat tabel zagnie d onych znajduje się w rozdziale 8.
  • 50. 414 Część III Dodatkowe właściwości języka PL/SQL Perspektywy modyfikowalne a perspektywy niemodyfikowalne Perspektywa modyfikowalna to taka, dla której mo na wydać instrukcję DML. Ogólnie — perspektywa jest modyfikowalna, je eli nie zawiera adnego z poni szych elementów: operatorów zbioru (70+10, 70+10 #.., /+075), funkcji agregacji (57/, #8) itp.), klauzul )4172 $;, %100'%6 $; lub 56#46 9+6*, operatora +56+0%6, złączeń. Istnieją jednak perspektywy zawierające złączenia, które są modyfikowalne. Następuje to wówczas, gdy operacja DML dla tej perspektywy modyfikuje tylko jedną tabelę bazową w danym czasie oraz je eli instrukcja DML spełnia warunki wymienione w tabeli 11.3 (więcej informacji na temat modyfikowalnych i niemodyfikowalnych perspektyw ze złą- czeniami znajduje się w Oracle Concepts). Je eli perspektywa jest niemodyfikowalna, mo na zapisać dla niej wyzwalacz zastępujący, który wykonuje po ądane działania, tzn. umo liwia jej modyfikację. Wyzwalacz zastępujący mo na tak e zapisać dla perspektywy modyfikowalnej w przypadku, gdy istnieje potrzeba wykonania dodatkowych działań. Tabela 11.3. Modyfikowalne perspektywy ze złączeniami Operacja DML Dozwolona, jeżeli: +05'46 Instrukcja nie odnosi się jawnie lub niejawnie do kolumn tabeli bez zachowania kluczy. 72#6' Zmodyfikowane kolumny są odwzorowane na kolumny tabeli z zachowaniem kluczy. '.'6' W złączeniu istnieje dokładnie jedna tabela z zachowaniem kluczy. Tabela 11.3 odnosi się do tabel z zachowaniem kluczy (key-preserved tables). Tabela z za- chowaniem kluczy to taka, w której po złączeniu z inną tabelą, klucze w tej oryginalnej są tak e kluczami w powstałym złączeniu. Więcej informacji na temat tabel z zachowaniem kluczy znajduje się w Application Developer’s Guide — Fundamentals. Przykład wyzwalacza zastępującego Proszę przeanalizować perspektywę ITWR[ARQMQLG, którą wprowadzono we wcześniejszej części tego rozdziału: Dostępne na płycie CD jako część skryptu Zamiast.sql. %4'#6' 14 4'2.#%' 8+'9 ITWR[ARQMQLG #5 5'.'%6 Y[FKCN MWTU DWF[PGM RQMQLAPWOGT (41/ RQMQLG ITWR[ 9*'4' RQMQLGRQMQLAKF ITWR[RQMQLAKF Jak mo na się było wcześniej przekonać, przeprowadzenie operacji +05'46 dla tej per- spektywy jest niedozwolone. Chocia wykonywanie operacji 72#6' i '.'6' jest dla niej poprawne, to jednak nie jest pewne, czy operacje te zostaną dobrze wykonane. Przykła- dowo, instrukcja '.'6' (41/ ITWR[ARQMQLG spowoduje usunięcie wierszy z tabeli grupy.
  • 51. Rozdział 11. Wyzwalacze 415 Jakie działania instrukcji DML w odniesieniu do perspektywy ITWR[ARQMQLG jest prawi- dłowe? To zale y od ustanowionych reguł. Warto jednak zało yć, e operacje te mają następujące znaczenie: Operacja Znaczenie +05'46 Przypisuje nowo wprowadzoną grupę do nowo wprowadzonego pokoju. Wynikiem tego działania jest uaktualnienie tabeli ITWR[. 72#6' Modyfikacja pokoju przypisanego do grupy. Wynikiem tego działania mo e być modyfikacja tabeli ITWR[ lub RQMQLG, w zale ności od tego, które kolumny perspektywy ITWR[ARQMQLG zmodyfikowano. '.'6' Wyzerowanie identyfikatora pokoju z usuniętej grupy. Powoduje to uaktualnienie tabeli ITWR[ i ustawienie identyfikatora na wartość 07... Wymienione wy ej reguły wymusza wyzwalacz )TWR[2QMQLGCOKCUV, dzięki czemu ope- racje DML dla perspektywy ITWR[ARQMQLG mogą być wykonane poprawnie. Jest to pełniej- sza wersja wyzwalacza +PUGTV)TWR[2QMQLG, który pokazano w pierwszym podrozdziale niniejszego rozdziału: Dostępne na płycie CD w skrypcie GrupyPokojeZamiast.sql. %4'#6' 14 4'2.#%' 64+))'4 )TWR[2QMQLGCOKCUV +056'# 1( +05'46 14 72#6' 14 '.'6' 10 ITWR[ARQMQLG (14 '#%* 419 '%.#4' ARQMQL+ RQMQLGRQMQLAKF 6;2' A7CMVWCNPKL)TWR[ $11.'#0 (#.5' A7CMVWCNPKL2QMQLG $11.'#0 (#.5' (WPMELC NQMCNPC YTCECLæEC KFGPV[HKMCVQT RQMQLW PC RQFUVCYKG PWOGTW DWF[PMW QTC PWOGTW RQMQLW (WPMELC YTCEC D æF 14# LG GNK PKG PCNGKQPQ PWOGTW DWF[PMW NWD PWOGTW RQMQLW (70%6+10 RQDKGT+RQMQLW RA$WF[PGM +0 RQMQLGDWF[PGM 6;2' RARQMQL +0 RQMQLGRQMQLAPWOGT 6;2' 4'6740 RQMQLGRQMQLAKF 6;2' +5 ARQMQL+ RQMQLGRQMQLAKF 6;2' $')+0 5'.'%6 RQMQLAKF +061 ARQMQL+ (41/ RQMQLG 9*'4' DWF[PGM RA$WF[PGM #0 RQMQLAPWOGT RARQMQL 4'6740 ARQMQL+ ':%'26+10 9*'0 01A#6#A(170 6*'0 4#+5'A#22.+%#6+10A'4414 0KG PCNGKQPQ RQMQLW '0 RQDKGT+RQMQLW 2TQEGFWTC NQMCNPC URTCYFCLæEC E[ ITWRC KFGPV[HKMQYCPC RTG RA9[FKCN QTC RA-WTU KUVPKGLG ,G GNK PKG I CUCP[ LGUV D æF 14#
  • 52. 416 Część III Dodatkowe właściwości języka PL/SQL 241%'74' URTCYF)TWRG RA9[FKCN +0 ITWR[Y[FKCN 6;2' RA-WTU +0 ITWR[MWTU 6;2' +5 A2QOQEPKEC 07/$'4 $')+0 5'.'%6 +061 A2QOQEPKEC (41/ ITWR[ 9*'4' Y[FKCN RA9[FKCN #0 MWTU RA-WTU ':%'26+10 9*'0 01A#6#A(170 6*'0 4#+5'A#22.+%#6+10A'4414 RA9[FKCN ^^ ^^ RA-WTU ^^ PKG KUVPKGLG '0 URTCYF)TWRG $')+0 +( +05'46+0) 6*'0 6GP HTCIOGPV Y CUCFKG RT[RKUWLG ITWRú FQ QMTG NQPGIQ RQMQLW .QIKMC VGIQ HTCIOGPVW LGUV KFGPV[EPC RT[RCFMKGO WCMVWCNPKL RQMQLG RQPK GL 0CLRKGTY QMTG NC UKú KFGPV[HKMCVQT RQMQLW ARQMQL+ RQDKGT+RQMQLW PGYDWF[PGM PGYRQMQLAPWOGT 0CUVúRPKG WCMVWCNPKC VCDGNú ITWR[ YRTQYCFCLæE PQY[ KFGPV[HKMCVQT 72#6' )472; 5'6 RQMQLAKF ARQMQL+ 9*'4' Y[FKCN PGYY[FKCN #0 MWTU PGYMWTU '.5+( 72#6+0) 6*'0 5RTCYFGPKG E[ WCMVWCNPKC UKú VCDGNú ITWR[ E[ VCDGNú RQMQLG A7CMVWCNPKL)TWR[ PGYY[FKCN QNFY[FKCN 14 PGYMWTU QNFMWTU A7CMVWCNPKL2QMQLG PGYDWF[PGM QNFDWF[PGM 14 PGYRQMQLAPWOGT QNFRQMQLAPWOGT +( A7CMVWCNPKL)TWR[ 6*'0 9 VCMKO RT[RCFMW OKGPKC UKú ITWRú RT[RKUCPæ FQ QMTG NQPGIQ RQMQLW 0CLRKGTY URTCYFCLæE E[ PQYC ITWRC KUVPKGLG URTCYF)TWRG PGYY[FKCN PGYMWTU 2QDTCPKG KFGPV[HKMCVQTC RQMQLW ARQMQL+ RQDKGT+RQMQLW QNFDWF[PGM QNFRQMQLAPWOGT 9[GTQYCPKG RQMQLW FNC UVCTGL ITWR[ 72#6' ITWR[ 5'6 RQMQLAKF 07.. 9*'4' Y[FKCN QNFY[FKCN #0 MWTU QNFMWTU 9TGUEKG RT[RKUCPKG UVCTGIQ RQMQLW FQ PQYGL ITWR[ 72#6' ITWR[ 5'6 RQMQLAKF ARQMQL+ 9*'4' Y[FKCN PGYY[FKCN #0 MWTU PGYMWTU '0 +( +( A7CMVWCNPKL2QMQLG 6*'0 9 V[O HTCIOGPEKG PCUVúRWLG OKCPC RQMQLW FNC FCPGL ITWR[
  • 53. Rozdział 11. Wyzwalacze 417 .QIKMC VGIQ HTCIOGPVW LGUV KFGPV[EPC RT[RCFMKGO YUVCYKCPKC RQY[ GL RQC V[O G PCUVúRWLG WCMVWCNPKGPKG VCDGNK ITWR[ YCTVQ EKæ QNF COKCUV PGY 0CLRKGTY PCNG [ QMTG NKè KFGPV[HKMCVQT RQMQLW ARQMQL+ RQDKGT+RQMQLW PGYDWF[PGM PGYRQMQLAPWOGT 7CMVWCNPKGPKG VCDGNK ITWR[ RQRTG YRTQYCFGPKG PQYGIQ KFGPV[HKMCVQTC 72#6' )472; 5'6 RQMQLAKF ARQMQL+ 9*'4' Y[FKCN QNFY[FKCN #0 MWTU QNFMWTU '0 +( '.5' 9 V[O HTCIOGPEKG PCUVúRWLG Y[GTQYCPKG RT[RKUCPKC ITWR[ FQ RQMQLW DG MQPKGEPQ EK WUWYCPKC YKGTU[ RQYKæCP[EJ VCDGN 72#6' ITWR[ 5'6 RQMQLAKF 07.. 9*'4' Y[FKCN QNFY[FKCN #0 MWTU QNFMWTU '0 +( '0 )TWR[2QMQLGCOKCUV Klauzula (14 '#%* 419 dla wyzwalacza zastępującego jest opcjonalna. Wszystkie wy- zwalacze zastępujące są wyzwalaczami na poziomie wiersza, niezależnie od występo- wania klauzuli. Wyzwalacz )TWR[2QMQLGCOKCUV wykorzystuje predykaty wyzwalaczy w celu zidentyfiko- wania wykonywanej operacji DML i podjęcia odpowiednich działań. Na rysunku 11.1 przedstawiono początkową zawartość tabel ITWR[, RQMQLG oraz perspektywy ITWR[ARQMQLG. Rysunek 11.1. Początkowa zawartość tabel grupy, pokoje oraz perspektywy grupy_pokoje Proszę sobie wyobrazić, e wydano następnie taką instrukcję +05'46: Dostępne na płycie CD jako część skryptu GrupyPokojeZamiast.sql. +05'46 +061 ITWR[ARQMQLG 8#.7'5 /7 $WF[PGM /W[MK Wyzwalacz powoduje, e tabela ITWR[ jest zmieniana zgodnie z nowym przypisaniem grupy do pokoju. Zilustrowano to na rysunku 11.2.