Darmowy fragment publikacji:
Oracle Database 10g
Express Edition. Tworzenie
aplikacji internetowych w PHP
Autor: Michael McLaughlin
T‡umaczenie: Rafa‡ Joæca
ISBN: 978-83-246-1204-8
Tytu‡ orygina‡u: Oracle Database 10g
Express Edition PHP Web Programming
Format: B5, stron: 656
Zawiera CD-ROM
Buduj swoje aplikacje na solidnych podstawach
(cid:149) Poznaj zasady ‡„czenia skrypt(cid:243)w PHP z baz„ Oracle
(cid:149) Wykorzystaj sesje do zabezpieczania transakcji bazodanowych
(cid:149) Zoptymalizuj wydajno(cid:156)(cid:230) aplikacji
Baza danych Oracle od dawna s‡ynie z wyj„tkowej stabilno(cid:156)ci, wydajno(cid:156)ci i... ceny! Jednak
po wydaniu jej najnowszej wersji, oznaczonej symbolem 10g, producent zdecydowa‡ siŒ na
zaskakuj„cy krok, udostŒpni‡ jedn„ z nich (cid:150) Express Edition (cid:150) bezp‡atnie. Otworzy‡o to przed
tw(cid:243)rcami aplikacji sieciowych mo¿liwo(cid:156)ci wykorzystania tego doskona‡ego produktu
w projektach niskobud¿etowych. WszŒdzie tam, gdzie klienci oczekuj„ zaplecza bazodanowego
zbudowanego w oparciu o sprawdzony system i nieprzychylnie reaguj„ na rozwi„zania
open-source, mo¿na dzi(cid:156) zaproponowa(cid:230) Oracle Database 10g Express Edition. Aby jednak
w aplikacjach internetowych w pe‡ni wykorzysta(cid:230) mo¿liwo(cid:156)ci tego rozwi„zania, trzeba pozna(cid:230)
specyficzne dla niego techniki programistyczne.
Ksi„¿ka (cid:132)Oracle Database 10g Express Edition. Tworzenie aplikacji internetowych w PHP(cid:148)
to podrŒcznik, w kt(cid:243)rym znajdziesz om(cid:243)wienie wszystkich aspekt(cid:243)w korzystania z bazy Oracle
10g w po‡„czeniu ze skryptami PHP. Dowiesz siŒ, jak zainstalowa(cid:230) i skonfigurowa(cid:230) (cid:156)rodowisko
robocze i poznasz najwa¿niejsze elementy jŒzyka PHP. Nauczysz siŒ tworzy(cid:230) bezpieczne
i wydajne aplikacje internetowe wykorzystuj„ce ogromne mo¿liwo(cid:156)ci bazy Oracle 10g Express
Edition. Przeczytasz o uwierzytelnianiu u¿ytkownik(cid:243)w, zabezpieczaniu transakcji, stosowaniu
procedur sk‡adowanych i obs‡udze du¿ych obiekt(cid:243)w. Znajdziesz tu r(cid:243)wnie¿ informacje
o administrowaniu baz„ Oracle, formu‡owaniu zapytaæ SQL oraz optymalizowaniu aplikacji
pod k„tem wydajno(cid:156)ci i szybko(cid:156)ci dzia‡ania.
(cid:149) Instalacja i konfiguracja Oracle Express, Apache i PHP
(cid:149) Typy danych w PHP
(cid:149) Instrukcje i polecenia jŒzyka PHP
(cid:149) Programowanie obiektowe
(cid:149) Obs‡uga b‡Œd(cid:243)w
(cid:149) Praca z systemem plik(cid:243)w
(cid:149) Korzystanie z plik(cid:243)w cookie i mechanizm(cid:243)w sesji
(cid:149) Po‡„czenie skryptu z baz„ danych Oracle
(cid:149) Operacje na danych w bazie
(cid:149) Korzystanie z procedur sk‡adowanych
(cid:149) Obs‡uga obiekt(cid:243)w typu BLOB
Wykorzystaj pe‡niŒ mo¿liwo(cid:156)ci Oracle 10g Express Edition,
buduj„c wydajne i bezpieczne aplikacje internetowe
Wydawnictwo Helion
ul. Ko(cid:156)ciuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
Spis treści
O autorze ................................................................................................. 11
Wprowadzenie .......................................................................................... 13
Część
Rozdział 1. Omówienie PHP i programowania stron WWW
I Podstawy języka PHP ......................................................... 17
Rozdział 2.
z użyciem baz danych Oracle .................................................................... 19
Historia i tło .................................................................................................................................. 20
Czym jest PHP? ...................................................................................................................... 20
Czym jest Oracle? .................................................................................................................. 21
Czym jest Zend? ..................................................................................................................... 21
Tworzenie rozwiązań dla aplikacji internetowych ....................................................................... 22
Co i gdzie się umieszcza i dlaczego właśnie tak? .................................................................. 22
Co oferuje Oracle dla języka PHP? ........................................................................................ 24
Dlaczego PHP 5 jest istotny? ................................................................................................. 24
Podsumowanie .............................................................................................................................. 24
Instalacja i konfiguracja Oracle Express, Apache i PHP ............................. 25
Instalacja na platformie Linux ...................................................................................................... 26
Apache .................................................................................................................................... 26
Oracle Database Express Edition ........................................................................................... 27
PHP ......................................................................................................................................... 31
Instalacja na platformie Windows XP .......................................................................................... 37
Apache .................................................................................................................................... 38
Oracle Database Express Edition ........................................................................................... 42
PHP ......................................................................................................................................... 46
Podsumowanie .............................................................................................................................. 58
Rozdział 3. Tworzenie stron WWW .............................................................................. 59
Określanie fragmentów z kodem PHP .......................................................................................... 59
Wysyłanie danych jako części strony WWW .................................................................................. 62
Umieszczanie komentarzy w skryptach PHP ............................................................................... 67
Jednowierszowe komentarze o składni znanej z języków C++, C#, Java lub JavaScript ...... 67
Wielowierszowe komentarze o składni znanej z języków C++, C#, Java lub JavaScript ..... 68
Jednowierszowe komentarze znane ze skryptów powłoki systemu Unix .............................. 68
Podsumowanie .............................................................................................................................. 68
6
Oracle Database 10g Express Edition. Tworzenie aplikacji internetowych w PHP
Rozdział 4. Zmienne, operatory, typy danych i dołączanie plików ................................. 69
Zmienne ........................................................................................................................................ 69
Zmienne definiowane przez użytkownika .............................................................................. 70
Operatory ................................................................................................................................ 73
Typy danych ........................................................................................................................... 80
Zmienne globalne ................................................................................................................... 85
Zmienne predefiniowane ........................................................................................................ 86
Dołączanie plików bibliotecznych ................................................................................................ 87
Słowa kluczowe i stałe systemowe ............................................................................................... 89
Podsumowanie .............................................................................................................................. 91
Rozdział 5. Struktury sterujące .................................................................................. 93
Instrukcje warunkowe ................................................................................................................... 93
Instrukcja if ............................................................................................................................ 94
Instrukcja switch .................................................................................................................... 97
Pętle ............................................................................................................................................ 100
Pętla do-while ....................................................................................................................... 100
Pętla for ................................................................................................................................ 101
Pętla foreach ......................................................................................................................... 103
Pętla while ............................................................................................................................ 105
Podsumowanie ............................................................................................................................ 107
Część II Programowanie w języku PHP ............................................. 109
Rozdział 6. Tablice ................................................................................................... 111
Definiowanie tablic ..................................................................................................................... 113
Zarządzanie tablicami ................................................................................................................. 121
Funkcje identyfikujące i zliczające ...................................................................................... 121
Funkcje tworzące tablice o zadanych wymiarach ................................................................ 123
Funkcje zarządzające dostępem w stylu kolejkowym .......................................................... 124
Funkcje wyszukujące ........................................................................................................... 126
Funkcje przejścia .................................................................................................................. 131
Sortowanie tablic ........................................................................................................................ 133
Funkcje sort() i rsort() .......................................................................................................... 134
Funkcje asort() i arsort() ....................................................................................................... 136
Funkcje ksort() i krsort() ...................................................................................................... 136
Funkcje natsort() i natcasesort() ........................................................................................... 137
Funkcja array_multisort() ..................................................................................................... 139
Funkcje usort() i uksort() ...................................................................................................... 140
Łączenie i dzielenie tablic .......................................................................................................... 141
Składnie tablic ...................................................................................................................... 146
Łączenie tablic ...................................................................................................................... 147
Wydobywanie fragmentów tablic ........................................................................................ 148
Zastępowanie fragmentu tablicy .......................................................................................... 149
Znajdowanie części wspólnej tablic ..................................................................................... 151
Poznawanie różnic między tablicami ................................................................................... 152
Podsumowanie ............................................................................................................................ 152
Rozdział 7. Funkcje ................................................................................................. 153
Definiowanie funkcji .................................................................................................................. 154
Zasięg zmiennych w funkcjach .................................................................................................. 157
Parametry funkcji ....................................................................................................................... 160
Przekazywanie parametrów przez wartość lub referencję ................................................... 160
Domyślne wartości parametrów ........................................................................................... 163
Listy parametrów o zmiennej długości ................................................................................ 164
Spis treści
7
Funkcje zwracające wartość ....................................................................................................... 165
Zarządzanie dynamicznymi wywołaniami funkcji ..................................................................... 168
Funkcje rekurencyjne ................................................................................................................. 171
Podsumowanie ............................................................................................................................ 174
Rozdział 8. Obiekty .................................................................................................. 175
Definiowanie klas i używanie obiektów ..................................................................................... 177
Definiowanie klasy i tworzenie jej egzemplarza .................................................................. 179
Definiowanie składowych, metod i stałych .......................................................................... 182
Metody ustawiające i pobierające ........................................................................................ 187
Definiowanie klas używających dziedziczenia i polimorfizmu ................................................. 188
Tworzenie podklas i przesłanianie operacji ......................................................................... 190
Wykorzystanie interfejsów i klas abstrakcyjnych ................................................................ 193
Implementacja obiektów ............................................................................................................. 196
Klonowanie .......................................................................................................................... 198
Porównywanie, wyświetlanie zawartości i podpowiadanie typów ...................................... 201
Introspekcja klas i obiektów ................................................................................................. 205
Podsumowanie ............................................................................................................................ 210
Rozdział 9. Zarządzanie błędami i obsługa wyjątków ................................................. 211
Zarządzanie błędami ................................................................................................................... 213
Konfiguracja zrządzania błędami ......................................................................................... 213
Obsługa błędów .................................................................................................................... 215
Obsługa wyjątków ...................................................................................................................... 219
Blok try-catch ....................................................................................................................... 220
Klasa Exception .................................................................................................................... 222
Obsługa wyjątków w praktyce ............................................................................................. 226
Podsumowanie ............................................................................................................................ 229
Rozdział 10. Obsługa plików ...................................................................................... 231
Pliki w systemie plików .............................................................................................................. 232
Funkcje informujące o parametrach pliku ............................................................................ 235
Funkcje lokalizujące pliki .................................................................................................... 242
Funkcje zarządzania plikami ................................................................................................ 244
Funkcje stanu pliku .............................................................................................................. 252
Funkcje obsługi systemu plików .......................................................................................... 254
Odczyt i zapis plików ................................................................................................................. 256
Odczyt plików ...................................................................................................................... 262
Zapis plików ......................................................................................................................... 268
Uzyskiwanie plików od użytkowników ............................................................................... 272
Podsumowanie ............................................................................................................................ 275
Część III Tworzenie aplikacji w języku PHP ......................................... 277
Rozdział 11. Proste uwierzytelnianie PHP i formularze ................................................ 279
Opis zdalnego wykonywania procedur ....................................................................................... 280
Proste uwierzytelnianie HTTP .................................................................................................... 281
Tworzenie formularzy uwierzytelniania ..................................................................................... 286
Podsumowanie ............................................................................................................................ 300
Rozdział 12. Cookies i sesje ...................................................................................... 301
Definiowanie i wykorzystywanie danych cookies ..................................................................... 303
Definiowanie i wykorzystywanie danych sesji .......................................................................... 307
Dane cookies i sesje w praktyce ................................................................................................. 313
Podsumowanie ............................................................................................................................ 324
8
Oracle Database 10g Express Edition. Tworzenie aplikacji internetowych w PHP
Część IV Aplikacje internetowe
wykorzystujące bazę danych Oracle Express ....................... 325
Rozdział 13. Zapytania i transakcje w Oracle SQL ...................................................... 327
Połączenie z bazą Oracle za pomocą biblioteki OCI8 ................................................................ 330
Wykorzystanie biblioteki funkcji OCI8 ..................................................................................... 340
Podsumowanie funkcji z biblioteki OCI8 ............................................................................ 340
Wprowadzenie do modeli bazodanowych ............................................................................ 347
Przykład tworzenia zapytania ............................................................................................... 348
Przykład uruchamiania transakcji ........................................................................................ 349
Przykład zmiany hasła użytkownika .................................................................................... 353
Zapytania i transakcje wykorzystujące instrukcje SQL ............................................................. 354
Podsumowanie ............................................................................................................................ 363
Rozdział 14. Transakcje Oracle PL/SQL ...................................................................... 365
Wyjaśnienie sposobu działania procedur zapamiętanych PL/SQL ............................................ 366
Wykorzystanie kursorów referencyjnych i procedur zapamiętanych PL/SQL .......................... 367
Użycie tablic asocjacyjnych z wartościami skalarnymi i procedur zapamiętanych PL/SQL ..... 372
Użycie kolekcji skalarnych i procedur zapamiętanych PL/SQL ................................................ 377
Użycie typu danych NESTED TABLE ................................................................................ 381
Użycie typu danych VARRAY ............................................................................................ 385
Podsumowanie ............................................................................................................................ 387
Rozdział 15. Transakcje Oracle dotyczące dużych obiektów ........................................ 389
Definicje funkcji dużych obiektów i klasa OCI-Lob .................................................................. 390
Wykorzystanie typów danych BLOB, CLOB i NCLOB ........................................................... 395
Jak odczytać kolumny CLOB? ............................................................................................. 396
Aktualizacja kolumn CLOB ................................................................................................. 404
Wykorzystanie typów danych CFILE i BFILE ............................................................................ 410
Konfiguracja środowiska dla plików BFILE ....................................................................... 411
Pobieranie kolumny BFILE za pomocą polecenia SQL ...................................................... 413
Pobieranie kolumny BFILE za pomocą polecenia PL/SQL ................................................. 416
Przesył plików BFILE na serwer ......................................................................................... 418
Podsumowanie ............................................................................................................................ 422
.......................................................................................... 423
Dodatki
Dodatek A Znaczniki HTML ..................................................................................... 425
Dodatek B Teksty, narzędzia i techniki .................................................................... 431
Dodatek C Stałe środowiska PHP ............................................................................ 439
Dodatek D Interfejsy środowiska i typy obiektów ..................................................... 457
Dodatek E Funkcje obsługi plików w standardzie POSIX ........................................... 463
Dodatek F Funkcje dotyczące daty i czasu .............................................................. 473
Dodatek G Wprowadzenie do baz danych Oracle ....................................................... 491
Architektura baz danych Oracle ................................................................................................. 491
Uruchamianie i wyłączanie bazy danych Oracle ........................................................................ 496
Operacje w systemie Linux .................................................................................................. 497
Operacje w systemie Windows ............................................................................................ 500
Uruchamianie i wyłączanie procesu nasłuchującego ................................................................. 503
Spis treści
9
Wykorzystywanie programu SQL*Plus ..................................................................................... 508
Interfejs wiersza poleceń ...................................................................................................... 509
Interfejs WWW .................................................................................................................... 514
Podsumowanie ............................................................................................................................ 517
Dodatek H Wprowadzenie do SQL ............................................................................ 519
Typy danych kolumn tabel ......................................................................................................... 520
Język definicji danych (DDL) .................................................................................................... 523
Zarządzanie tabelami i ograniczeniami ................................................................................ 524
Zarządzanie widokami ......................................................................................................... 527
Zarządzanie procedurami zapamiętanymi ............................................................................ 529
Zarządzanie sekwencjami .................................................................................................... 529
Zarządzanie własnymi typami .............................................................................................. 532
Język pobierania danych (DQL) ................................................................................................. 533
Zapytania .............................................................................................................................. 534
Język modyfikacji danych (DML) .............................................................................................. 536
Polecenia INSERT ............................................................................................................... 536
Polecenia UPDATE .............................................................................................................. 538
Polecenia DELETE .............................................................................................................. 539
Język sterowania danymi (DCL) ................................................................................................ 540
Podsumowanie ............................................................................................................................ 540
Dodatek I Wprowadzenie do PL/SQL ...................................................................... 541
Struktura bloków PL/SQL .......................................................................................................... 542
Zmienne, przypisania i operatory ............................................................................................... 545
Struktury sterujące ...................................................................................................................... 549
Instrukcje warunkowe .......................................................................................................... 550
Pętle ...................................................................................................................................... 552
Procedury zapamiętane, funkcje zapamiętane oraz pakiety ....................................................... 555
Funkcje zapamiętane ............................................................................................................ 556
Procedury ............................................................................................................................. 559
Pakiety .................................................................................................................................. 561
Wyzwalacze bazodanowe ........................................................................................................... 564
Wyzwalacze DDL ................................................................................................................ 565
Wyzwalacze DML ................................................................................................................ 565
Wyzwalacze „zamiast” ......................................................................................................... 567
Wyzwalacze systemowe lub bazodanowe ............................................................................ 567
Kolekcje ...................................................................................................................................... 568
Typ danych VARRAY ......................................................................................................... 569
Typ danych NESTED TABLE ............................................................................................. 570
Tablica asocjacyjna .............................................................................................................. 571
Interfejs kolekcji ................................................................................................................... 574
Wykorzystanie pakietu DBMS_LOB ......................................................................................... 574
Konfiguracja i weryfikacja środowiska dla typów LOB ...................................................... 576
Zapis i odczyt typu danych CLOB ....................................................................................... 577
Lokalizacja i odczyt typu danych BFILE ............................................................................. 582
Podsumowanie ............................................................................................................................ 584
Dodatek J Skrypty przykładowych baz danych ......................................................... 585
Utworzenie wyzwalaczy zapamiętujących czas łączenia i rozłączania ...................................... 586
Utworzenie struktury danych dla wypożyczalni filmów ............................................................ 588
Wypełnienie bazy danych wypożyczalni filmów danymi .......................................................... 599
Utworzenie bazy danych prezydentów, zdefiniowanie kodu i wypełnienie tablicy danymi ...... 614
Podsumowanie ............................................................................................................................ 625
Skorowidz .............................................................................................. 627
Część IV
Aplikacje internetowe
wykorzystujące
bazę danych Oracle Express
Rozdział 13. ♦ Zapytania i transakcje w Oracle SQL
327
Rozdział 13.
Zapytania i transakcje
w Oracle SQL
Niniejszy rozdział omawia połączenie się z bazą danych Oracle Database 10g XE w trybie zapy-
tań lub trybie transakcyjnym i wykorzystanie obiektów schematu bazy danych: tabel, widoków
i procedur zapamiętanych. Choć baza danych udostępnia standardowy język zapytań SQL, obsłu-
guje dodatkowo wzbogacony język PL/SQL. Rozwiązania dotyczące standardowego SQL poja-
wią się w tym rozdziale, natomiast opis obsługi wartości skalarnych, kolekcji i kursorów referen-
cyjnych za pomocą PL/SQL zostanie opisany w rozdziale 14.
Rozdział 2. wyjaśnia proces instalacji bazy danych Oracle Database 10g XE, jej konfigurację
i weryfikację połączenia. Aby wykonać przykłady prezentowane w tym rozdziale, trzeba posia-
dać poprawnie skonfigurowane aplikacje Apache, PHP i Oracle. Wszystkie prezentowane przy-
kłady były testowane w PHP 5.1.4, ale powinny działać we wszystkich wersjach PHP od 5.1.2.
Przed wersją 5.1.2 trzeba korzystać z innego zestawu bibliotek. Co więcej, liczba dostępnych
funkcji jest uboższa. W nowszej wersji PHP starsze funkcje działają jako aliasy dla nowszych
funkcji, ale warto w trakcie migracji zmienić nazwy wywoływanych funkcji na nowsze. Warto
zainstalować nowszą wersję PHP, by skorzystać z nowej biblioteki OCI8.
Przed rozpoczęciem czytania tego rozdziału warto przeczytać wprowadzenia do języków SQL
i PL/SQL zawarte w dodatkach H i I. Dodatkowo, podstawowy kod wykorzystywany w roz-
działach od 13. do 15. został bardziej szczegółowo opisany w dodatku J.
Rozdział został podzielony na trzy części:
(cid:141) Połączenie z bazą Oracle za pomocą biblioteki OCI8
(cid:141) Wykorzystanie biblioteki funkcji OCI8
(cid:141) Zapytania i transakcje wykorzystujące instrukcje SQL
Podrozdziały warto czytać po kolei. Pierwszy podrozdział opisuje trzy sposoby łączenia się
z bazą danych Oracle. Różnią się one zachowaniem i funkcjonalnością. Drugi podrozdział sta-
nowi podsumowanie funkcji OCI8 i prezentuje wykonywanie podstawowych operacji SQL —
INSERT, SELECT, UPDATE i DELETE — z poziomu kodu PHP. Podrozdział opisuje użycie instrukcji
328
Część IV ♦ Aplikacje internetowe wykorzystujące bazę danych Oracle Express
INSERT i UPDATE do wstawiania i aktualizacji pojedynczych wierszy. Pojedyncze polecenie
INSERT lub UPDATE może aktualizować wiele wierszy danych, jeśli wykorzystamy tzw. dowiąza-
nia. Sposób ich działania szczegółowo omawia trzeci z podrozdziałów. Zmienne dowiązania
odwzorowują wartości skalarne i kolekcje w poleceniach SQL.
Obecnie biblioteka OCI8 obsługuje jedynie ograniczony zestaw typów danych dostępnych
w bazie danych Oracle Database 10g XE. Zespół programistów odpowiedzialny za rozwój biblio-
teki OCI8 planuje dodanie obsługi odczytu i zapisu obiektów PL/SQL bezpośrednio z poziomu
aplikacji PHP. Data wprowadzenia tej funkcji nie jest jeszcze znana. Aktualnych informacji na
ten temat warto szukać w witrynie http://otn.oracle.com.
W razie napotkania problemów w trakcie korzystania z bazy danych lub biblioteki OCI8 można
skorzystać z wielu narzędzi wspomagających poszukiwanie przyczyny ich powstawiania. Doda-
tek G opisuje narzędzie tnspring, które ułatwia testowanie nasłuchiwania serwera bazy danych
na konkretnym porcie. Ten sam dodatek wyjaśnia, w jaki sposób testować, czy baza danych
została uruchomiona, i jak wykonać proste zapytania SQL.
Istnieje pięć skryptów SQL, z których warto skorzystać w trakcie wykonywania przykładów
z niniejszego rozdziału. Skrypt create_user.sql został opisany w dodatku G. Należy go urucho-
mić jako użytkownik SYSTEM, by utworzyć schemat bazy danych i użytkownika dla prezentowa-
nych przykładów. Skrypty przedstawiane w dodatku J zakładają wcześniejsze uruchomienie
wspomnianego skryptu. Jeśli chcesz skorzystać z innego użytkownika niż proponowany, należy
zmodyfikować prezentowane przykłady.
W jaki sposób zainstalować Oracle Instant Client?
Biblioteki OCI8 można zainstalować na komputerze lokalnym pracującym pod kontrolą systemu Win-
dows lub Linux. Przedstawione kroki należy wykonać tylko wtedy, gdy zamierza się testować progra-
my PHP na innym komputerze niż ten, na którym zainstalowano serwer Apache i bazę danych.
Instalacja w systemie Linux
Z witryny http://otn.oracle.com pobierz dwa pliki zawarte w archiwum TAR o nazwie oracle-client-
10103.tar.bz2. Zapisz plik w dowolnej lokalizacji, a następnie rozpakuj go, wykonując poniższe pole-
cenie z poziomu konsoli systemowej:
tar -xvjf oracle-client-10103.tar.bz2
Po rozpakowaniu w folderze pojawią się dwa pliki o nazwach:
oracle-istantclient-basic-10.1.0.3-1.i386.rpm
oracle-istantclient-devel-10.1.0.3-1.i386.rpm
Plik basic zawiera bibliotekę OCI8, która zostanie zainstalowana w folderze /usr/lib/oracle/10.1.0.3/
client/lib. Plik devel zawiera pliki nagłówków i pliki instalacyjne, które umieszcza w folderze /usr/
include/oracle/10.1.0.3/client. Instalację można przeprowadzić ręcznie lub za pomocą dołączonego
skryptu, wywoływanego poniższym poleceniem:
./runmefirst.sh
Ponowna konfiguracja PHP wymaga wywołania polecenia:
./configure
--with-oci8-instantclient=/usr/lib/oracle/10.1.0.3/client/lib
--prefix=$HOME/php --with-apxs=$HOME/apache/bin/apxs
--enable-sigchild --with-config-file-path=$HOME/apache/conf
Rozdział 13. ♦ Zapytania i transakcje w Oracle SQL
329
Ponowną kompilację rozpoczyna polecenie make. Następnie należy ustawić zmienną środowiskową
LD_LIBRARY_PATH na folder /usr/lib/oracle/10.1.0.3/client/lib i ponownie uruchomić serwer Apache.
Do wykrycia przyczyny ewentualnych błędów użyj pliku dziennika błędów serwera Apache.
Dodatkowo należy pamiętać o ustawieniu zmiennej środowiskowej TNS_ADMIN, by wskazywała na
lokalizację pliku tnsnames.ora, jeśli korzysta się tylko i wyłącznie z Oracle Instant Client. Więcej
informacji na temat połączeń sieciowych w Oracle zawiera dodatek G. Więcej informacji na temat
sposobu instalacji bibliotek można znaleźć w ogólnodostępnej dokumentacji Oracle Database Client
Quick Installation Guide.
Instalacja w systemie Windows
Z witryny http://otn.oracle.com pobierz trzy pliki zawarte w pliku ZIP dostępnym do pobrania na stronie
dotyczącej Oracle Database 10g Release 1. Rozpakuj pliki zawarte w archiwum. W folderze pojawią się
trzy pliki:
oraociei10.dll
orannzsbb10.dll
oci.dll
Pliki można umieścić w dowolnej lokalizacji, ale najczęściej przyjmuje się folder C:instantclient10_1.
Po utworzeniu folderu należy jego lokalizację dodać do zmiennej środowiskowej PATH. Warto dodać
ją jako pierwszą ze ścieżek wymienianych w zmiennej środowiskowej.
Jeśli korzystasz z pliku tnsnames.ora, umieść go w tym samym folderze i ustaw zmienną środowiskową
TNS_ADMIN, by wskazywała na ten folder. Domyślne ustawienia językowe zostaną pobrane z danych
systemu operacyjnego. Aby je zmienić, wystarczy zdefiniować zmienną środowiskową NLS_LANG.
Więcej informacji na ten temat znajduje się w książkach Steve’a Borowskiego Hands-on Oracle Da-
tabase 10g Expres Edition for Windows i podręczniku Oracle Database Express Edition 2 Day DBA.
Po instalacji klienta ponownie uruchom serwer Apache. Do wykrycia przyczyny ewentualnych błędów
użyj pliku dziennika błędów serwera Apache.
Analizator składniowy OCI8 uniemożliwia użycie znaku wieloznaczności SQL, którym jest znak .
Wprowadzenie wyrażeń wieloznacznych wymaga zastąpienia frazy LIKE wywołaniem REGEXP_
LIKE(). Wspomniana funkcja jest dostępna w Oracle Database 10gR2 i może nie być do-
stępna we wcześniejszych wersjach.
Niniejszy rozdział wymaga skryptów create_signon_triggers.sql, create_store.sql i seed_store.sql.
Zostały one przedstawione w dodatku J. Oto krótki opis znaczenia poszczególnych skryptów:
(cid:141) Skrypt create_signon_triggers.sql wspomaga wykonanie połączenia z bazą danych
Oracle za pomocą bibliotek OCI8 przedstawionych w pierwszym z podrozdziałów.
(cid:141) Skrypty create_store.sql i seed_store.sql tworzą i wypełniają tabele bazy danych
wykorzystywane w dwóch pozostałych podrozdziałach.
Niniejszy rozdział wymaga posiadania lokalnej bazy danych Oracle 10gR2 lub przynajmniej
zainstalowanego klienta Oracle. W architekturze wielowarstwowej jako całkowite minimum
trzeba posiadać zainstalowany serwer Apache z PHP i biblioteki Oracle Client. W ten sposób
system uzyskuje możliwość łączenia się ze zdalną bazą danych nasłuchującą połączeń nadcho-
dzących z innych komputerów.
Pierwszy z podrozdziałów opisuje trzy możliwe sposoby łączenia się z bazą danych Oracle oraz
prezentuje przykłady tych połączeń.
330
Część IV ♦ Aplikacje internetowe wykorzystujące bazę danych Oracle Express
Połączenie z bazą Oracle
za pomocą biblioteki OCI8
Biblioteka OCI8 udostępnia trzy rodzaje połączeń z bazą danych Oracle.
(cid:141) Połączenie standardowe — tworzy połączenie bazodanowe dobre na czas wykonywania
skryptu lub do momentu jawnego zamknięcia połączenia przez skrypt. Wszystkie
wywołania do bazy danych w skrypcie korzystają z tego samego połączenia, dopóki
jawnie nie otworzymy nowego połączenia, wywołując funkcję oci_new_connect().
Standardowe połączenie dodaje narzut łączenia się z serwerem i przekazywania danych
uwierzytelniających przy każdym uruchomieniu skryptu — między żądaniami HTTP
nie jest pamiętany żaden stan połączenia bazodanowego.
(cid:141) Połączenie unikatowe — tworzy połączenie bazodanowe dobre na czas wykonywania
skryptu lub do momentu jawnego zamknięcia połączenia przez skrypt. Połączenie
to zapewnia, iż jeden skrypt może posiadać wiele niezależnych połączeń do bazy danych,
o ile stosują one autonomiczne transakcje. Transakcje autonomiczne działają
symultanicznie zamiast sekwencyjnie, bo wyniki ich działań nie zależą od innych
transakcji. Połączenia unikatowe również dodają narzut łączenia się z serwerem
i przekazywania danych uwierzytelniających przy każdym uruchomieniu skryptu
— między żądaniami HTTP nie jest pamiętany żaden stan połączenia bazodanowego.
(cid:141) Połączenie trwałe — tworzy połączenie bazodanowe dobre na czas wykonywania
skryptu lub do momentu jawnego zamknięcia połączenia przez skrypt. Wszystkie
wywołania do bazy danych w skrypcie korzystają z tego samego połączenia, dopóki
jawnie nie otworzymy nowego połączenia, wywołując funkcję oci_new_connect().
Połączenie trwałe dodaje narzut łączenia się z serwerem i przekazywania danych
uwierzytelniających jedynie przy pierwszym żądaniu (do momentu kolejnego
wywołania wspomnianej funkcji) — między żądaniami HTTP serwer pamięta stan
połączenia bazodanowego z wcześniejszego skryptu. Połączenie trwałe zostaje
zamknięte dopiero po określonym czasie bezczynności (a nie po zakończeniu skryptu),
więc trzeba bardzo uważnie dobrać dopuszczalny czas nieaktywności, by nie marnować
cennych zasobów.
Plik php.ini zawiera kilka opcji konfiguracyjnych dla biblioteki OCI8. Określają one sposób
działania połączeń w środowisku PHP. Środowisko zastosuje wartości domyślne dla tych
ustawień, jeśli nie określimy ich jawnie. Z tego powodu warto upewnić się, czy ustawienia
domyślne są odpowiednie. Tabela 13.1 przedstawia dostępne dyrektywy konfiguracyjne.
Bardzo szczegółowa analiza działania systemu powinna poprzedzać jakiekolwiek zmiany
w domyślnych wartościach dyrektyw OCI8 w pliku php.ini. Połączenia trwałe po czasie bezczyn-
ności może zamykać Apache lub Oracle. Jeśli chcemy odpowiedzialność za to zrzucić na Apache,
warto przyjrzeć się opcjom MaxRequestPerChild, MaxSpareServers i KeepAlive. W bazie danych
Oracle przerywanie bezczynnych połączeń odbywa się po ustawieniu opcji IDLE_TIMEOUT
w ustawieniach profilu użytkownika.
Niezależnie od wyboru sposobu realizacji połączeń należy przeprowadzić wiele testów wydaj-
nościowych przed wprowadzeniem danego rozwiązania do systemu produkcyjnego. Dzięki
testom można uniknąć nieprzyjemnych efektów w trakcie obsługi istotnych klientów.
Rozdział 13. ♦ Zapytania i transakcje w Oracle SQL
331
Tabela 13.1. Dyrektywy OCI8 w pliku php.ini
Nazwa
Wartość domyślna
oci8.privileged_connect
oci8.max_persistent
oci8.persistent_timeout
oci8.ping_interval
0
-1
-1
60
oci8.statement_cache_size
20
oci8.default_prefetch
10
oci8.old_oci_close_semantics
0
Opis
Opcja umożliwia wykonywanie
uprzywilejowanych połączeń dla ról SYSOPER
i SYSDBA. Domyślnie połączenia te są wyłączone.
By je włączyć, ustaw dyrektywę na wartość 1.
Opcja określa maksymalną liczbę trwałych
połączeń. Domyślnie nie jest nakładane żądne
ograniczenie. Ustawienie wartości dodatniej
nakłada ograniczenie na liczbę trwałych połączeń.
Wartość 0 wyłącza trwałe połączenia.
Określa maksymalny czas bezczynności
dla trwałych połączeń. Domyślnie połączenia
trwałe mogą pozostawać otwarte dowolnie długo.
Opcja określa czas sprawdzania poprawności
trwałych połączeń. Wyłączenie opcji zwiększa
szybkość działania trwałych połączeń, ale nie
wykrywa błędów w komunikacji, które mogą
zdarzyć się na dalszym etapie realizacji skryptu.
Ustawienie wartości 0 wyłącza sprawdzanie
trwałych połączeń.
Określa liczbę buforowanych poleceń SQL i jest
równoznaczne zapamiętywaniu poleceń w SGA.
By wyłączyć buforowanie, ustaw dyrektywę
na wartość 0.
Ustawia domyślną liczbę wierszy, która zostaje
pobrana zaraz po wykonaniu polecenia SQL.
Zwiększenie wartości poprawia czas reakcji
dla skryptów przetwarzających wiele wierszy
danych. Warto pozostawić tę dyrektywę
na domyślnej wartości, a gdy to konieczne,
używać funkcji oci_set_prefetch() w skryptach
wymagających przetwarzania dużej ilości danych.
Włącza zgodność wstecz i wyłącza wykonywanie
jakichkolwiek działań przez funkcję oci_close().
Oracle zaleca usunięcie wywołań tej funkcji
przed włączeniem tej dyrektywy.
Warto ustawić odpowiedni bufor dla sekwencji SYS.AUDSES$, jeśli do bazy danych w ciągu
sekundy będzie wykonywanych kilkaset połączeń. Można początkowo ustawić wartość na
10 000, a następnie monitorować, czy jest wystarczająca. Sekwencja SYS.AUDSES$ jest
wykonywana jako część zestawiania połączenia.
Istnieją tylko cztery funkcje OCI8 związane z otwieraniem i zamykaniem połączeń. Istnieje
również funkcja oci_error(), która zwraca informację o rodzaju błędu, jeśli połączenie z bazą
danych nie powiodło się. Wszystkich pięć funkcji zostało wymienionych w tabeli 13.2. Nazwy
funkcji pisane kursywą zostały wycofane z użycia i pochodzą ze starszych wersji OCI. Obecnie
stanowią aliasy dla nowszych nazw funkcji.
332
Część IV ♦ Aplikacje internetowe wykorzystujące bazę danych Oracle Express
Tabela 13.2. Funkcje łączenia i rozłączania z bazą danych Oracle
Funkcja
oci_close()
ocilogoff()
oci_error()
ocierror()
oci_connect()
ocilogin()
oci_new_connect()
ocinlogin()
oci_pconnect()
ociplogin()
Opis
Funkcja jawnie zamyka otwarte połączenie bazodanowe w trakcie działania skryptu.
To nowe zachowanie biblioteki OCI8 począwszy od PHP 5.1.2. Funkcja przyjmuje
jeden parametr, którym jest zasób połączenia. Zwraca wartość logiczną true po udanym
rozłączeniu lub wartość false w sytuacji przeciwnej. Nie trzeba jawnie wywoływać
funkcji, ponieważ jest ona wykonywana niejawnie po zakończeniu skryptu.
Składnia funkcji:
bool oci_close(resource połączenie)
Funkcja zwraca tablicę wartości. Przyjmuje jeden opcjonalny parametr, którym jest zasób
połączenia. Bez podania parametru zwraca błąd dotyczący ostatnio otwartego połączenia.
Zwrócona tablica zawiera elementy code, message, offset i sqltext. Element code
określa kod błędu z bazy danych Oracle, element message w krótki sposób opisuje rodzaj
błędu, element offset zawiera numer wiersza z błędem, a element sqltext zawiera
fragment polecenia SQL z błędem. Składnia funkcji:
array oci_error([resource połączenie])
Funkcja zwraca zasób połączenia po poprawnym połączeniu z bazą danych lub wartość
false, jeśli połączenie nie powiodło się. Przyjmuje pięć parametrów, z których pierwsze
dwa są wymagane. W rzeczywistości najczęściej w trakcie połączenia podaje się trzy
parametry. Trzeci parametr dotyczący nazwy bazy danych w wielu sytuacjach jest
odwzorowywany automatycznie przez plik tnsnames.ora, ale można również wskazać
bazę danych ręcznie, podając ją w kodzie PHP. Czwarty parametr (kodowanie znaków)
jest pobierany z systemu operacyjnego, jeśli nie przekaże się go jawnie. Piąty parametr
określa rodzaj połączenia i przyjmuje domyślną wartość OCI_DEFAULT, co powoduje
niemożność połączenia się jako użytkownik uprzywilejowany. Użycie innego trybu
(OCI_SYSOPER lub OCI_SYSDBA) wymaga dodatkowo zmiany dyrektywy
oci.privileged_connect na wartość 1. Składnia funkcji:
resource oci_connect(string nazwa_użytkownika, string hasło
[, string nazwa_bazy [, string kodowanie_znaków [, string tryb_sesji]]])
Funkcja zwraca zasób połączenia po poprawnym połączeniu z bazą danych lub wartość
false, jeśli połączenie nie powiodło się. Jeśli skrypt użył wcześniej funkcji oci_connect(),
tworzy nowe połączenie bazodanowe. Niedokończone (niezatwierdzone) transakcje
z jednego połączenia są niedostępne w drugim połączeniu i mogą się nawet wzajemnie
blokować. Funkcja przyjmuje tych samych pięć parametrów, co funkcja oci_connect().
Ich znaczenie również jest identyczne. Składnia funkcji:
resource oci_new_connect(string nazwa_użytkownika, string hasło
[, string nazwa_bazy [, string kodowanie_znaków [, string tryb_sesji]]])
Funkcja zwraca zasób połączenia po poprawnym połączeniu z bazą danych lub wartość
false, jeśli połączenie nie powiodło się. Kilkukrotne wywołanie funkcji z tymi samymi
parametrami zwraca to samo połączenie, jeśli nie zostało ono wcześniej przerwane.
Połączenie trwa dłużej niż wykonywanie pojedynczego skryptu, ale na końcu każdego
skryptu niezatwierdzone transakcje zostają wycofane. Funkcja przyjmuje tych samych
pięć parametrów, co funkcja oci_connect(). Ich znaczenie również jest identyczne.
Składnia funkcji:
resource oci_pconnect(string nazwa_użytkownika, string hasło
[, string nazwa_bazy [, string kodowanie_znaków [, string tryb_sesji]]])
Po przedstawieniu rodzajów połączeń możemy rozpocząć przykłady. Zgodnie z wcześniejszymi
wyjaśnieniami uruchom skrypty create_user.sql i create_signon_trigger.sql, by stworzyć odpo-
wiednie środowisko dla skryptów w bazie danych. Dokładniejszy opis tych skryptów znajduje się
w dodatku J.
Rozdział 13. ♦ Zapytania i transakcje w Oracle SQL
333
Program OracleStandardConnection.php spróbuje połączyć się z bazą danych. Jeśli połączenie
będzie udane, program wyświetli stosowną informację. W przeciwnym przypadku wyświetli
tablicę błędów wygenerowaną przez funkcję oci_error().
-- Przedstawiony kod znajduje się w pliku OracleStandardConnection.php, na dołączonej płycie CD-ROM.
?php
// Spróbuj połączyć się z bazą danych, używając podanego loginu i hasła oraz aliasu TNS.
if ($c = @oci_connect( php , php , xe ))
{
// Wyświetl komunikat o udanym połączeniu.
echo Udane połączenie z bazą danych Oracle. br / ;
// Rozłącz się.
oci_close($c);
}
else
{
// Pobierz informacje o błędzie połączenia.
$errorMessage = oci_error();
// Otwórz tabelę HTML.
print table border= 1 cellpadding= 0 cellspacing= 0 ;
// Wyświetl elementy tablicy.
foreach ($errorMessage as $name = $value)
print tr td .$name. /td td .$value. /td /tr ;
// Zamknij tabelę HTML.
print /table ;
}
?
Wywołanie funkcji oci_connect() określa nazwę użytkownika, hasło i alias sieciowy (lub nazwę
bazy danych). Należy zmodyfikować ten i wszystkie kolejne skrypty, jeśli używa się innej nazwy
użytkownika, innego hasła lub innej nazwy bazy danych. Jeśli skrypt poprawnie połączy się
z bazą danych, pojawi się następujący komunikat:
Udane połączenie z bazą danych Oracle
Można również sprawdzić, czy połączenie zostało poprawnie rozpoznane po stronie serwera
bazy danych. Połącz się z bazą danych jako użytkownik administracyjny i wykonaj skrypt
get_connection_results.sql, który pobiera i wyświetla dane z tabeli CONNECTION_LOG.
-- Przedstawiony kod SQL znajduje się w pliku get_connection_results.sql, na dołączonej płycie CD-ROM.
SELECT event_id
, event_user_name
, event_type
, TO_CHAR(event_date, DD-MON-YYYY HH24:MI:SS ) time
FROM system.connection_log;
Oczywiście, prezentowane daty będą różniły się od tych przedstawianych poniżej. Uzyskanych
wyników również może być więcej — wszystko zależy od liczby przeprowadzanych prób. Ogólny
wynik powinien odpowiadać poniższemu:
334
Część IV ♦ Aplikacje internetowe wykorzystujące bazę danych Oracle Express
EVENT_ID EVENT_USER_NAME EVENT_TYPE TIME
-------- --------------- ---------- -----------------------------
45 PHP CONNECT 23-CZE-2007 09:52:06
46 PHP DISCONNECT 23-CZE-2007 09:52:06
Wyniki dobitnie pokazują, że skrypt OracleStandardConnection.php połączył się z bazą danych,
by po chwili znowu się rozłączyć. Aby przekonać się, jak wygląda zgłoszenie informacji o błędzie,
można chwilowo wyłączyć proces nasłuchujący połączeń w sposób opisany w dodatku G.
Po wyłączeniu nasłuchiwania połączeń i uruchomieniu skryptu pojawi się w przeglądarce nastę-
pujący tekst:
code 12541
message ORA-12541: TNS:no listener
offset 0
sqltext
Błąd ORA-12541 informuje, że bibliotece nie udało się uzyskać połączenia z procesem nasłu-
chującym. Numer linii i fragment polecenia SQL nie są w tym przypadku pomocne, ponieważ
błąd wystąpił na etapie połączenia, a nie na etapie wykonywania konkretnych poleceń. W apli-
kacji produkcyjnej warto zapamiętać przynajmniej treść elementu message po wykryciu błędu,
bo dostarcza on największą liczbę informacji na temat tego, co było przyczyną niepowodzenia.
Program OracleNewConnection.php ilustruje, że można uzyskać dwa połączenia do bazy danych
Oracle w obrębie jednego skryptu PHP. Funkcja oci_connect() wykonuje pierwsze połączenie,
a funkcja oci_new_connect() drugie. Choć oba połączenia zostałyby niejawnie zamknięte po
zakończeniu skryptu, kod zamyka je jawnie, wywołując funkcję oci_close(). Kod tego
programu jest przedstawiony poniżej.
-- Przedstawiony kod znajduje się w pliku OracleNewConnection.php, na dołączonej płycie CD-ROM.
?php
// Spróbuj połączyć się z bazą danych, używając podanego loginu i hasła oraz aliasu TNS.
if ($c = @oci_connect( php , php , xe ))
{
// Wyświetl komunikat o udanym połączeniu.
echo Udane połączenie z bazą danych Oracle. br / ;
// Opóźnij wykonanie drugiego połączenia o 5 sekund.
if (sleep(5));
if ($c2 = oci_new_connect( php , php , xe ))
{
// Wyświetl komunikat, jeśli połączenie było udane.
echo Udane dodatkowe połączenie z bazą danych Oracle. br / ;
// Zamknij dodatkowe połączenie.
oci_close($c2);
}
else
{
// Pobierz informację o błędzie połączenia.
$errorMessage = oci_error();
print $errorMessage[ message ];
}
Rozdział 13. ♦ Zapytania i transakcje w Oracle SQL
335
// Opóźnij wykonanie drugiego zamknięcia o 5 sekund.
if (sleep(5));
// Zamknij połączenie.
oci_close($c1);
}
else
{
// Pobierz informację o błędzie połączenia.
$errorMessage = oci_error();
print $errorMessage[ message ];
}
?
Skrypt generuje następujący wynik, jeśli nie napotkał żadnych błędów:
Udane połączenie z bazą danych Oracle.
Udane dodatkowe połączenie z bazą danych Oracle.
Skrypt używa funkcji sleep() do uzyskania opóźnień między połączeniami. Dzięki temu widać
różnicę w czasie wykonywania poszczególnych działań po uruchomieniu skryptu get_connection_
results.sql. Pamiętaj, że czas i identyfikatory zależą od liczby wcześniej wykonywanych prób
połączeń.
EVENT_ID EVENT_USER_NAME EVENT_TYPE TIME
-------- --------------- ---------- -----------------------------
47 PHP CONNECT 23-CZE-2007 09:55:06
48 PHP CONNECT 23-CZE-2007 09:55:12
49 PHP DISCONNECT 23-CZE-2007 09:55:12
50 PHP DISCONNECT 23-CZE-2007 09:55:18
Po zapoznaniu się z kodem wykonującym połączenia pojedyncze i połączenia wielokrotne
przejdźmy do kodu tworzącego połączenia trwałe. Połączenie trwałe pozostaje otwarte aż do
momentu wykonania innego połączenia lub przekroczenia czasu bezczynności połączenia. W ten
sposób wszystkie informacje statusowe pozostają zapamiętane między uruchomieniami skryptu,
a sam proces odczytu danych z bazy nie staje się szybszy (nie trzeba zestawiać nowego połą-
czenia).
Aby zademonstrować działanie połączeń trwałych od strony bazy danych, potrzebujemy dodat-
kowego kodu SQL i PL/SQL. Aby dokładniej zrozumieć wykonywane przez ten kod operacje,
warto wcześniej przeczytać dodatki H i I. Niniejszy podrozdział wykorzystuje również zmienne
dowiązane, szczegółowo opisywane w dalszej części tego rozdziału oraz w rozdziale 14.
Oracle udostępnia pakiet DBMS_APPLICATION_INFO, który umożliwia zapis i odczyt danych
z kolumny CLIENT_INFO widoku V$SESSION. Procedura SET_CLIENT_INFO umożliwia zapisanie
informacji, która pozostaje taka sama przez całą sesję. Sesja to czas od połączenia z bazą danych
do momentu rozłączenia. Przed ustawieniem wartości procedurą SET_CLIENT_INFO kolumna
zawiera wartość null. Po ustawieniu kolumny jej wartość odczytuje się procedurą READ_
CLIENT_INFO.
Skrypt create_session_structures.sql tworzy tabelę SESSION_LOG i pakiet SESSION_MANAGER.
Pakiety bazodanowe przypominają pliki biblioteczne języka PHP. Język PL/SQL obsługuje
dwa rodzaje zestawów operacji: funkcje i procedury. Funkcje zwracają wartość i mogą zostać
użyte w instrukcji SQL lub jako prawa część operatora przypisania. Procedury nie zwracają
336
Część IV ♦ Aplikacje internetowe wykorzystujące bazę danych Oracle Express
wartości w tradycyjnym pojęciu i dodatkowo obsługują przekazywanie parametrów przez
referencję. Przekazywanie przez referencję przypomina ten sam mechanizm z języka PHP
(patrz rozdział 7.), tyle że w PHP włączamy go, umieszczając przed nazwą parametru symbol
ampersand. Procedury PL/SQL nie mogą być wykorzystane po prawej stronie operacji przy-
pisania.
Skrypt create_session_structures.sql tworzy tabelę i sekwencję. Sekwencja umożliwia auto-
matyczną numerację wierszy tabeli.
-- Przedstawiony kod SQL znajduje się w pliku create_session_structures.sql, na dołączonej płycie CD-ROM.
CREATE TABLE session_log
( session_id NUMBER
, session_activity VARCHAR2(3)
, session_name VARCHAR2(64)
, session_date DATE);
CREATE SEQUENCE session_log_s1;
Podprocedury jako czarne skrzynki
Istnieją trzy sposoby pisania podprocedur nazywane funkcjami, procedurami i metodami.
(cid:141) Klasyczna funkcja przekazująca parametry przez wartość operuje na kopiach danych przekazywanych
przez użytkownika. Parametry to zmienne o zasięgu lokalnym. Funkcja zwraca tylko jedną
wartość skalarną lub złożoną. Zmienna złożona to często po prostu adres w pamięci powiązany
z tablicą danych. Ten sposób działania odpowiada funkcjom PL/SQL i jednemu z dwóch stylów
tworzenia funkcji w PHP.
(cid:141) Klasyczna funkcja przekazująca parametry przez referencję może działać w trybie tylko do odczytu
lub w trybie odczytu i zapisu. Poszczególne parametry są przekazywane przez referencję,
co oznacza, że nie powstaje ich kopia, a funkcja może zmienić ich oryginalną zawartość.
Oznacza to, że funkcje tego typu mogą zwracać wartości w dwojaki sposób: jako wynik swego
działania lub jako modyfikację zawartości parametrów do nich przekazanych. Zastosowanie
typu void jako zwracanej wartości powoduje, że funkcja może przekazywać wartości tylko
dzięki zmianom zawartości parametrów. Choć klasyczne przekazywanie przez referencję działa
w języku PHP, nie jest dostępne w funkcjach PL/SQL.
(cid:141) Klasyczna procedura jest nieco zmodyfikowaną wersją funkcji przekazującej parametry przez
referencję, ponieważ nie może jawnie zwracać wartości. W większości sytuacji liczy się efekt
działania procedury, a nie zwracane przez nią wartości. Warto jednak pamiętać, że procedura
może zwracać wartości, tyle że musi w tym celu użyć parametrów. Klasyczna procedura to jedyny
model przekazywania danych przez referencję obsługiwany przez bibliotekę OCI8.
Skrypt tworzy pakiet z dwoma procedurami otaczającymi procedury DBMS_APPLICATION_INFO.
Procedury umożliwiają sprawdzenie, czy połączenia trwałe działają zgodnie z oczekiwaniami.
-- Przedstawiony kod SQL znajduje się w pliku create_session_structures.sql, na dołączonej płycie CD-ROM.
CREATE OR REPLACE PACKAGE session_manager IS
PROCEDURE set_session
(session_name IN VARCHAR2);
PROCEDURE get_session
(session_name IN OUT VARCHAR2);
END session_manager;
/
CREATE OR REPLACE PACKAGE BODY session_manager IS
Rozdział 13. ♦ Zapytania i transakcje w Oracle SQL
337
PROCEDURE set_session
(session_name IN VARCHAR2) IS
BEGIN
-- Ustaw kolumnę V$SESSION.CLIENT_INFO dla sesji.
dbms_application_info.set_client_info(session_name);
-- Zapamiętaj aktywność.
INSERT INTO session_log VALUES
( session_log_s1.nextval
, SET
, session_name
, SYSDATE );
COMMIT;
END set_session;
PROCEDURE get_session
(session_name IN OUT VARCHAR2) IS
BEGIN
dbms_application_info.read_client_info(session_name);
-- Warunkowo odczytaj wartość.
IF session_name IS NOT NULL THEN
-- Zapamiętaj aktywność.
INSERT INTO session_log VALUES
( session_log_s1.nextval
, GET
, session_name
, SYSDATE );
COMMIT;
END IF;
END get_session;
END session_manager;
Program OraclePersistentConnection.php wykorzystuje kilka funkcji i rozwiązań opisywanych
dokładniej w dalszej części rozdziału. Program współdzieli jedno połączenie bazodanowe
między dwa wykonania poleceń, które przekazują zmienną dowiązaną między skryptem PHP
i bazą danych. Zmienne dowiązane stanowią tymczasowe zastępniki dla rzeczywistych wartości.
Dzięki nim w programie PHP bardzo łatwo przekazać zawartość zmiennej PHP do zmiennej
Oracle i na odwrót.
Przed uruchomieniem programu nie istnieje trwałe połączenie bazodanowe. Program tworzy
nowe połączenie, zapisuje dane do sesji i potwierdza wykonanie tego zadania, zapisując infor-
mację o stanie do tabeli SESSION_LOG. Ponownie uruchomienie programu wykorzysta istniejące
połączenie bazodanowe, odczyta wartość z poziomu sesji i zapisze ją do tabeli SESSION_LOG.
Program OraclePersistentConnection.php ilustruje tworzenie i wykorzystywanie trwałego
połączenia do bazy danych Oracle. Pamiętaj o tym, by wcześniej poprawnie ustawić wszystkie
potrzebne dyrektywy z plików php.ini i httpd.conf; dotyczy to również dyrektywy KeepAlive,
której wartość nie powinna być większa niż kilkanaście sekund. W przeciwnym razie zna-
cząco wzrasta prawdopodobieństwo ataku typu DOS (Denial Of Service).
Kod programu OraclePersistentConnection.php jest następujący:
-- Przedstawiony kod znajduje się w pliku OraclePersistentConnection.php, na dołączonej płycie CD-ROM.
?php
// Spróbuj połączyć się z bazą danych, używając podanego loginu i hasła oraz aliasu TNS.
if ($c = @oci_pconnect( php , php , xe ))
338
Część IV ♦ Aplikacje internetowe wykorzystujące bazę danych Oracle Express
{
// Ustaw zmienną śledzenia sesji.
$session_name_in = Sesja z [ .date( d-M-y H:i:s ). ] ;
$session_name_out = ;
// Polecenia SQL.
$stmt1 = BEGIN session_manager.get_session(:s_name); END; ;
$stmt2 = BEGIN session_manager.set_session(:s_name); END; ;
// Przetwórz polecenia.
$s1 = oci_parse($c,$stmt1);
$s2 = oci_parse($c,$stmt2);
// Dołącz zmienną $s1 w trybie IN/OUT, a zmienną $s2 w trybie IN.
oci_bind_by_name($s1, :s_name
Pobierz darmowy fragment (pdf)