120 likes | 206 Views
Architektury a techniky DS. Cvičení č. 7 RNDr. David Žák, Ph.D . Fakulta elektrotechniky a informatiky david.zak @ upce.cz. Cvičení č. 7 – zadání I. Cílem tohoto cvičení je práce s objektovými typy.
E N D
Architektury a techniky DS Cvičení č. 7 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatikydavid.zak@upce.cz
Cvičení č. 7 – zadání I • Cílem tohoto cvičení je práce s objektovými typy. • Pro práci využijte strukturu a obsah tabulky lide ve schématu a_clovek:Lide = (Id, jmeno, prijmeni, narozen, pohlaví, Id_otce, Id_matky) • Vytvořte si nový ADT clovek, který vychází z atributů tabulky lide, místo atributů Id_otce a Id_matky zaveďte atributy otec, matka typu ukazatel(kromě návodu v tomto dokumentu shlédněte např. http://www.fi.muni.cz/~xbatko/oracle/example.html) • K danému ADT clovek vytvořte metody vek a pocet_deti • Vytvořte si vlastní objektovou tabulku o_lide nad objektem clovek(před vytvořením čtěte poznámku na následující straně) • Vytvořenou tabulku naplňte hodnotami dle tabulky lide ve schématu a_clovek, řešte problematiku převedení Id_otce a Id_matky na ukazatele • Pomocí technik pro práci s objekty řešte tyto úkoly • zjistěte jména a příjmení všech vnoučat osoby s ID=7 • zjistěte jména a příjmení všech vlastních sourozenců osoby s ID=5 • Zjistěte seznam dětí mladších 18 let
Cvičení č. 7 – zadání II Vytvořte metodu pridej pro přidávání nových instancí objektu clovek do tabulky, Id je generováno automaticky. Vytvořte si metodu MAP pro porovnávání objektů, porovnávání bude založeno na počtu dětí a stáří (vyšší vítězí). Aplikujte řazení na předchozí dotazy. Předchozí dotaz na jména a příjmení všech vnoučat osoby s ID=7 řazený dle předchozího bodu upravte tak, že zobrazí pouze 2-4 řádek výsledku Poznámka: Přidání nové metody do definice (hlavičky) ADT vyžaduje zrušení všech vazeb, tj. i tabulky o_lide. Proto je vhodné již při vytvoření ADT clovek vytvořit současně i definici (hlavičky) metod vek, pocet_deti, pridej a metody MAP.
Objektová rozšíření v Oracle V současné době směřuje trend ve vývoji databázových systémů směrem k objektovým SŘBD, neboť objektové SŘBD umožňují snadněji a přesněji modelovat většinu z různých tříd aplikací. Proto se výrobci relačních SŘBD snaží své produkty rozšířit o některé základní vlastnosti objektových SŘBD, čímž vznikají tzv. objektově-relační SŘBD. Zmíněný trend se promítá i do posledního standardu SQL 3, jehož součástí jsou i abstraktní datové typy, persistentní programové moduly a vhnízděné tabulky. Jedním z objektově-relačních SŘBD je i systém Oracle (od verze 8), na kterém si nyní ukážeme některá objektová rozšíření relačního SŘBD.
Abstraktní datové typy Abstraktní datový typ lze nadefinovat příkazem CREATE TYPE. Tento uživatelem definovaný ADT lze pak použít všude, kde jsou používány standardní datové typy SQL. Následující příklad ukazuje definici typu t_adresa reprezentujícího adresu obyvatele. Ukázána je i definice tabulky, kde jedním z atributů je objekt typu t_adresa : CREATE TYPE t_adresa AS OBJECT ( ulice VARCHAR2(30), cislo NUMBER(3), obec VARCHAR2(30), psc NUMBER(5)); CREATE TABLE obyvatele ( prijmeni VARCHAR2(30), jmeno VARCHAR2(30), adresa t_adresa);
Abstraktní datové typy Práce s objekty v SQL je, až na malé výjimky, víceméně intuitivní. Vkládání záznamů ukazuje spodní příklad. Instance objektu třídy t_adresa je vytvořena voláním implicitního konstruktoru : INSERT INTO obyvatele (jmeno, prijmeni, adresa) VALUES ( 'Jan', 'Pavlasek', t_adresa('Na hrazi', 15, 'Liptakov', 32100) ); S objekty lze snadno manipulovat jako s ostatními datovými typy, lze je i porovnávat : SELECT prijmeni, adresa FROM obyvatele; SELECT prijmeni, jmeno FROM obyvatele WHERE adresa = t_adresa('Na hrazi', 15, 'Liptakov', 32100);
Abstraktní datové typy V případě, že chceme přistupovat k jednotlivým datovým prvkům objektu, musíme použít aliasy : SELECT o.jmeno AS jmeno, o.prijmeni AS prijmeni, o.adresa.obec AS obec, o.adresa.psc AS psc FROM obyvatele o; Obdobně provedeme i aktualizaci objektu : UPDATE obyvatele o SET o.adresa.ulice = 'Pod hrazi', o.adresa.cislo = 8 WHERE prijmeni = 'Pavlasek‚ AND jmeno = 'Jan'; Objekt lze zrušit takto : UPDATE obyvatele SET adresa = NULL WHERE prijmeni = 'Pavlasek‚ AND jmeno = 'Jan';
Metody objektů Samozřejmě, že objekty v SQL 3 mohou mít kromě datových prvků i metody. Následující ukázka slouží pro ilustraci definice objektu s několika metodami. Implementace metod je definována v příkazu CREATE TYPE BODY. Rozhraní objektu : CREATE OR REPLACE TYPE t_osoba AS OBJECT ( jmeno VARCHAR2(30), prijmeni VARCHAR2(30), naroz DATE, plat NUMBER(7,2), MEMBER FUNCTION vek RETURN INTEGER, MEMBER PROCEDURE zvys_plat(castka IN NUMBER), MEMBER PROCEDURE sniz_plat(castka IN NUMBER));
Implementace metod objektů CREATE OR REPLACE TYPE BODY t_osoba AS MEMBER FUNCTION vek RETURN INTEGER IS BEGIN RETURN TO_NUMBER(SYSDATE - naroz)/365; END; MEMBER PROCEDURE zvys_plat(castka IN NUMBER) IS BEGIN plat := plat + castka; END; MEMBER PROCEDURE sniz_plat(castka IN NUMBER) IS BEGIN IF (plat - castka < 0) THEN plat := 0; ELSE plat := plat - castka; END IF; END; END;
Implementace metod objektů Zajímavý příklad použití je například na: http://www.ms.mff.cuni.cz/~kopecky/vyuka/dbapl/dbi026_0607_11_ut.sql http://www.fi.muni.cz/~xbatko/oracle/example.html
Pole V praxi se často vyskytují případy, kdy je třeba uložit do jednoho atributu více hodnot. Typickým případem jsou alternativní čísla telefonu, na kterých je dosažitelná určitá osoba. Relační model dat nás nutí vytvořit novou entitu pro telefonní čísla, což se nám může zdát poněkud nepřirozené. V takovýchto případech lze s výhodou použít pole proměnné délky - VARRAY. Pole VARRAY může obsahovat různý počet položek stejného datového typu (tzn. i objekty), který nesmí překročit definovanou velikost pole. Způsob použití polí je ukázán v následujícím příkladě : CREATE TYPE t_tel_seznam AS VARRAY(5) OF VARCHAR2(30); CREATE TYPE t_potomek AS OBJECT ( jmeno VARCHAR2(30), vek NUMBER(3)); CREATE TYPE t_pot_seznam as VARRAY(10) OF t_potomek; CREATE TABLE personal ( jmeno VARCHAR2(30), prijmeni VARCHAR2(30), telefony t_tel_seznam, deti t_pot_seznam);
Pole Způsob vkládání a výběru záznamů se nemění : INSERT INTO personal (jmeno, prijmeni, telefony, deti) VALUES ( 'Jan', 'Kokoska', t_tel_seznam('123', '124', '125'), t_pot_seznam(t_potomek('Jirka', 10), t_potomek('Jakub', 16))); SELECT * FROM personal; K jednotlivým záznamům pole lze přistupovat tak, že pole "přetypujeme" na tabulku (un-nesting). Všimněte si, že následující dotazy implicitně provádí spojení bázové a vnořené tabulky reprezentované polem : SELECT p.prijmeni, d.jmeno, d.vek FROM personal p, TABLE(p.deti) d; SELECT p.prijmeni, COUNT(d.jmeno) AS pocet_deti FROM personal p, TABLE(p.deti) d GROUP BY p.prijmeni ORDER BY p.prijmeni;