Multimedialne bazy danych - laboratorium Oracle Multimedia (rozwiązania) Celem ćwiczenia jest zapoznanie się z obiektowymi typami danych Oracle dedykowanymi do obsługi multimediów. Autor ćwiczenia: Marek Wojciechowski 1. Utwórz w swoim schemacie tabelę SOUNDS jako tabelę obiektów typu ORDAudio. CREATE TABLE sounds OF ORDSYS.ORDAudio; Tabela została utworzona. 2. Wstaw do tabeli audio jeden obiekt dźwiękowy zapisany w pliku tada.wav w katalogu na serwerze udostępnionym jako obiekt directory o nazwie MBD_DIR. INSERT INTO sounds VALUES (ORDSYS.ORDAudio.init('file', 'MBD_DIR', 'tada.wav')); Zatwierdzanie zostało ukończone. 3. Napisz program w formie anonimowego bloku PLSQL, który: - odczyta obiekt dźwiękowy do zmiennej w programie identyfikując go poprzez nazwę źródłowego pliku - dokona importu danych binarnych do bazy danych - wyznaczy metadane o dźwięku zapisując je w atrybutach obiektu - dla kontroli poprawności ekstrakcji metadanych wyświetli na konsoli liczbę kanałów - zapisze zmodyfikowany obiekt w bazie danych zastępując dotychczasową jego postać. au ORDSYS.ORDAudio; ctx RAW(4000) := NULL; SELECT value(d) INTO au FROM sounds d WHERE d.getsourcename() = 'tada.wav' FOR UPDATE; au.import(ctx); au.setproperties(ctx,false); -- bez adnotacji w XML DBMS_OUTPUT.put_line('numberOfChannels: ' TO_CHAR(au.getNumberOfChannels())); UPDATE sounds d SET value(d) = au WHERE d.getsourcename() = 'tada.wav'; numberofchannels: 2 Procedura PLSQL została zakończona pomyślnie.
4. Napisz zapytanie SQL odczytujące z tabeli SOUNDS nazwę źródłowego pliku, jego format, częstotliwość próbkowania oraz czas trwania dźwięku. select s.getsourcename() "FILE", s.getformat() FORMAT, s.getsamplingrate() SAMPLING_RATE, s.getaudioduration() DURATION from sounds s; FILE FORMAT SAMPLING_RATE DURATION --------------- --------------- ------------- -------- tada.wav WAVE 22050 5. Utwórz w swoim schemacie tabelę PHOTOS o poniższej strukturze: ID NUMBER(12) PRIMARY KEY PICTURE ORDIMAGE THUMBNAIL ORDIMAGE CREATE TABLE photos ( ID NUMBER(12) PRIMARY KEY, PICTURE ORDIMAGE, THUMBNAIL ORDIMAGE ) Tabela została utworzona. 6. Wstaw do tabeli PHOTOS dwa obrazy zawarte w plikach szklarka.jpg i kebab.jpg dostępne poprzez obiekt directory o nazwie MBD_DIR. Jako miniatury wstaw zainicjalizowane puste obiekty ORDImage. INSERT INTO photos (id, picture, thumbnail) VALUES (1, ORDImage.init('FILE','MBD_DIR','szklarka.jpg'), ORDImage.init()); INSERT INTO photos (id, picture, thumbnail) VALUES (2, ORDImage.init('FILE','MBD_DIR','kebab.jpg'), ORDImage.init()); COMMIT; Zatwierdzanie zostało ukończone.
7. Napisz program w formie anonimowego bloku PLSQL, który dla wszystkich obrazów z tabeli PHOTOS: - wyznaczy podstawowe metadane o formacie obrazu zapisując je w atrybutach obiektu; - utworzy miniaturę obrazu o rozmiarze 32 x 32 piksele zapisując ją w odczytanym, dotychczas pustym obiekcie miniatury (wykorzystując metodę processcopy); - zmieni format miniatury na GIF (wykorzystując metodę process); - zapisze zmodyfikowany obraz i jego miniaturę w bazie danych zastępując dotychczasowe ich postaci. CURSOR p_photos IS SELECT * FROM photos FOR UPDATE; FOR p IN p_photos LOOP p.picture.setproperties(); p.picture.processcopy('fixedscale=32 32', p.thumbnail); p.thumbnail.process('fileformat=giff'); UPDATE photos SET picture = p.picture, thumbnail = p.thumbnail WHERE CURRENT OF p_photos; Procedura PLSQL została zakończona pomyślnie. 8. Napisz zapytanie SQL odczytujące z tabeli PHOTOS wysokości i szerokości w pikselach oryginalnych fotografii i ich miniatur. SELECT p.picture.getwidth() WIDTH, p.picture.getheight() HEIGHT, p.thumbnail.getwidth() THUMB_WIDTH, p.thumbnail.getheight() THUMB_HEIGHT FROM photos p WIDTH HEIGHT THUMB_WIDTH THUMB_HEIGHT ---------- ---------- ----------- ------------ 3072 2304 32 32 3072 2304 32 32
9. Napisz program w formie anonimowego bloku PLSQL, który dla obrazu szklarka.jpg sprawdzi czy zawiera on zagnieżdżone metadane w formacie EXIF (wyświetl na konsoli nazwy wszystkich dostępnych dla obrazu formatów zagnieżdżonych metadanych). image ORDSYS.ORDImage; metad XMLSequenceType; SELECT picture INTO image FROM photos p WHERE p.picture.getsourcename()='szklarka.jpg'; metad := image.getmetadata('all'); -- print the namespace of each metadata document FOR i in 1..metad.count LOOP DBMS_OUTPUT.PUT_LINE(metad(i).getNamespace() ); EXCEPTION WHEN ORDSYS.ORDImageExceptions.NULL_LOCAL_DATA THEN DBMS_OUTPUT.PUT_LINE('source local data is null'); WHEN ORDSYS.ORDImageExceptions.NULL_SOURCE THEN DBMS_OUTPUT.PUT_LINE('source is null'); http:xmlns.oracle.comordmetaordimage http:xmlns.oracle.comordmetaexif Procedura PLSQL została zakończona pomyślnie. 10. Napisz program (anonimowy blok kodu PLSQL) zliczający ile zdjęć zostało wykonanych z użyciem lampy błyskowej. CURSOR p_photos IS SELECT picture FROM photos FOR UPDATE; counter INTEGER := 0; md XMLSequenceType := NULL; FOR p IN p_photos LOOP md := p.picture.getmetadata('exif'); IF md(1).extract('flashfiredtext()').getstringval() = 'Yes' THEN counter := counter + 1; END IF; DBMS_OUTPUT.PUT_LINE('Photos with flash: ' counter); Photos with flash: 1 Procedura PLSQL została zakończona pomyślnie.
11. Sprawdź zapytaniem SQL do tabeli PHOTOS, ile zdjęć zostało wykonanych z użyciem lampy błyskowej. SELECT id, exif.extract('flashfiredtext()') FLASH FROM photos p, TABLE (p.picture.getmetadata('exif')) exif; SELECT count(1) FLASH_COUNT FROM photos p, TABLE (p.picture.getmetadata('exif')) exif where exif.extract('flashfiredtext()').getstringval() = 'Yes'; FLASH_COUNT ----------- 1