plik


RozdziaB 18 Delphi na serwerze SQL Sybase W tym rozdziale zapoznamy si z Sybase SQL Server RDBMS. Przedstawimy tak|e specyficzne zagadnienia dotyczce wspBpracy serwera SQL i Delphi oraz odmian jzyka SQL - Transact-SQL. Uruchamianie serwera Sposb uruchomienia serwera SQL zale|y od systemu operacyjnego. W systemie UNIX zwykle uruchamiamy skrypt o nazwie RUN_nazwa_serwera, natomiast w Windows NT korzystamy z programu Sybase Services Manager. Program ten mo|na znalez w grupie lub folderze Sybase SQL Server. Uruchomi i zatrzyma serwer mo|na te| za pomoc apletu Services w Windows NT Control Panel. Poniewa| serwer SQL dziaBa jako usBuga, wic mo|na te| skorzysta z polecenia Services w programie Windows NT Server Manager. Zatrzymanie serwera umo|liwia tak|e instrukcja SHUTDOWN jzyka Transact - SQL. Wykorzystanie opcji NOWAIT spowoduje natychmiastowe przerwanie jego pracy, natomiast normalnie serwer jest zatrzymywany dopiero po zakoDczeniu realizowanych procesw. Aczenie si z serwerem Aby poBczy si z serwerem Sybase z aplikacji Delhi, funkcjonujcej na komputerze klienta w systemie Windows 95 lub Windows NT, nale|y zainstalowa oprogramowanie Sybase Net Library. Oprogramowanie to wystpuje w dwch r|nych wersjach: osobna dla Windows 95 i Windows NT. Wersja dla NT (jest to cz[ pakietu Sybase Open Client for Windows 95) instaluje si tylko w tym systemie. Przy prbie zainstalowania jej w systemie Windows 95 sygnalizowany jest bBd 422. Druga wersja jest nowsza i funkcjonuje poprawnie w obu systemach Windows. Oczywi[cie, je[li jest taka mo|liwo[, powinni[my posBugiwa si wBa[nie t wersj. 548 Cz[ III Net Library - bBd oprogramowania klienta 422 w NT Wersja przeznaczona tylko dla Windows NT niekiedy instaluje si niepoprawnie. Poczwszy od 1996 r. program instalacyjny przy pierwszej instalacji sygnalizowaB czsto bBd 422. OkazaBo si, |e rozwizanie tego problemu jest proste. Mimo, |e towarzyszcy oprogramowaniu podrcznik Sybase Release Bulletin nakazuje opr|ni katalog TEMP, nie nale|y tego robi. Przy pierwszej nieudanej prbie instalacji program pozostawia pewne pliki tymczasowe w katalogu TEMP. Je[li si ich nie usunie i uruchomi instalacj ponownie, wszystko powinno przebiega bez zakBceD. Konfigurowanie oprogramowania klienta Niezale|nie od wybranej wersji oprogramowania skonfigurujemy poBczenie klienta posBugujc si programem Sybase SQLEDIT: 1. Uruchamiamy SQLEDIT i wpisujemy nazw serwera do pola tekstowego w oknie dialogowym Input Server Name. 2. Klikamy Add - aby doda wprowadzon nazw do listy Server Entry. 3. Z listy rozwijalnej Service Type wybieramy Query. 4. Z listy Platform wybieramy odpowiednio Windows 95 lub NT. 5. Nastpnie wybieramy odpowiedni sterownik z listy rozwijalnej Net-Library Driver. Najprawdopodobniej bdzie to NLWNSCK (TCP/IP Winsock) albo NLWLINK (IPX). 6. W oknie dialogowym Connection Information\Network Address wpisujemy adres sieciowy serwera i numer portu (oddzielone przecinkami). Bdzie to adres TCP/IP, je[li korzystamy z protokoBu TCP/IP lub adres sieci IPX - je[li u|ywamy IPX. Oto przykBadowy BaDcuch poBczeniowy : 100.10.15.12, 3000 W tym przykBadzie 100.10.15.12 jest adresem TCP/IP a 3000 - numerem portu. W razie wtpliwo[ci numer sieci i portu mo|na uzyska od administratora sieci lub systemu. UWAGA Aby uzyska poBczenie mo|na wykorzysta plik konfiguracyjny u|ytkownika. Je[li w pliku HOSTS jest linia 100.10.15.12 marketing to do uzyskania poBczenia wystarczy wprowadzi RozdziaB 18 Delphi na serwerze SQL Sybase 549 marketing 3000 7. Po ustawieniu informacji o poBczeniu klikamy przycisk Add Service, dodajc w ten sposb usBug do listy Connection Service Entry. 8. Po dodaniu usBugi jeste[my gotowi do jej przetestowania. Klikamy przycisk Ping, umieszczony po prawej stronie w dolnej cz[ci ekranu. Ping prbuje poBczy si a nastpnie zamkn poBczenie z ustalonym wcze[niej serwerem. Je[li oprogramowanie klienta zostaBo wBa[ciwie skonfigurowane, nie powinny wystpi |adne problemy. 9. Aby zachowa informacj o poBczeniu naciskamy CTRL+S . WSKAZWKA Ten sam sposb postpowania przy konfigurowaniu poBczenia obowizuje wtedy, gdy instalujemy oprogramowanie czy te| uruchamiamy SQLEDIT niezale|nie . SYBPING Do przetestowania poBczenia z serwerem mo|na u|y programu Sybase a o nazwie SYBPING. Powinien si on znajdowa w folderze SYBASE. Klikamy nazw naszego serwera na li[cie prezentowanej w programie, a nastpnie przycisk Ping. Je[li nasz komputer poBczy si z serwerem, to konfiguracja poBczenia jest poprawna. Sterowniki dla Win 3.x Podamy teraz kilka istotnych wskazwek dla osb korzystajcych z 16-bitowego oprogramowania klienta (Win 3.x): Wcze[niejsze (ni| System 10) wersje Sybase SQL Server korzystaj z biblioteki poBczeniowej Sybase DB-Library. Natomiast System 10 oraz wersje pzniejsze posBuguj si CT-Library. DB-Library umo|liwia Bczenie si z serwerami System 10, ale nie obsBuguje jego specyficznych wBasno[ci. PoBczenia w Delphi 1.0 nawizywane s poprzez DB-Library; Delphi 2.0 i pzniejsze mog korzysta z obu bibliotek. Zanim przystpimy do konfiguracji, powinni[my si wic upewni, jaka biblioteka jest u|ywana przez naszego klienta. Stworzono wiele r|nych wersji bibliotek DB-Library. W czasie naszej pracy nie mieli[my |adnych kBopotw z wersj 3-1-94, ale oczywi[cie nie znaczy to, |e jest ona najlepsza. Chcieliby[my jednak ostrzec, |e niekiedy mog wystpi nieprawidBowo[ci przy konwersji typw. Problem taki pojawiB si wtedy, gdy 550 Cz[ III korzystali[my z Delphi 1.0 i bibliotek Sybase DB-Library z czerwca 1994 r. (konwersja pomidzy typami datetime i string byBa niepoprawna). Dlatego pierwszym krokiem w przypadku wystpienia problemw zwizanych z konwersj powinna by zmiana wersji biblioteki DB-Library. Poczwszy od Systemu 10 zmieniono metod usuwania zapytaD. Obecnie bazuje ona na Out-Of -Band Data (OOBD). ObsBuga OODB jest wbudowana w protokB IPX, ale w przypadku TCP/IP trzeba si o tym upewni. Np. tylko pzniejsze wersje LAN WorkPlace TCP/IP obsBuguj OOBD; wcze[niejsze wymagaj odpowiedniej aktualizacji. korzystamy z OOBD do usuwania zapytaD w [rodowisku Win 3.x, to Je[li powinni[my u|y parametru poBczeniowego URGENT. Zwykle dodaje si URGENT na koDcu BaDcucha poBczeniowego: 100.10.15.12,3000, URGENT Wtedy zapytania, przerywane funkcj dbcancel() z biblioteki DB-Library zwracaj natychmiast sterowanie do aplikacji. Nale|y tak|e pamita, aby korzysta z programu WSYBPING a nie SYBPING - ten ostatni obsBuguje bowiem tylko poBczenia 32-bitowe. Wersja DB-Library dla Windows 3.x wymaga trybu rozszerzonego Windows, chocia| nie jest to w |aden sposb sygnalizowane. Po prostu - je[li uruchomimy DB-Library w trybie standardowym, to nie uzyskamy poBczenia. Tworzenie aliasw BDE Po poBczeniu si z serwerem, mo|emy utworzy aliasy BDE, dziki ktrym nasze aplikacje w Delphi bd miaBy dostp do bazy. Ten temat byB ju| omawiany wcze[niej, dlatego teraz przedstawimy tylko sam sposb tworzenia aliasu BDE w zale|no[ci od konfiguracji oprogramowania sterujcego baz . Aliasy BDE mo|na utworzy za pomoc programu BDE Administrator lub Delphi Database Explorer. Poni|sze kroki zostaBy wykonane w programie BDE Administrator. 1. Uruchamiamy program DBE Administrator, klikamy prawym przyciskiem fiszk Databases i z menu wybieramy New. W oknie dialogowym New Database Alias wybieramy - z listy rozwijalnej - SYBASE Alias type i klikamy OK. 2. Gdy zostanie dodany nowy alias wpisujemy jego nazw. 3. Konfigurujemy go, ustawiajc warto[ci parametrw na stronie Definition. RozdziaB 18 Delphi na serwerze SQL Sybase 551 4. Wybieramy parametr SERVER NAME i wpisujemy nazw naszego serwera SQL - t, ktrej u|yli[my poprzednio w programie SQLEDIT. 5. Dodatkowo mo|emy ustawi parametr USER NAME, podajc nazw u|ytkownika, ktry bdzie domy[lnie logowany do serwera. Bdzie si ona tak|e ukazywaBa we wbudowanym w Delphi oknie dialogowym logowania. Aby zapisa zmiany, klikamy przycisk Apply i zamykamy sesj Administratora. Specjalne ustawienia aliasu BDE Omwione poni|ej ustawienia warto[ci parametrw aliasu BDE mog okaza si istotne, gdy Bczymy si z serwerem SQL Sybase. Chocia| mo|emy ograniczy si do ustawieD domy[lnych, to jednak w przypadku napotkania problemw znajomo[ funkcji poszczeglnych parametrw bdzie z pewno[ci bardzo przydatna. Warto zauwa|y, |e niektre z nich okre[laj sposb funkcjonowania programw obsBugi bazy i mog by ustawiane na stronie Configuration w programie BDE Administrator. APPLICATION NAME (Nazwa aplikacji) Warto[ci Parametr APPLICATION NAME jest nazwa, pod ktr nasz proces bdzie widoczny w tablicy procesw Serwera SQL. CONNECT TIMEOUT (Czas do zerwania poBczenia) Decyduje jak dBugo klient bdzie ponawiaB prby nawizania poBczenia z serwerem SQL. Domy[lnie jest przyjmowane 60 s. Zwikszenie tego parametru mo|e poprawi funkcjonowanie stacji klienckich, szczeglnie gdy Bczymy si przez WAN. HOST NAME (Nazwa hosta) Parametr sBu|y do nadania nazwy stacji roboczej, poprzez ktr bdzie ona identyfikowana w tablicy procesw serwera SQL. Dziki temu bdzie mo|na odr|ni to poBczenie od innych na r|nych listach - takich jak np. tworzona przez procedur sp_who. NATIONAL LANG NAME (Wybrany jzyk) Parametr ten definiuje jzyk, w jakim ukazuj si komunikaty o bBdach. Je[li go nie ustalimy, przyjte zostanie ustawienie domy[lne. 552 Cz[ III TDS PACKET SIZE (Rozmiar pakietw TDS) Stosowany do ustalenia rozmiaru pakietw Tabular Data Stream (TDS). TDS jest protokoBem pakietowym wysokiego poziomu, wykorzystywanym przez SQL Server do wymiany danych z klientami. Chocia| w programie BDE Administrator mo|na okre[li rozmiar od 0 do 65535, to jednak nale|y ograniczy si do zakresu obsBugiwanego przez SQL Server: od 512 do 32767. Mo|e si okaza, |e zwikszenie rozmiaru pakietu spowoduje wzrost przepustowo[ci systemu, w wyniku zmniejszenia liczby pakietw wymaganych do transmisji du|ych ilo[ci danych (np. pl BLOB). Domy[lny rozmiar wynosi 4096 i najlepsz wydajno[ osiga si dla wielko[ci pakietw w zakresie od 4096 do 8192. Aby ustali maksymalny rozmiar pakietu obsBugiwanego przez serwer, mo|na u|y procedury pamitanej serwera SQL o nazwie sp_configure. Powinni[my wic - aby otrzyma bie|cy rozmiar pakietu - wykona instrukcj sp_configue 'network packet size'. Nale|y odpowiednio ustawi ten parametr przed zmian odpowiadajcych mu ustawieD w programie DBE Administrator. Niezgodno[ TDS PACKET SIZE w DBE Administrator i SQL Server max network packet size (lub niewBa[ciwa dodatkowa pami addition network memory ) mo|e wywoBa jeden z komunikatw bBdw: unknown user name or password (nieznana nazwa u|ytkownika lub Error: hasBo) Server error-4002 Login failed (nieudane rejestracja w systemie) Server error - 20014 Login incorrect (niewBa[ciwa rejestracja) UWAGA Zmiana domy[lnego rozmiaru pakietu jest mo|liwa dopiero od wersji 5 TDS DATABASE NAME (Nazwa bazy danych) Pozwala okre[li nazw bazy danych SQL, z ktr chcemy si poBczy. Zwykle tworzy si osobny alias dla ka|dej wykorzystywanej bazy. Wtedy parametr DATABASE NAME wskazuje t, do ktrej odnosi si dany alias. Brak warto[ci parametru DATABASE NAME jest rwnoznaczny ze wskazaniem na domy[ln baz u|ytkownika. Nie polecamy jednak takiego podej[cia. Jednym z powodw jest fakt, |e do ustalenia bazy trzeba wtedy tworzy zapytanie do jednej z tabel systemowych (ang. syslogins table) na serwerze. BLOB EDIT LOGGING (Rejestracja zmian w polach BLOB) Mo|na zablokowa rejestracj zmian w polach BLOB, ustawiajc warto[ tego parametru na FALSE. Minimalizujemy wwczas wymagania pamiciowe, RozdziaB 18 Delphi na serwerze SQL Sybase 553 poprawiajc wydajno[. Ustawienie FALSE powoduje, |e BLOB s transmitowane za pomoc programu narzdziowego SQL Server bulk copy. Dlatego je[li zamierzamy u|y tego mechanizmu, powinni[my ustawi opcj set select into/bulk copy on w docelowej bazie. Opcj set select into/bulk copy ustawiamy za pomoc procedury pamitanej sp_dboption. MAX QUERY TIME (Maksymalny czas wykonania zapytania) Ten parametr okre[la czas wyczekiwania przez SQL do momentu zakoDczenia asynchronicznego zapytania (po upBywie tego czasu jest ono usuwane). Sterownik Sybase SQL Links domy[lnie wykonuje zapytania synchronicznie. Warto[ parametru TIMEOUT okre[la czas zakoDczenia zapytania synchronicznego. Tryb asynchroniczny ustawimy, zwikszajc parametr DRIVER FLAG do 2048. Domy[lnie SQL Links ogranicza czas zakoDczenia zapytania asynchronicznego do 300 s. R|norodne zagadnienia dotyczce Sybase SQL Server Oprcz konfiguracji aliasw s jeszcze pewne niuanse, o ktrych powinni[my wiedzie, tworzc aplikacje w Delphi korzystajce z baz danych Sybase a. Poni|ej poruszymy kilka spraw dotyczcych wspBpracy serwera SQL Sybase a z aplikacjami Delphi. Typy danych numeric i decimal W system Sybase 10 wprowadzono nowe numeryczne i dziesitne typy danych. BDE tBumaczy je na swj typ danych zmiennoprzecinkowych fldFloat. Nale|y jednak zauwa|y, |e oba typy s pobierane z serwera w ich naturalnym formacie (xltNONE), wic nie wystpuje |adna utrata danych przy translacji. Tabele w innych bazach Mo|emy uzyska dostp do obiektw w innych bazach danych, podajc peBn specyfikacj obiektu. Np. mo|na otworzy tabel ACCOUNTING.DEMO. CUSTOMER, umieszczon w bazie danych ACCOUNTING, ktrej wBa[cicielem jest u|ytkownik DEMO, podajc tylko jej peBn nazw. Rozwizywanie problemw poBczeniowych z serwerem Sybase Poni|ej zebrali[my kilka praktycznych porad, ktre mog okaza si przydatne w przypadku napotkania problemw poBczeniowych. 1. Je[li nasza aplikacja napisana w Delphi nie Bczy si z serwerem, powinni[my sprbowa nawiza komunikacj poprzez program Sybase SYSPING. 554 Cz[ III Uzyskanie poBczenia [wiadczyBoby o tym, |e prawdopodobnie zle skonfigurowali[my alias BDE. W takiej sytuacji powinni[my powrci do programu BDE Configuration i upewni si, |e podane ustawienia s poprawne. (w szczeglno[ci nazwa serwera). WSKAZWKA Warto zwrci uwag na r|nic pomidzy programem WSYBPING i SYBPING. WSYBPING jest przeznaczony tylko do obsBugi poBczeD 16-bitowych, wic nie nale|y u|ywa go z 32-bitowymi aplikacjami Delphi. 2. Gdy prba nawizania poBczenia poprzez SYSPING koDczy si niepowodzeniem, mo|emy przypuszcza, |e przyczyn problemw mo|e by protokB sieciowy. Je[li korzystamy z TCP/IP, to poBczenie z serwerem mo|na sprawdzi za pomoc programu PING, ktry jest dostarczany z Windows 95 i Windows. Powinni[my sprbowa Bczenia poprzez nazw komputera, zapisan w pliku HOSTS oraz poprzez jego adres IP. 3. Je[li Bczymy si poprzez adres IP, co nie udaje si poprzez nazw, powinni[my sprawdzi plik HOSTS. Tymczasowo mo|na zmieni odwoBanie sieciowe (programem SYBEDIT), zastpujc w nim nazw komputera jego adresem IP. Z uwagi na fakt, |e odwoBanie do nazwy jest wygodniejsze, powinni[my mo|liwie najszybciej usun przyczyn uniemo|liwiajc poBczenie. 4. W przypadku protokoBu IPX, warto sprawdzi, czy numer IPX sieci serwera jest zgodny z podanym w SYBEDIT. Je[li nadal nie mo|emy uzyska poBczenia albo je[li wystpiBy kBopoty z jeszcze innym protokoBem poBczeniowym, radzimy zwrci si o pomoc do administratora sieci. 5. Je[li korzystamy z TCP/IP i w |aden sposb (ani poprzez nazw ani adres IP) nie udaBo si nam poBczy z serwerem, to prawdopodobn przyczyn mo|e by uszkodzenie sieci. Oczywi[cie powinni[my jeszcze raz sprawdzi adres IP serwera oraz uruchomi PING, podajc adres 127.0.0.1 - aby przekona si, czy stos protokoBu TCP/IP funkcjonuje poprawnie. Je[li test si nie powiedzie, to prawdopodobnie zle skonfigurowano sam protokB. W takim przypadku proponujemy zwrci si do administratora sieci. 6. W sytuacji, gdy nie uzyskali[my poBczenia poprzez SYBPING, natomiast PING funkcjonuje poprawnie, nale|y sprawdzi, czy numer portu w odwoBaniu sieciowym jest zgodny z numerem ustawionym na serwerze. Informacje o portach przypisanych do serwera mo|na uzyska od administratora bazy danych. W Systemie 10 mo|na je ustawia, posBugujc si narzdziem Sybase - SYBINIT. 7. Je[li wszystko wydaje si by skonfigurowane poprawnie, mo|emy dla prby wykorzysta inny protokB (je[li oczywi[cie mamy tak mo|liwo[). Np. autor RozdziaB 18 Delphi na serwerze SQL Sybase 555 spotkaB si z wersj Sybase System 10 for Novell Netware, ktra nie funkcjonowaBa poprawnie ze swoim macierzystym protokoBem Novell IPX, natomiast nie sprawia |adnych kBopotw z TCP/IP. Serwer pozwala na jednoczesn obsBug kilku protokoBw, wic mo|e tymczasowo wykorzystywa tylko ten, z ktrym funkcjonuje poprawnie, a| do momentu przywrcenia do wBa[ciwej pracy drugiego protokoBu. Wstp do SQL Ten paragraf jest wprowadzeniem do odmiany SQL, u|ywanej przez serwery Sybase SQL, zwanej Transact-SQL. Zwracamy w nim szczegln uwag na kilka cech, ktre r|ni t implementacj SQL od dostarczanej przez innych sprzedawcw. Aby mc poznawa w praktyce prezentowane elementy jzyka, wystarczy zapewni sobie dostp do uruchomionego serwera i umie si z nim komunikowa poprzez program ISQL. Tworzenie bazy danych Zaczniemy od utworzenia bazy danych i umieszczenia w niej tymczasowych tabel, ktre posBu| do analizy podanych dalej przykBadw. Skorzystamy z instrukcji CREATE DATABASE. DokBadna posta jej skBadni zale|y od konkretnej implementacji. Tutaj zaprezentujemy jej podstawow posta w jzyku Transact- SQL: CREATE DATABASE dbname ON datadevice=size LOG ON ' logdevice=size Planujc umieszczenie tworzonej bazy danych, korzystamy z urzdzeD logicznych. Koncepcja urzdzeD logicznych pozwala unikn odwoBaD do fizycznego poBo|enia danych na dysku. Stanowi one warstw po[redni pomidzy sterownikami dysku i bazami danych. Definiujemy je korzystajc z instrukcji DISK INIT. Oto prosty przykBad jej u|ycia: DISK INIT name='saltrn00' physname='c:\sybasesql\data\saltrn00.dat', vdevno=5, size = 2048 Parametr name definiuje nazw logiczn (ang. logical handler), ktra wystpuje w odwoBaniach do danego urzdzenia. 556 Cz[ III Parametr physname okre[la szczegBowo fizyczne poBo|enie i nazw urzdzenia plikowego. Mo|e to by plik w systemie plikowym lub surowa partycja (w przypadku systemu operacyjnego, ktry przewiduje tak mo|liwo[). vdevno jest logicznym numerem urzdzenia wirtualnego. Musi on by unikalny w[rd numerw urzdzeD zdefiniowanych na serwerze. Mo|e przyjmowa warto[ci z zakresu od 1 do 255 - 0 jest zarezerwowane dla urzdzenia gBwnego (ang. master device). Jednak, aby mc skorzysta z numerw powy|ej 10 powinni[my najpierw powikszy maksymaln liczb dopuszczalnych urzdzeD za pomoc procedury pamitanej sp_configure Size okre[la liczb stron o wielko[ci 2K, przeznaczonych dla danego urzdzenia. Np. wielko[ 4M (4096K) uzyskamy podajc 2048. Analogicznie tworzymy urzdzenia do rejestracji zdarzeD (ang. log devices) DISK INIT name='sallog00' physname='c:\sybasesql\data\sallog00.dat', vdevno=6, size = 512 Po tych przygotowaniach mo|emy przystpi do utworzenia bazy. Instrukcja CREATE DATABASE w poni|szym przykBadzie korzysta ze zdefiniowanych wcze[niej urzdzeD : CREATE DATABASE sales ON saldat00=4 LOG ON sallog00=1 Instrukcja USE Instrukcja USE w jzyku SQL sBu|y do wyboru aktywnej bazy. SkBadnia instrukcji jest nastpujca: USE dbname Tworzenie tabel Po utworzeniu bazy czynimy j aktywn i mo|emy ju| rozpocz definiowanie obiektw. Prawie ka|de pojcie odnoszce si do relacyjnych baz danych mo|e by zaprezentowane za pomoc co najwy|ej trzech tabel. Utwrzmy wic na pocztek trzy tabele, dziki ktrym bdziemy mogli zrozumie istot omawianych zagadnieD. PosBu|ymy si poleceniem SQL - CREATE TABLE. Wprowadzmy odpowiedni instrukcj ISQL, aby utworzy tabel CUSTOMER: CREATE TABLE CUSTOMER ( CustomerNumber int NOT NULL, RozdziaB 18 Delphi na serwerze SQL Sybase 557 LastName Char(30) NULL, FirstName char(30) NULL, StreetAddress char(30) NULL, City char(20) NULL, State char(2) NULL, Zip char(10) NULL ) Dalej utwrzmy tabel SALE : CREATE TABLE SALE ( SaleNumber int NOT NULL, SaleDate datetime NULL, CustomerNumber int NOT NULL, ItemNumber int NOT NULL, Amount money ) Po zbudowaniu tabeli SALE, pozostaBa do utworzenia tylko tabela ITEM: CREATE TABLE ITEM ( ItemNumber int NOT NULL, Description char(30) NULL, Price money NULL ) Dodawanie i usuwanie kolumn Do dodania lub usunicia kolumny z istniejcej tabeli sBu|y instrukcja ALTER TABLE. Aby doda kolumn korzystamy z nastpujcej skBadni: ALTER TABLE CUSTOMER ADD PhoneNumber char(10) NULL natomiast aby j usun: ALTER TABLE CUSTOMER DROP PhoneNumber Oczywi[cie nie mo|na rozszerzy niepustej tabeli o now kolumn z zastrze|eniem NOT NULL. Wtedy bowiem nie mo|na byBoby odpowiednio uzupeBni umieszczonych w niej wierszy. OSTRZE{ENIE Instrukcja ALTER TABLE... DROP jest realizowana w Sybase tylko jako nieudokumentowany element jzyka. Powinni[my bra to pod uwag, korzystajc z niej w swoich programach. 558 Cz[ III Wizy (constrains) Wizy to mechanizmy, dziki ktrym mo|emy ograniczy rodzaj danych umieszczanych w kolumnie lub powiza je ze sob. Pozwalaj tak|e okre[li warto[ci domy[lne dla kolumn. Definiuje si je, doBczajc odpowiednie instrukcje do CREATE TABLE albo ALTER TABLE. Jednym z przykBadw nakBadania wizw jest tworzenie klucza gBwnego: ALTER TABLE CUSTOMER ADD PRIMARY KEY (CustomerNumber) W tym przykBadzie zdefiniowali[my klucz gBwny dla tabeli CUSTOMER jako pole CustomerNumber. Dziki temu, na bazie pola CustomerNumber zostanie utworzony unikalny indeks. Oczywi[cie do zdefiniowania klucza gBwnego tabeli nie mo|na u|y kolumny, ktra zezwala na u|ycie warto[ci NULL. Klucz obcy definiuje kolumn w jednej tabeli, ktrej warto[ci musz znajdowa si innej tabeli. Nie okre[la jednoznacznie wierszy, tak jak jest to w przypadku klucza gBwnego. Musi by jednak kluczem gBwnym lub unikalnym w tabeli, do ktrej si odnosi. Dodanie klucza obcego powoduje, |e Sybase SQL Server buduje wtrny indeks bazujcy na polu kluczowym. Oto odpowiedni przykBad: ALTER TABLE SALE ADD CONSTRAINT INVALID_CUSTOMER_NUMBER FOREIGN KEY ' (CustomerNumber)REFERENCES CUSTOMER W przykBadzie zdefiniowano pole CustomerNumber w tabeli SALE, jako klucz obcy odnoszcy si do tej samej kolumny w tabeli CUSTOMER. NaBo|one wizy powoduj, |e aby numer klienta (ang customer number) mgB by wprowadzony do tabeli SALE, musi najpierw istnie w tabeli CUSTOMER. Tak|e numery u|ywane w tabeli SALE nie mog zosta usunite z tabeli CUSTOMER. Mo|liwo[ wymuszenia zale|no[ci pomidzy dwiema tabelami przez zadeklarowanie ich relacji w SQL nazywana jest deklaratywn spjno[ci referencyjn (ang declarative referential integrity). Ten termin znaczy po prostu, |e spjno[ danych w tabelach zwizanych relacj jest zapewniana przez zdefiniowanie (lub zadeklarowanie) tej relacji w bazie, a nie przez kod programu. Trzeci typ wizw pozwala ustali zakres dozwolonych warto[ci dla wprowadzanych danych np. ALTER TABLE CUSTOMER ADD CONSTRAINT INVALID_STATE CHECK (State in ('OK', 'AR', ' 'MO')) Zwracamy uwag na celowo[ u|ycia elementw negacji w konwencji nazewniczej dotyczcej wizw. Oprogramowanie po stronie u|ytkownika, ktre RozdziaB 18 Delphi na serwerze SQL Sybase 559 zapobiega naruszeniu wizw, ma dostarcza u|ytkownikowi Batw do poprawnego zinterpretowania informacj. Gdyby informacja o bBdzie byBa sygnowana VALID_STATE, u|ytkownik mgBby si nie zorientowa, co jest przyczyn problemu. Dobrze dobrana nazwa ograniczenia, ktra sBu|y jako informacja zwrotna, bdzie dla u|ytkownika wystarczajc wskazwk, w jaki sposb prbowano naruszy wizy. Dziki temu nie musimy zastpowa, swoimi wBasnymi, komunikatw wyjtkw generowanych przez Delphi. Testowanie funkcjonowania wizw Ka|de wizy naBo|one na baz powinny zosta sprawdzone. Najlepszym testem bdzie prba ich naruszenia. Np. aby sprawdzi zdefiniowane powy|ej wizy INVALID_STATE, wprowadzamy nastpujc instrukcj w programie ISQL: INSERT INTO CUSTOMER (CustomerNumber,State) VALUES(123,'CA') Poniewa| pozwalaj one tylko na wprowadzenie warto[ci 'OK', 'AR' i 'MO', to prba umieszczenia tego wiersza w bazie powinna wywoBa komunikat bBdu. Je[li wprowadzone wizy nie funkcjonuj, nale|y przede wszystkim sprawdzi, czy zostaBy one poprawnie zapisane w bazie oraz przeanalizowa ich definicje. Tworzenie indeksw Do budowania indeksw w SQL sBu|y instrukcja CREATE INDEX. Jej podstawowa skBadnia wyglda nastpujco: CREATE INDEX SALE02 ON SALE (SaleDate) SALE02 jest nazw nowego indeksu, SALE - tabel dla ktrej budujemy indeks a SaleDate - kluczem indeksu. Nale|y zaznaczy, |e nazwa indeksu w Sybase SQL Server musi by unikalna w bazie, w ktrej jest on umieszczony. Instrukcja CREATE UNIQE INDEX tworzy indeks zapewniajcy unikalno[ klucza np: CREATE UNIQE INDEX SALE01 ON SALE (SaleNumber) Wprowadzanie danych Instrukcja INSERT sBu|y do wprowadzania danych do tabeli. Ka|de wystpienie klauzuli VALUES w instrukcji INSERT umo|liwia dodanie jednego wiersza danych. Mo|na te| wprowadzi od razu kilka wierszy, wybierajc je z innej tabeli. 560 Cz[ III W poni|szym przykBadzie dodano dane do wszystkich naszych tabel. Najpierw trzy wiersze do tabeli CUSTOMER (posBu|ymy si ISQL): INSERT INTO CUSTOMER (CustomerNumber, LastName, FirstName, ' StreetAddress, City, State, Zip) VALUES(1,'Doe','John','123 Sunnylane','Anywhere','MO', ' '73115') INSERT INTO CUSTOMER (CustomerNumber, LastName, FirstName, ' StreetAddress, City, State, Zip) VALUES(2,'Doe','Jane','123 Sunnylane','Anywhere','MO', ' '73115') INSERT INTO CUSTOMER (CustomerNumber, LastName, FirstName, ' StreetAddress, City, State, Zip) VALUES(3,'Philgates','Buck','57 Riverside','Reo','AR', ' '65803') Teraz dodamy trzy wiersze do tabeli ITEM: INSERT INTO ITEM(ItemNumber, Description, Price) VALUES(1001,'Zoso LP',13.45) INSERT INTO ITEM(ItemNumber, Description, Price) VALUES(1002,'White LP',67.90) INSERT INTO ITEM(ItemNumber, Description, Price) VALUES(1003,'Bad Co. LP',11.45) W koDcu dodamy cztery wiersze do tabeli SALE: INSERT INTO SALE (SaleNumber, SaleDate, CustomerNumber, ' ItemNumber, Amount) VALUES(101,'10/18/90',1,1001,13.45) INSERT INTO SALE (SaleNumber, SaleDate, CustomerNumber, ' ItemNumber, Amount) VALUES(102,'02/27/92',2,100,67.90) INSERT INTO SALE (SaleNumber, SaleDate, CustomerNumber, ' ItemNumber, Amount) VALUES(103,'05/20/95',3,1003,11.45) INSERT INTO SALE (SaleNumber, SaleDate, CustomerNumber, ' ItemNumber, Amount) VALUES(104,'11/27/97',4,1004,67.90) RozdziaB 18 Delphi na serwerze SQL Sybase 561 Warto zauwa|y, |e nie trzeba uwzgldnia wszystkich kolumn ani ich porzdku ustalonego przy tworzeniu tabeli ale lista podanych warto[ci musi by zgodna pod wzgldem liczby elementw i ich uporzdkowania z list kolumn w instrukcji INSERT, np.: INSERT INTO ITEM (Price, ItemNumber) VALUES(13.45, 1001) Instrukcja UPDATE Instrukcja SQL UPDATE sBu|y do modyfikacji danych w tabeli. Jej klauzula WHERE umo|liwia wybr modyfikowanych wierszy. Oto odpowiedni przykBad: UPDATE CUSTOMER SET Zip='65803' WHERE City='SpringField' Klauzula WHERE w instrukcji UPDATE pozwala ograniczy liczb modyfikowanych wierszy nawet do jednego (zale|nie od danych i warunku), natomiast pomijajc j domy[lnie zmodyfikujemy wszystkie: UPDATE CUSTOMER SET State='MO' Poprawiajc dane w kolumnie mo|na korzysta z warto[ci innych kolumn danej tabeli (tak|e z tej kolumny). ZaB|my, |e chcemy zwikszy cen ka|dego produktu z tabeli ITEM o 7%. Modyfikacj t mo|na wykona nastpujco: UPDATE ITEM SET Price=Price+(Price*.07) Instrukcja DELETE Dziki instrukcji SQL DELETE mamy mo|liwo[ usuwania wierszy z tabeli. Np. aby opr|ni tabel CUSTOMER wystarczy napisa: DELETE FROM CUSTOMER Instrukcja DELETE mo|e te| zawiera klauzul WHERE, ograniczajc zakres usuwanych wierszy. Oto odpowiedni przykBad: DELETE FROM CUSTOMER WHERE LastName<>'Doe' 562 Cz[ III Kontrola Transakcji Grupa powizanych zmian w bazie nazywa si formalnie transakcj. WBasne transakcje inicjujemy za instrukcj BEGIN TRANSACTION. Instrukcja COMMIT sBu|y do zachowania zmian dokonywanych w czasie transakcji, a instrukcja ROLLBACK pozwala na ich wycofanie. Obie odnosz si tylko do zmian dokonanych od chwili wywoBania ostatniej instrukcji COMMIT. ROLLBACK nie spowoduje wycofania zmian przyjtych poprzedzajcymi j instrukcjami COMMIT. UWAGA Oprcz zwykBych instrukcji jzyka DML (Data Manipulation Language ) (np. INSERT, UPDATE, DELETE) kontrola transakcji uwzgldnia tak|e instrukcje DDL (Data Definition Language). Je[li wycofa si transakcj, w ktrej zostaB utworzony obiekt, to zostanie on usunity z bazy. Transakcji mo|na wic u|y do warunkowego utworzenia tabeli roboczej. Pozostanie ona w bazie pod warunkiem, |e wszystkie dane zostan do niej poprawnie wprowadzone. Je[li bowiem instrukcje CREATE TABLE i INSERT s umieszczone w tej samej transakcji i instrukcja INSERT nie zostanie wykonana poprawnie, to stworzona tabela zostanie automatycznie usunita. Instrukcja SELECT Instrukcja SQL SELECT pobiera dane z okre[lonych kolumn tabeli. Pozwoli nam wic sprawdzi zawarto[ trzech naszych tabel. W tym celu wykonajmy trzykrotnie instrukcj o skBadni SELECT * FROM tablename, zamieniajc za ka|dym razem tablename na nazw odpowiedniej tabeli (CUSTOMER, SALE oraz ITEM). Je[li wcze[niej dodali[my proponowane dane, to ka|da z powstaBych w ten sposb tabel roboczych powinna mie co najmniej trzy wiersze. SELECT * zwraca caBa tabel. Je[li gwiazdk zastpimy list nazw pl oddzielonych przecinkami, to otrzymamy dane tylko z wybranych pl np.: SELECT CustomerNumber, LastName, State FROM CUSTOMER Wyra|enia kolumnowe Instrukcji SELECT w Sybase SQL Server umo|liwia podanie na li[cie kolumn nie tylko samych nazw, ale tak|e wyra|eD arytmetycznych zbudowanych z warto[ci kolumn, staBych i funkcji. Podajemy taki przykBad zastosowania instrukcji SELECT, zwracajcej rekordy z tabeli SALE z warto[ci sprzeda|y powikszon o $15 - opBat za dostarczenie towaru: RozdziaB 18 Delphi na serwerze SQL Sybase 563 SELECT SaleNumber, SaleDate, Amount+15 AmountPlusShipping FROM SALE Funkcje sumaryczne Funkcje sumaryczne wykonuj pewne obliczenia na zbiorach danych. PrzykBadami takich funkcji s COUNT, SUM, AVG, MIN oraz MAX. Podamy teraz kilka przykBadw ich u|ycia: SELECT COUNT(*) FROM CUSTOMER To zapytanie daje w wyniku liczb klientw w pliku. SELECT MAX(Amount) FROM SALE To z kolei podaje najwiksz warto[ sprzeda|y w dolarach. SELECT SUM(Amount) FROM SALE Natomiast wynikiem tego zapytania jest caBkowita warto[ sprzeda|y w dolarach. Klauzula WHERE Klauzula SQL WHERE umo|liwia wybranie wierszy zwracanych przez instrukcj SELECT. Oto przykBad: SELECT * FROM CUSTOMER WHERE State='MO' W wyniku otrzymujemy tylko tych klientw, ktrzy mieszkaj w Missouri (symbol 'MO'). SELECT * FROM CUSTOMER WHERE StreetAddress LIKE '%Sunny%' Rezultatem tego zapytania bd dane klientw, u ktrych w polu StreetAddress wystpuje sBowo Sunny. Nale|y pamita, |e porwnanie znakw uwzgldnia r|nice pomidzy wielkimi i maBymi literami. Zawsze jednak mo|na zastosowa - do zamiany wszystkich liter w kolumnie i poszukiwanym wzorcu na du|e - funkcj UPPER. Oto dalsze przykBady: SELECT * FROM SALE WHERE Amount>500 W wyniku otrzymujemy list wszystkich transakcji, ktrych kwota przekroczyBa 500$. 564 Cz[ III SELECT * FROM SALE WHERE SaleDate BETWEEN '10/18/90' AND '05/20/95' To zapytanie zwraca dane o wszystkich transakcjach dokonanych pomidzy 18 pazdziernika 1990 r. a 20. maja 1995 r. wBcznie. ZBczenia (Joins) Klauzula WHERE jest tak|e wykorzystywana do Bczenia tabel. Przy zBczeniu skBadnia klauzuli WHERE jest inna, ni| w podstawowej instrukcji SELECT. Okre[la si dodatkowe tabele w klauzuli SELECT FROM i Bczy si pola bdce ze sob w relacji, formuBujc odpowiednie warunki w klauzuli WHERE. Dobrze ilustruje to nastpujcy przykBad: SELECT CUSTOMER.CustomerNumber, SALE.Amount FROM CUSTOMER, SALE WHERE CUSTOMER.CustomerNumber=SALE.CustomerNumber Zauwa|my, |e do klauzuli FROM wBczono tabel SALE oraz u|yto znaku rwno[ci do zBczenia tabel CUSTOMER i SALE poprzez pole Customer- Number. Tabela wymieniona po lewej stronie znaku rwno[ci jest nazywana tabel zewntrzn, a po prawej tabel wewntrzn. Ze wzgldu na ich pozycj w stosunku do znaku rwno[ci czsto u|ywa si okre[lenia prawa i lewa. O zBczeniu mwi si lewa do prawej lub lewostronne zBczenie. Jest to najcz[ciej u|ywane zBczenie w zapytaniach SQL. ZBczenia wewntrzne(inner) oraz zewntrzne (outer) Wspomniane powy|ej zBczenie lewostronne formalnie nazywa si zBczeniem wewntrznym. ZBczenie wewntrzne daje w wyniku tylko wiersze, dla ktrych jest speBniony warunek zBczenia. Natomiast zewntrzne uwzgldnia te| wiersze, dla ktrych warunek nie zostaB speBniony. W zBczeniu zewntrznym, je[li nie znajdziemy pasujcych wierszy w tabeli wewntrznej, to kolumny z tabeli wewntrznej s doBczane z warto[ci NULL. W zale|no[ci od rodzaju zBczenia zewntrznego tzn. left (lewostronne) lub right (prawostronne) warto[ciami NULL s odpowiednio uzupeBniane wszystkie wiersze lewej albo prawej tabeli, dla ktrych nie byB speBniony warunek zBczenia. Oto przykBad zBczenia zewntrznego, opisany w jzyku Transact-SQL: SELECT CUSTOMER.CustomerNumber, SALE.Amount FROM CUSTOMER, SALE WHERE CUSTOMER.CustomerNumber*=SALE.CustomerNumber RozdziaB 18 Delphi na serwerze SQL Sybase 565 SkBadnia zBczenia w ANSI Oprcz wBasnej skBadni SQL Server akceptuje przy konstruowaniu zBczeD tak|e skBadni ANSI. ANSI definiuje specjalne operatory zBczeD, umieszczane w klauzuli FROM. Np. lewostronne wewntrzne zBczenie mo|e wyglda nastpujco: SELECT CUSTOMER.CustomerNumber, SALE.Amount FROM CUSTOMER LEFT JOIN SALE ON CUSTOMER.CustomerNumber=SALE.CustomerNumber SkBadni dla lewostronnego zBczenia zewntrznego przedstawiamy w poni|szym przykBadzie: SELECT CUSTOMER.CustomerNumber, SALE.Amount FROM CUSTOMER LEFT OUTER JOIN SALE ON CUSTOMER.CustomerNumber=SALE.CustomerNumber Dla okre[lenia prawostronnego zBczenia zewntrznego wystarczy po prostu zamieni LEFT na RIGHT. Zauwa|my, |e prawostronne i lewostronne zBczenia wewntrzne daj ten sam wynik i dlatego nie r|ni si skBadniowo. ZBczenia wielopoziomowe (Multi-Tier Joins) ZBczenia wielopoziomowe korzystaj z wicej ni| dwch tabel. Tabela A jest zBczana z tabel B a ta z kolei - z tabel C. Rozwa|my nastpujce zapytanie: SELECT C.LastName, C.FirstName, I.Description, S.Amount FROM CUSTOMER C, SALE S, ITEM I WHERE C.CustomerNumber=S.CustomerNumber and S.ItemNumber=I.ItemNumber W tym zapytaniu CUSTOMER i SALE s zBczone przez wsplny klucz- pole CustomerNumber a SALE i ITEM przez ItemNumber. W efekcie wszystkie trzy tabele utworz jeden zbir wynikowy. SamozBczenia (Self-Joins) Oprcz zBczenia z innymi tabelami, tabela mo|e by zBczana sama ze sob. Ten rodzaj zBczenia nazywa si samozBczeniem. Rozwa|my nastpujce zapytanie: SELECT S.CustomerNumber, S.Amount, (S.Amount/SUM(S2.Amount))*100 Precentage FROM SALE S, SALE S2 WHERE S.CustomerNumber=S2.CustomerNumber GROUP BY S.CustomerNumber, S.Amount 566 Cz[ III To zapytanie podaje kwoty wszystkich zakupw dokonanych przez klientw, wraz z rozbiciem procentowym w stosunku do caBej kwoty zapBaconej przez danego klienta. Budujc takie zapytanie w ramach jednej instrukcji SELECT, musimy posBu|y si samozBczeniem. Najpierw jest tworzona i grupowana indywidualna statystyka, a potem tabela SALE jest zBczana ze sob w celu uzyskania Bcznej kwoty zakupw ka|dego klienta. To pozwala ju| obliczy odpowiedni warto[ procentow, ktra wystpi w wyniku zapytania. ZBczenia z u|yciem innych operatorw (Theta Joins) W warunku zBczenia, oprcz najcz[ciej stosowanego operatora porwnania  jest rwne (=) mog wystpi inne - zwykle jest to operator  jest r|ne (<>).Podany przykBad prezentuje takie zBczenie, pokazujc jednocze[nie wykorzystanie samozBczenia: SELECT C.CustomerNumber, S.Amount, (S2.Amount) OTHERS FROM CUSTOMER C, SALE S, SALE S2 WHERE C.CustomerNumber=S.CustomerNumber AND C.CustomerNumber<>S2.CustomerNumber GROUP BY C.CustomerNumber, S.Amount Faktycznie to zapytanie zawiera dwa zBczenia.. Pierwsze - pomidzy CUSTOMER i SALE - aby uzyska kwot zakupu dla ka|dego klienta. Nastpne za[ (theta join) - do obliczenia sumy kwot wszystkich zakupw, ktre nie zostaBy zrobione przez klienta. Poniewa| stosuje si dwa r|ne typy zBczenia do tej samej tabeli, wic zapytanie korzysta z dwch r|nych aliasw dla SALE. PeBne zBczenia (Full Joins) PeBne zBczenie pozwala Bczy wiersze z dwch tabel bez klauzuli WHERE. Jest ono przydatne w przypadku Bczenia tabel, powizanych relacjami. Je[li |adna z tabel nie zawiera wszystkich interesujcych nas wierszy, to Bczc je poprzez zewntrznego peBne zBczenie otrzymamy wszystkie wiersze. Jest to po prostu kombinacja zBczenia prawo i lewostronnego. Oto przykBad: SELECT ITEM.Description, ITEM.Price SALE.Amount FROM SALE FULL OUTER JOIN ITEM ON ITEM.ItemNumber=SALE.ItemNumber Iloczyn kartezjaDski Iloczyn kartezjaDski jest wynikiem poBczenia wszystkich wierszy z jednej tabeli ze wszystkimi wierszami innej. Zwykle taki zbir otrzymujemy przypadkowo, gdy opu[cimy lub niewBa[ciwie sformuBujemy warunek zBczenia. Oto odpowiedni przykBad: RozdziaB 18 Delphi na serwerze SQL Sybase 567 SELECT SALE.SaleNumber, ITEM.ItemNumber FROM SALE, ITEM ORDER BY SaleNumber, ItemNumber Dla tabel z du| ilo[ci danych obliczanie iloczynu kartezjaDskiego mo|e zablokowa serwer na tak dBugo, |e konieczne bdzie zamknicie poBczenia albo zatrzymanie wykonania zapytania. W niektrych systemach zatrzymanie procesu jest mo|liwe tylko przez zrestarowanie komputera serwera. Nale|y wic unika tworzenia iloczynu kartezjaDskiego szczeglnie w przypadku, gdy pracujemy z du|ymi tabelami. Podzapytania (Subqueries) Podzapytanie to instrukcja SELECT umieszczona w klauzuli WHERE innej instrukcji SELECT. Oglnie podzapytania to zapytania zwracajce dane, ktre nie s koDcowym wynikiem, lecz bd wykorzystywane w dalszej cz[ci instrukcji. Oto przykBad: SELECT * FROM CUSTOMER WHERE CustomerNumber IN (SELECT CustomerNumber FROM SALE) Pewne operatory funkcjonuj tylko w podzapytaniach. S to ANY, ALL, SOME, EXISTS i SINGULAR. Chocia| sBowo kluczowe ALL jest tak|e u|ywane w instrukcji SELECT, to jako operator wystpuje tylko w podzapytaniach. GROUP BY Poniewa| SQL jest jzykiem zapytaD zorientowanym na przetwarzanie zbiorw (set - oriented), instrukcje grupujce dane s jego integraln cz[ci. Czsto osoby tworzce bazy danych i pracujce z innymi systemami DBMS uwa|aj takie podej[cie za nietypowe, bowiem s przyzwyczajone do procedur przetwarzajcych dane wiersz po wierszu. W wielu programach dziaBajcych na komputerach PC, aby zebra dane sumaryczne przechodzi si wiersz po wierszu przez caB tabel. Podej[cie SQL jest zupeBnie inne. Niekiedy pojedyncza instrukcja SQL zastpuje 10 lub nawet 50 linii kodu programu napisanego w dBase. Jest to mo|liwe dziki instrukcji SELECT, klauzuli GROUP BY oraz funkcjom sumarycznym SQL. Klauzula GROUP BY pozwala definiowa grupy wyj[ciowe wierszy, do ktrych odnosz si funkcje sumaryczne u|yte w klauzuli SELECT. Nastpny przykBad pokazuje zastosowanie klauzuli GROUP BY: SELECT CUSTOMER.CustomerNumber, SUM(SALE.Amount) TotalSale FROM CUSTOMER, SALE WHERE CUSTOMER.CustomerNumber=SALE.CustomerNumber GROUP BY CUSTOMER.CustomerNumber 568 Cz[ III Rezultatem tego zapytania jest lista wszystkich klientw wraz z sumaryczn warto[ci transakcji ka|dego klienta. Oczywi[cie nasuwa si pytanie, ktre pola poBczy klauzul GROUP BY. Sybase SQL Server wymaga, aby klauzula GROUP BY zawieraBa wszystkie kolumny wymienione na li[cie kolumn instrukcji SELECT, ktre nie s funkcjami sumarycznymi. W przypadku korzystania z klauzuli GROUP BY, na li[cie kolumn instrukcji SELECT powinna znalez si cho jedna funkcja sumaryczna. Je[li ten warunek nie jest speBniony, Sybase SQL Server uniemo|liwia zastosowanie klauzuli GROUP BY. HAVING Klauzula HAVING w instrukcji SELECT sBu|y do selekcji wierszy zwracanych przez klauzul GROUP BY. Zale|no[ midzy klauzulami GROUP BY oraz HAVING przypomina zale|no[ pomidzy instrukcj SELECT a klauzul WHERE. Klauzula HAVING dziaBa podobnie jak klauzula WHERE ale na zbiorze wynikowym, a nie na wierszach w tabelach zapytania. Oglnie HAVING jest mniej efektywne ni| WHERE, poniewa| selekcjonuje zbir wynikowy, po tym jak zostanie on zgrupowany, za[ WHERE czyni to najpierw. S jednak sytuacje, w ktrych korzystamy z klauzuli HAVING. Przeanalizujmy poni|szy przykBad: SELECT CUSTOMER.LastName, COUNT(*) NumberWithName FROM CUSTOMER GROUP BY CUSTOMER.LastName HAVING COUNT(*)>1 HAVING wykorzystujemy przy selekcji wierszy otrzymywanych przez zapytanie bazujce na funkcji sumarycznej. Zastosowanie WHERE jest niemo|liwe, bowiem potrzebna informacja nie istnieje, a| do momentu wykonania zapytania i obliczenia odpowiednich warto[ci. ORDER BY Klauzula ta sBu|y do odpowiedniego posortowania zbioru wynikowego. Oto przykBad: SELECT * FROM CUSTOMER ORDER BY State Bez ORDER BY nie ma |adnej gwarancji, |e wiersze zostan odpowiednio posortowane. Wtedy nawet ta sama instrukcja SELECT, wywoBana dwukrotnie, mo|e stworzy zbiory wynikowe, za ka|dym razem uporzdkowane inaczej. RozdziaB 18 Delphi na serwerze SQL Sybase 569 Aliasy kolumn W kilku prezentowanych wcze[niej przykBadach u|ywali[my logicznych nazw kolumn, w ktrych umieszczali[my wyniki obliczeD funkcji sumarycznych - jak: COUNT() czy SUM(). Etykiety tego typu nazywamy aliasami kolumn. Dziki nim zapytanie i jego wynik s czytelniejsze. W Sybase SQL Server alias kolumny umieszcza si bezpo[rednio po prawej stronie odpowiadajcej mu kolumny na li[cie pl instrukcji SELECT. Na przykBad, w podanym poni|ej zapytaniu aliasem warto[ci funkcji sumarycznej COUNT() jest etykieta NumberWithName: SELECT CUSTOMER.LastName, COUNT(*) NumberWithName FROM CUSTOMER GROUP BY CUSTOMER.LastName HAVING COUNT(*)>1 Aliasy mo|na stosowa nie tylko dla funkcji sumarycznych, lecz dla ka|dej pozycji w zbiorze wynikowym, np.: SELECT CUSTOMER.LastName LName, COUNT(*) NumberWithName FROM CUSTOMER GROUP BY CUSTOMER.LastName W tym zapytaniu zastpili[my w zbiorze wynikowym nazw kolumny LastName przez jej alias LName. Aliasw nie mo|na jednak stosowa w innych cz[ciach zapytania, takich jak klauzula WHERE czy GROUP BY. Wtedy musimy posBu|y si nazw kolumny lub warto[ci. Aliasy tabel SkBadnia instrukcji SELECT umo|liwia korzystanie ze skrtu, zamiast podawania peBnej nazwy tabeli. Nazywamy go aliasem tabeli. Jest definiowany w klauzuli FROM instrukcji SELECT i umieszczany bezpo[rednio po prawej stronie wBa[ciwej nazwy, tak jak w poni|szym przykBadzie: SELECT C.LastName, COUNT(*) NumberWithName FROM CUSTOMER C GROUP BY C.LastName Mo|e dziwi fakt, |e alias wystpuje na li[cie pl instrukcji SELECT, czyli zanim go zdefiniowano. Powinni[my jednak pamita, |e odwoBanie si do obiektw bazy danych musi nastpi przed wykonaniem zapytania. Perspektywy (Views) Perspektywa SQL skBada si z instrukcji SELECT, ktr mo|na traktowa jak tabel i, w dalszej kolejno[ci, zapytania z innymi instrukcjami SELECT. 570 Cz[ III W pewnych sytuacjach mo|e by ona parametrem instrukcji INSERT, DELETE, i UPDATE. Perspektywa nie zapamituje jednak |adnych danych. Jest ona tylko pewn konstrukcj logiczn. Mo|na o niej my[le jako o maBym programie w jzyku SQL, uruchamianym przy ka|dym zapytaniu stworzonym na jej bazie. Jest podobna w Oracle do procedury wyboru, omwionej w nastpnej sekcji " Procedury pamitane". Gdy jest wykonywane zapytanie posBugujce si perspektyw, optymalizator zapytaD tworzy najpierw perspektyw, Bczy j z wBa[ciwym zapytaniem i optymalizuje obie czynno[ci wykonujc je jako jedno zapytanie. Perspektywy w SQL tworzy si instrukcj CREATE VIEW np.: CREATE VIEW MOCUSTOMERS AS SELECT * FROM CUSTOMER WHERE State='MO' Perspektywa mo|e zosta wykorzystana w zapytaniu jak zwykBa tabela np.: SELECT * FROM MOCUSTOMERS Mimo braku klauzuli WHERE w zapytaniu, zbir wynikowy uwzgldnia oczywi[cie klauzul WHERE, podan w definicji perspektywy. Instrukcja SELECT tworzca perspektyw, ma prawie takie same mo|liwo[ci jak podstawowa instrukcja SELECT. Nie mo|e tylko korzysta z klauzuli ORDER BY. To ograniczenie odnosi si do wszystkich omawianych w tym rozdziale serwerw baz danych. Tworzc modyfikowaln perspektyw, mo|na ograniczy poprawianie lub dodawanie wierszy do warto[ci speBniajcych zadane przez ni warunki. Serwer blokuje wtedy wszelkie zmiany wykraczajce poza perspektyw. W tym celu wystarczy - w instrukcji CREATE VIEW - doda klauzul WITH CHECK OPTION.np: CREATE VIEW MOCUSTOMERS AS SELECT * FROM CUSTOMER WHERE State='MO' WITH CHECK OPTION W ramach zdefiniowanej perspektywy bdzie mo|na dodawa tylko takie rekordy, dla ktrych State = 'MO'. Nie ma tak|e mo|liwo[ci zmiany warto[ci pola State. RozdziaB 18 Delphi na serwerze SQL Sybase 571 Procedury pamitane (Stored Procedures) Procedury pamitane s kompilowanymi programami SQL, przechowywanymi wraz z innymi obiektami baz danych. Do tworzenia procedur pamitanych sBu|y instrukcja CREATE PROCEDURE. Poni|ej przedstawiamy przykBad takiej procedury dla SQL Server: CREATE PROCEDURE listcustomers AS BEGIN SELECT LastName FROM CUSTOMER END Dla procedury z parametrami skBadnia instrukcji podlega drobnej modyfikacji: CREATE PROCEDURE listcustomersbystate (@State varchar(2), @LastNameMask varchar(30)) AS BEGIN SELECT LastName FROM CUSTOMER WHERE State= @State AND LastName LIKE @LastNameMask END Skrypty Instrukcje Data Definition Language (DDL), zawierajce procedury pamitane, warto umieszcza w specjalnych plikach zwanych skryptami. S to zwykBe pliki tekstowe, zawierajce cigi poleceD SQL, wic mo|na je tworzy korzystajc z dowolnego edytora tekstw. Warto przypomnie, |e skrypty powinny zawiera niezbdne instrukcje USE oraz polecenie GO, ktre koDczy wykonanie pliku wsadowego. Skrypty SQL w Sybase SQL Server uruchamia si, podajc w linii poleceD programu ISQL instrukcj (jak w poni|szym przykBadzie): ISQL -Usa -Imyscript.sql -Omyscript.out Parametr -I okre[la nazw skryptu do wykonania; -O okre[la nazw pliku wynikowego dla skryptu. PrzykBad zostaB przedstawiony w listingu 18.1. Polecenie sp_dir w procedurze pamitanej dziaBa analogicznie, jak DIR w systemie DOS . Listing 18.1. Skrypt SQL zawierajcy procedur pamitan sp_dir /* * DROP PROC dbo.sp_dir */ use sybsystemprocs go IF OBJECT_ID('dbo.sp_dir') IS NOT NULL BEGIN DROP PROC dbo.sp_dir 572 Cz[ III PRINT '<<< DROPPED PROC dbo.sp_dir >>>' END go create procedure sp_dir @mask char(30) = '%', @obtype char(2) ' = 'U', @orderby char(3)='/N' as select o.id, o.name, o.type, date_created=o.crdate, row_count = rowcnt(i.doampg), -- row_len=1*null, size = convert(numeric(13),(reserved_pgs(i.id, ' i.doampg)+reserved_pgs(i.id, i.ioampg))), data_space = convert(numeric(13),data_pgs(i.id, ' i.doampg)), index_space = convert(numeric(13),data_pgs(i.id, ' i.ioampg)), unused_space = convert(numeric(13),((reserved_pgs(i.id, ' i.doampg)+reserved_pgs(i.id, i.ioampg))- ' (data_pgs(i.id, i.doampg)+data_pgs(i.id, ' i.ioampg)))), owner=user_name(o.uid), sequencer=0.0 into #sp_dir from sysobjects o, sysindexes i where o.name like @mask and o.type like @obtype and o.id*=i.id and i.indid<=1 select @orderby=upper(@orderby) /* declare @tablename char(30),@row_len int set rowcount 1 while exists (select @tablename=name from #sp_dir where type ' in ('U','S') and row_len = null) begin exec sp_estspace @tablename,1,@rowlength=@row_len ' output update #sp_dir set row_len=@row_len where name=@tablename end set rowcount 0 */ if @orderby = '/N' begin create clustered index sp_dirind on #sp_dir (name,id) RozdziaB 18 Delphi na serwerze SQL Sybase 573 end else if @orderby = '/R' begin create clustered index sp_dirind on #sp_dir (row_count,id) end else if @orderby = '/S' begin create clustered index sp_dirind on #sp_dir (size,id) end else if @orderby = '/D' begin create clustered index sp_dirind on #sp_dir ' (date_created,id) end else if @orderby = '/DS' begin create clustered index sp_dirind on #sp_dir ' (data_space,id) end else if @orderby = '/IS' begin create clustered index sp_dirind on #sp_dir ' (index_space,id) end else if @orderby = '/US' begin create clustered index sp_dirind on #sp_dir ' (unused_space,id) end else if @orderby = '/O' begin create clustered index sp_dirind on #sp_dir (owner,id) end alter table #sp_dir drop sequencer alter table #sp_dir add sequencer numeric(10,0) identity insert into #sp_dir (name,row_count,size,data_space,index_space,unused_space,id, ' type,date_created)) 574 Cz[ III select 'TOTAL:',row_count=isnull(sum(row_count),0),size=isnull(sum ' (size),0),date_space=isnull(sum(data_space),0),index_space ' =isnull(sum(index_space),0),unused_space=isnull(sum( ' unused_space),0),id=0,type=@obtype,date_created=getdate() from #sp_dir select name,type,date_created, row_count, size, data_space, index_space, unused_space, owner from #sp_dir order by sequencer go IF OBJECT_ID('dbo.sp_dir') IS NOT NULL PRINT '<<< CREATED PROC dbo.sp_dir >>>' ELSE PRINT '<<< FAILED CREATING PROC dbo.sp_dir >>>' go sp_dir zwraca list obiektw wszystkich typw z danej bazy danych. Mo|e ona zosta posortowana wedBug dowolnej ze zwracanych kolumn. Wynik dziaBania procedury sp_dir zostaB przedstawiony na rysunku 18.1. Instrukcja USE na pocztku pliku okre[la baz danych, w ktrej procedura zostanie utworzona. Natomiast polecenie GO, koDczce wykonanie zadania wsadowego, separuje oddzielne cz[ci skryptu. Rysunek 18.1 Mo|na u|y procedury sp_dir do utworzenai listy obiektw na serwerze RozdziaB 18 Delphi na serwerze SQL Sybase 575 Uruchamianie procedur pamitanych Procedury pamitane SQL Server uruchamiamy instrukcj EXECUTE. SkBadnia instrukcji jest nastpujca: EXECUTE procedurename parameters Mo|emy skrci EXECUTE do EXEC, a nawet opu[ci, je[li EXEC jest pierwsz instrukcj w linii. Na przykBad, uruchomienie procedury listcustomer za pomoc ISQL mo|e wyglda nastpujco: listcustomers Dopuszczalne jest przekazanie parametrw wg. kolejno[ci, w jakiej wystpuj w definicji procedury: exec listcustomersbystate 'MO', '%' lub przez nazw parametru: exec listcustomersbystate @LastName Mask='%', @State='MO' Procedury systemowe Procedury systemowe s to specjalne procedury pamitane, ktrych nazwa rozpoczyna si od sp_ i wykonywane kontekstowo na bie|cej bazie danych. Np. sp_spaceused jest procedur systemow. Je[li wykonamy j wtedy, gdy jest aktywna baza pubs2, to otrzymamy informacj na temat pamici u|ywanej przez baz pubs2. Je[li wykonamy j dla bazy gBwnej (master database), otrzymamy dla niej analogiczn informacj. Procedury systemowe mog by umieszczone w bazie gBwnej (master database) albo w bazie procedur systemowych (sybsytemproc database) WSKAZWKA Je[li zamierzamy uruchomi procedur systemow dla bazy innej ni| bie|ca, wygodniej jest - zamiast zmiany kontekstu poleceniem USE - poprzedzi nazw procedury nazw bazy, dla ktrej chcemy j uruchomi. ZaB|my, |e chcemy wykona procedur systemow dla bazy gBwnej a pubs2 jest aktywna. Mo|na to zrobi nastpujco: master..sp_dir '%', 'S' Chocia| sp_dir jest umieszczona w bazie sybsystemprocs, lecz przy jej uruchomieniu kontekst bdzie chwilowo zmieniony na baz gBwn. Wynik dziaBania jest pokazany na rysunku 18.2. 576 Cz[ III Warto te| zwrci uwag na dwie kropki pomidzy nazw bazy danych a nazw procedury. Jest to standardowe w Sybase wywoBanie procedury pamitanej. Przyjmuje si wtedy domy[lnie, |e wBa[cicielem procedury (ktry powinien by tak|e wyspecyfikowany) jest dbo (database owner) Rysunek 18.2 Mo|na u|y uproszczonej metody wskazania bazy danych, dla ktrej chcemy uruchomi procedur pamitan Procedury zdarzeD (Triggers) Procedury zdarzeD s to (podobnie jak procedury pamitane) podprogramy SQL, uruchamiane wtedy, gdy dane z danej tabeli s wprowadzane, modyfikowane lub usuwane. Mo|na skojarzy procedur zdarzenia ze specyficzn operacj dokonywan na tabeli: wstawianiem wiersza, modyfikacj lub usuwaniem. Oto odpowiedni przykBad w Transact-SQL: CREATE TRIGGER SALEDelete ON CUSTOMER FOR DELETE AS BEGIN DELETE FROM SALE WHERE CustomerNumber=(SELECT CustomerNumber FROM deleted); END Ta procedura zdarzenia likwiduje transakcje danego klienta w tabeli SALE, gdy jego rekord jest usuwany z tabeli CUSTOMER (usuwanie kaskadowe).Operacja usuwania z tabeli uruchamia "kaskadowy" proces eliminacji odpowiednich danych w innych tabelach, poBczonych z ni za pomoc wsplnego klucza. RozdziaB 18 Delphi na serwerze SQL Sybase 577 Warto zwrci uwag na u|ycie logicznej tabeli DELETE. Zawsze, gdy uruchamiana jest procedura zdarzenia skojarzona zDELETE, to z wierszy przeznaczonych do usunicia tworzona jest tabela logiczna o nazwie deleted. W tej procedurze wykonywane jest najpierw podzapytanie do deleted, ktre pozwala okre[li najpierw warto[ CustomerNumber dla usuwanego rekordu. Nastpnie s usuwane te wiersze z tabeli SALE, majce tak warto[ CustomerNumber . Gdy zostan uruchomione procedury zwizane z INSERT albo UPDATE, to analogicznie serwer tworzy tabel logiczn o nazwie inserted. Istnieje ona tylko w pamici serwera, ale jest dostpna dla procedury zdarzenia, jak ka|da normalna tabela. Kursory (Cursors) Koncepcja kursorw jest wynikiem zastosowania zorientowanej na zbiory koncepcji SQL w odniesieniu do przetwarzania wierszowego. Pozwalaj one pracowa z jednym wierszem w danej chwili. Poniewa| ich tworzenie i obsBuga jest w BDE zautomatyzowana, wic w zasadzie nie ma potrzeby tworzenia wBasnych kursorw. Jednak niekiedy, w procedurach pamitanych, mog okaza si u|yteczne. S cztery podstawowe operacje wykonywane na kursorze: deklarowanie (ang. declare), otwarcie (ang. open), pobranie (ang. fetch), zamknicie (ang. close). Mo|na go te| wykorzysta do zmodyfikowania lub usunicia pojedynczego wiersza tabeli. Deklaracja kursora skBada si z instrukcji SELECT i (dla kursorw modyfikowalnych) z listy modyfikowalnych kolumn. Oto przykBad: DECLARE CUSTOMER_SELECT CURSOR FOR SELECT * FROM CUSTOMER Zanim uzyskamy dostp do wierszy przy u|yciu kursora, musi on by najpierw otwarty. Aby przygotowa zapytanie zapisane w definicji kursora, nale|y u|y instrukcji OPEN: OPEN CUSTOMER_SELECT Samo OPEN nie wprowadza jednak wierszy do aplikacji klienta. Niezbdna jest instrukcja FETCH: FETCH CUSTOMER_SELECT W ten sposb otrzymamy jeden wiersz ze zbioru wynikowego kursora. Ka|de nastpne FETCH pozwala uzyska nastpny wiersz w zbiorze. Sybase SQL Server 578 Cz[ III posiada tylko kursory jednokierunkowe. Aby przej[ do wierszy poprzednich nale|y zamkn (CLOSE) i ponownie otworzy (OPEN) kursor. UWAGA Mimo |e Sybase SQL Server nie obsBuguje kursorw dwukierunkowych, mo|na ich u|y w aplikacji stworzonej w Delphi. BDE emuluje bowiem dwukierunkowy kursor na poziomie programowym, bez wzgldu na to, czy serwer baz danych go obsBuguje. Dlatego w obiektach TDataSets, takich jak TQuery i TTable, mo|na przewija w obie strony. Wiersze zwracane przez modyfikowalny kursor mog by zmodyfikowane za pomoc specjalnych wersji instrukcji UPDATE i DELETE, jak np.: DECLARE CUSTOMER_UPDATE CURSOR FOR SELECT *FROM CUSTOMER FOR UPDATE OF LastName UWAGA Nale|y si upewni, czy na li[cie kolumn klauzuli FOR UPDATE OF umieszczono tylko te kolumny, ktre maj by rzeczywi[cie aktualizowane. Umieszczenie na tej li[cie innych pl niepotrzebnie wi|e zasoby serwera. Aby zmodyfikowa lub usun bie|cy wiersz modyfikowalnego kursora, nale|y posBu|y si wyra|eniem WHERE CURRENT OF cursorname, jak to pokazano w poni|szym przykBadzie: UPDATE CUSTOMER SET LastName="Cane" WHERE CURRENT OF CUSTOMER_UPDATE lub DELETE FROM CURSOR WHERE CURRENT OF CUSTOMER_UPDATE Gdy koDczymy prac z kursorem nale|y go zamkn (instrukcj CLOSE). Zamknicie kursora zwalnia wszystkie zasoby systemowe, ktrych u|ywaB. Oto przykBad: CLOSE CUSTOMER_UPDATE

Wyszukiwarka

Podobne podstrony:
19 rozdział 18 2i5rflcqd4jdzgndhtttgix24e7y6ityrcsocoq
Dom Nocy 09 Przeznaczona rozdział 18 19 TŁUMACZENIE OFICJALNE
P C and Kristin Cast Dom Nocy Ujawniona (Revealed) rozdział 18
rozdzial (18)
rozdzial 18
Rozdział 18 Rozwój społeczny i rozwój osobowości w okresie późnej dorosłości
Rozdział 18 Pechowi goście18 Pechowi goście18 Pechowi goś
Wings of the wicked rozdział 18
Pan Wolodyjowski Rozdzial 18
makro 19 rozdział
Rozdział 18
rozdzial (18)
rozdzial (18)

więcej podobnych podstron