514 s zorientowani: obiektowo języki zapytań
traktowano by jako równe, jeśli wyglądałyby tak samo po zdekodowaniu na ekranach o zbliżonej rozdzielczości, ale nie możemy więcej uwagi poświęcać temu zagadnieniu. Z instrukcji w wierszu 6) wiadomo, że operator < nie jest określony dla wartości typu Mpeg. Oznacza to. że jeśli A i B są wartościami tvpu Mpeg, to wyrażenie A < B jest niedopuszczalne.
□
Kod filmowy MPEG
Ponieważ filmy zajmują w pamięci wiele przestrzeni, więc zazwyczaj przechowuje się je w postaci kodowanej, przy czym istnieje wiele rożnych standardów kompresowania. Najbardziej popularny standard - MPEG -korzysta przy tworzeniu kodu z faktu, że bezpośrednio kolejne klatki filmowe są bardzo do siebie podobne. Zatem można klatki podzielić na obszary i obszar z jednej klatki traktować jako wskaźnik do obszaru z poprzedniej klatki. Obszar w' klatce poprzedniej może znajdować się w tym samym położeniu, jeśli jest to fragment tła, albo w innym (jeśli jest to fragment obiektu ruchomego).
Mimo że, stosując standard MPEG, uzyskuje się dużo lepsze wyniki niż przy zwykłych kompresjach tekstowych, to i lak po skompresowaniu godzinny film zajmuje około 1 gigabajta pamięci. A dodatkowo, ponieważ dopuszcza się niewielkie różnice w odpowiadających sobie obszarach, wice zarazem obraz traci na jakości. Proces dekompresji filmu jest także dość skomplikowany. Jednakże mimo tych kłopotów- standard MPEG stanowi niezły kompromis między jakością obrazu, objętością pliku oraz mocą obliczeniową potrzebną do przetwarzania.
Tuż za listą atrybutów' w deklaracji typu ADT można umieścić dowolną listę deklaracji funkcji. Postać deklaracji funkcji jest następująca:
FUNCTICN <nazwa> (<argumenty>) returns <typ>;
Każdy argument składa się z nazwy zmiennej oraz typu zmiennej. Argumenty oddziela się przecinkami.
Funkcje mogą być wewnętrzne oraz zewnętrzne. Funkcje zewnętrzne zapisuje się w języku podstawowym, a w definicji typu ADT umieszcza się tylko ich sygnaturę. Funkcje zewnętrzne zostaną omówione w p. 8.6.3. Funkcje wewnętrzne pisze się w rozszerzonym SQL. Poniżej przedstawiamy kilka możliwości rozszerzenia zarówno $QL2, jak i zapytań SQL3.
• jest stosow any jako operator przypisania.
• Zmienne lokalne funkcji deklaruje się, umieszczając po dwukropku nazwę i typ zmiennej.
• Operator kropka udostępnia wartości składowych struktur.
• Wyrażenia logiczne są takie same jak w klauzuli WHERE.
• Treść procedury stanowią instrukcje ujęte w nawiasy REGIN i END.
Wielkie obiekty binarne
Wartości typu BLOB mogą wyglądać dla użytkownika jak wielkie ciągi bitów', ale ich implementacja jest dużo bardziej skomplikowana niż implementacja tekstów o długości nie przekraczającej 255 bajtów. Nie ma na przykład sensu przechowywanie obszernych tekstów jako składowych krotek, ponieważ i tak trzeba je przechowywać poza bazą danych, najczęściej w systemie plików.
1 jeszcze inny przykład: w modelu klient-serwer, opisanym w p. 7.3.4, zakłada się, że krotki mają umiarkowane rozmiary i serwer przesyła do klienta w odpowiedzi całą krotkę. Ale w przypadku wartości typu BLOB nie ma sensu natychmiastowe przesłanie całej jednostki danych. Jeśli na przykład do serwera zostało skierowane polecenie przesłania filmu, to serwer może go przesyłać w niewielkich porcjach, po kilka sekund wyświetlania. Klient może wówczas od razu to wideo wyświetlać i nie musi pamiętać całego filmu lokalnie, ani czekać zanim zostanie przesłana całość filmu.
PRZYKŁAD 8.32
Powrócimy do przykładu 8.30, gdzie zdefiniowano adres ADT. Na rysunku 8.19 przedstawiono kilka funkcji, które można dołączyć za pomocą instrukcji tworzenia typu z rys. 8.17.
W wierszach od 1) do 6) zamieszczono definicję konstruktora obiektów typu adres ADT. Przypomnijmy, że w języku SQL istnieje zero argumentowy wbudowany konstruktor obiektów dla typów ADT, w tym przypadku jest to funkcja o nazwie AdresADT. Jednakże my chcemy, aby konstruktor miał dwa argumenty, których wartości określą miasto i ulicę w tworzonym adresie. Można te funkcje nazwać jakkolwiek, ale jest dopuszczalne, a nawet wskazane, utycie nazwy konstruktora tej samej co nazwa klasy.
Deklaracja nowego konstruktora została zamieszczona w wierszu 1). Korzysta się tu z dwóch argumentów 5 i c, które oznaczają odpowiednio ulicę oraz miasto. Są one oba napisami o długościach odpow iednio 50 i 20 znaków. Wartość funkcji ma typ AdresADT. W wierszu 2) deklaruje się zmienną lokalną a typu AdresADT.
Treść funkcji została zapisana w wierszach od 3) do 6). W wierszu 3) tworzy sic nowy obiekt typu AdresADT i staje się on wartością zmiennej :a. Nie da się pomylić konstruktora wbudowanego z konstruktorem bieżąco two-