architektury a techniky ds

12
Architektury a Architektury a techniky DS techniky DS Cvičení č. 7 Cvičení č. 7 RNDr. David Žák, Ph.D. RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky Fakulta elektrotechniky a informatiky [email protected] [email protected]

Upload: noah-lowe

Post on 30-Dec-2015

24 views

Category:

Documents


0 download

DESCRIPTION

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. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Architektury a techniky DS

Architektury a techniky DSArchitektury a techniky DS

Cvičení č. 7Cvičení č. 7

RNDr. David Žák, Ph.D.RNDr. David Žák, Ph.D.Fakulta elektrotechniky a informatikyFakulta elektrotechniky a informatiky

[email protected]@upce.cz

Page 2: Architektury a techniky DS

Cvičení č. 7 – zadání ICvičení č. 7 – zadání ICílem tohoto cvičení je práce s objektovými typy.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 Pro práci využijte strukturu a obsah tabulky lide ve schématu

a_clovek:a_clovek:Lide = (Id, jmeno, prijmeni, narozen, pohlaví, Id_otce, Id_matky)Lide = (Id, jmeno, prijmeni, narozen, pohlaví, Id_otce, Id_matky)

1.1. Vytvořte si nový ADT clovek, který vychází z atributů tabulky 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, lide, místo atributů Id_otce a Id_matky zaveďte atributy otec, matka typu ukazatelmatka typu ukazatel(kromě návodu v tomto dokumentu shlédněte např. (kromě návodu v tomto dokumentu shlédněte např. http://www.fi.muni.cz/~xbatko/oracle/example.html)http://www.fi.muni.cz/~xbatko/oracle/example.html)

2.2. K danému ADT clovek vytvořte metody K danému ADT clovek vytvořte metody vekvek a a pocet_detipocet_deti3.3. Vytvořte si vlastní objektovou tabulku o_lide nad objektem Vytvořte si vlastní objektovou tabulku o_lide nad objektem

clovekclovek(před vytvořením čtěte poznámku na následující straně)(před vytvořením čtěte poznámku na následující straně)

4.4. Vytvořenou tabulku naplňte hodnotami dle tabulky lide ve Vytvořenou tabulku naplňte hodnotami dle tabulky lide ve schématu a_clovek, řešte problematiku převedení Id_otce a schématu a_clovek, řešte problematiku převedení Id_otce a Id_matky na ukazateleId_matky na ukazatele

5.5. Pomocí technik pro práci s objekty řešte tyto úkolyPomocí 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 vnoučat osoby s ID=7 • zjistěte jména a příjmení všech vlastních sourozenců osoby s zjistěte jména a příjmení všech vlastních sourozenců osoby s

ID=5ID=5• Zjistěte seznam dětí mladších 18 letZjistěte seznam dětí mladších 18 let

Page 3: Architektury a techniky DS

Cvičení č. 7 – zadání IICvičení č. 7 – zadání II6.6. Vytvořte metodu Vytvořte metodu pridejpridej pro přidávání nových instancí objektu pro přidávání nových instancí objektu

clovek do tabulky, Id je generováno automaticky.clovek do tabulky, Id je generováno automaticky.7.7. Vytvořte si Vytvořte si metodu MAP metodu MAP pro porovnávání objektů, porovnávání pro porovnávání objektů, porovnávání

bude založeno na počtu dětí a stáří (vyšší vítězí). Aplikujte řazení bude založeno na počtu dětí a stáří (vyšší vítězí). Aplikujte řazení na předchozí dotazy.na předchozí dotazy.

8.8. Předchozí dotaz na jména a příjmení všech vnoučat osoby s ID=7 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 řazený dle předchozího bodu upravte tak, že zobrazí pouze 2-4 řádek výsledkuřádek výsledku

Poznámka:Poznámka:Přidání nové metody do definice (hlavičky) ADT vyžaduje zrušení 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í 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, ADT clovek vytvořit současně i definici (hlavičky) metod vek, pocet_deti, pridej a metody MAP. pocet_deti, pridej a metody MAP.

Page 4: Architektury a techniky DS

Objektová rozšíření v OracleObjektová rozšíření v Oracle

V současné době směřuje trend ve vývoji databázových systémů směrem k 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 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í. 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í 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. vlastnosti objektových SŘBD, čímž vznikají tzv. objektově-relačníobjektově-relační SŘBD. SŘBD.

Zmíněný trend se promítá i do posledního standardu Zmíněný trend se promítá i do posledního standardu SQL 3SQL 3, jehož součástí , jehož součástí jsou i abstraktní datové typy, persistentní programové moduly a vhnízděné 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), 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. na kterém si nyní ukážeme některá objektová rozšíření relačního SŘBD.

Page 5: Architektury a techniky DS

Abstraktní datové typyAbstraktní datové typy

Abstraktní datový typ lze nadefinovat příkazem CREATE TYPE. Tento uživatelem 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 definovaný ADT lze pak použít všude, kde jsou používány standardní datové typy SQL.SQL.

Následující příklad ukazuje definici typu t_adresa reprezentujícího adresu obyvatele. 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 :Ukázána je i definice tabulky, kde jedním z atributů je objekt typu t_adresa :

CREATE TYPE t_adresa AS OBJECT CREATE TYPE t_adresa AS OBJECT ((

ulice VARCHAR2(30),ulice VARCHAR2(30),

cislo NUMBER(3),cislo NUMBER(3),

obec VARCHAR2(30),obec VARCHAR2(30),

psc NUMBER(5));psc NUMBER(5));

CREATE TABLE obyvatele (CREATE TABLE obyvatele (

prijmeni VARCHAR2(30),prijmeni VARCHAR2(30),

jmeno VARCHAR2(30),jmeno VARCHAR2(30),

adresa t_adresaadresa t_adresa););

Page 6: Architektury a techniky DS

Abstraktní datové typyAbstraktní datové typy

Práce s objekty v SQL je, až na malé výjimky, víceméně intuitivní. Vkládání 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. záznamů ukazuje spodní příklad.

Instance objektu třídy t_adresa je vytvořena voláním implicitního konstruktoru :Instance objektu třídy t_adresa je vytvořena voláním implicitního konstruktoru :

INSERT INTO obyvatele (jmeno, prijmeni, INSERT INTO obyvatele (jmeno, prijmeni, adresaadresa))

VALUES ( 'Jan', 'Pavlasek', VALUES ( 'Jan', 'Pavlasek', t_adresa(t_adresa('Na hrazi', 15, 'Liptakov', 32100'Na hrazi', 15, 'Liptakov', 32100) ) ); );

S objekty lze snadno manipulovat jako s ostatními datovými typy, lze je i S objekty lze snadno manipulovat jako s ostatními datovými typy, lze je i porovnávat :porovnávat :

SELECT prijmeni, SELECT prijmeni, adresaadresa FROM obyvatele; FROM obyvatele;

SELECT prijmeni, jmenoSELECT prijmeni, jmeno

FROM obyvateleFROM obyvatele

WHERE adresa = WHERE adresa = t_adresa(t_adresa('Na hrazi', 15, 'Liptakov', 32100'Na hrazi', 15, 'Liptakov', 32100)); ;

Page 7: Architektury a techniky DS

Abstraktní datové typyAbstraktní datové typy

V případě, že chceme přistupovat k jednotlivým datovým prvkům objektu, V případě, že chceme přistupovat k jednotlivým datovým prvkům objektu, musíme použít aliasy :musíme použít aliasy :

SELECT o.jmeno AS jmeno, o.prijmeni AS prijmeni,SELECT o.jmeno AS jmeno, o.prijmeni AS prijmeni,

o.adresa.obec AS obec, o.adresa.psc AS psco.adresa.obec AS obec, o.adresa.psc AS psc

FROM obyvatele o;FROM obyvatele o;

Obdobně provedeme i aktualizaci objektu :Obdobně provedeme i aktualizaci objektu :

UPDATE obyvatele o SET o.adresa.ulice = 'Pod hrazi',UPDATE obyvatele o SET o.adresa.ulice = 'Pod hrazi',

o.adresa.cislo = 8o.adresa.cislo = 8

WHERE prijmeni = 'Pavlasek‚ AND jmeno = 'Jan';WHERE prijmeni = 'Pavlasek‚ AND jmeno = 'Jan';

Objekt lze zrušit takto :Objekt lze zrušit takto :

UPDATE obyvatele SET adresa = NULLUPDATE obyvatele SET adresa = NULL

WHERE prijmeni = 'Pavlasek‚ AND jmeno = 'Jan'; WHERE prijmeni = 'Pavlasek‚ AND jmeno = 'Jan';

Page 8: Architektury a techniky DS

Metody objektůMetody objektů

Samozřejmě, že objekty v SQL 3 mohou mít kromě datových prvků i metody. 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. Následující ukázka slouží pro ilustraci definice objektu s několika metodami. Implementace metod je definována v příkazu Implementace metod je definována v příkazu CREATE TYPE BODYCREATE TYPE BODY..

Rozhraní objektu :Rozhraní objektu :

CREATE OR REPLACE TYPE t_osoba AS OBJECT ( CREATE OR REPLACE TYPE t_osoba AS OBJECT (

jmeno VARCHAR2(30),jmeno VARCHAR2(30),

prijmeni VARCHAR2(30),prijmeni VARCHAR2(30),

naroz DATE,naroz DATE,

plat NUMBER(7,2),plat NUMBER(7,2),

MEMBER FUNCTION vek RETURN INTEGER,MEMBER FUNCTION vek RETURN INTEGER,

MEMBER PROCEDURE zvys_plat(castka IN NUMBER),MEMBER PROCEDURE zvys_plat(castka IN NUMBER),

MEMBER PROCEDURE sniz_plat(castka IN NUMBER));MEMBER PROCEDURE sniz_plat(castka IN NUMBER));

Page 9: Architektury a techniky DS

Implementace metod Implementace metod objektůobjektů

CREATE OR REPLACE TYPE BODY t_osoba ASCREATE OR REPLACE TYPE BODY t_osoba AS

MEMBER FUNCTION vek RETURN INTEGER ISMEMBER FUNCTION vek RETURN INTEGER IS

BEGINBEGIN

RETURN TO_NUMBER(SYSDATE - naroz)/365;RETURN TO_NUMBER(SYSDATE - naroz)/365;

END;END;

MEMBER PROCEDURE zvys_plat(castka IN NUMBER) ISMEMBER PROCEDURE zvys_plat(castka IN NUMBER) IS

BEGINBEGIN

plat := plat + castka;plat := plat + castka;

END;END;

MEMBER PROCEDURE sniz_plat(castka IN NUMBER) ISMEMBER PROCEDURE sniz_plat(castka IN NUMBER) IS

BEGINBEGIN

IF (plat - castka < 0) THENIF (plat - castka < 0) THEN

plat := 0;plat := 0;

ELSEELSE

plat := plat - castka;plat := plat - castka;

END IF;END IF;

END;END;

END;END;

Page 10: Architektury a techniky DS

Implementace metod Implementace metod objektůobjektů

Zajímavý příklad použití je například na:Zajímavý příklad použití je například na:

http://www.ms.mff.cuni.cz/~kopecky/vyuka/dbapl/dbi026_0607_11_ut.sqlhttp://www.ms.mff.cuni.cz/~kopecky/vyuka/dbapl/dbi026_0607_11_ut.sql

http://www.fi.muni.cz/~xbatko/oracle/example.htmlhttp://www.fi.muni.cz/~xbatko/oracle/example.html

Page 11: Architektury a techniky DS

PolePoleV praxi se často vyskytují případy, kdy je třeba uložit do jednoho atributu více hodnot. 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. 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 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é. poněkud nepřirozené.

V takovýchto případech lze s výhodou použít pole proměnné délky - VARRAY. Pole VARRAY 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í 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ě :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_tel_seznam AS VARRAY(5) OF VARCHAR2(30);

CREATE TYPE t_potomek AS OBJECT (CREATE TYPE t_potomek AS OBJECT (

jmeno VARCHAR2(30),jmeno VARCHAR2(30),

vek NUMBER(3));vek NUMBER(3));

CREATE TYPE t_pot_seznam as VARRAY(10) OF t_potomek;CREATE TYPE t_pot_seznam as VARRAY(10) OF t_potomek;

CREATE TABLE personal (CREATE TABLE personal (

jmeno VARCHAR2(30),jmeno VARCHAR2(30),

prijmeni VARCHAR2(30),prijmeni VARCHAR2(30),

telefony t_tel_seznam,telefony t_tel_seznam,

deti t_pot_seznam); deti t_pot_seznam);

Page 12: Architektury a techniky DS

PolePoleZpůsob vkládání a výběru záznamů se nemění :Způsob vkládání a výběru záznamů se nemění :

INSERT INTO personal (jmeno, prijmeni, telefony, deti)INSERT INTO personal (jmeno, prijmeni, telefony, deti)

VALUES ( 'Jan', 'Kokoska',VALUES ( 'Jan', 'Kokoska',

t_tel_seznam('123', '124', '125'),t_tel_seznam('123', '124', '125'),

t_pot_seznam(t_potomek('Jirka', 10), t_potomek('Jakub', 16)));t_pot_seznam(t_potomek('Jirka', 10), t_potomek('Jakub', 16)));

SELECT * FROM personal; SELECT * FROM personal;

K jednotlivým záznamům pole lze přistupovat tak, že pole "přetypujeme" na tabulku (un-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 nesting). Všimněte si, že následující dotazy implicitně provádí spojení bázové a vnořené tabulky reprezentované polem :vnořené tabulky reprezentované polem :

SELECT p.prijmeni, d.jmeno, d.vekSELECT p.prijmeni, d.jmeno, d.vek

FROM personal p, TABLE(p.deti) d;FROM personal p, TABLE(p.deti) d;

SELECT p.prijmeni, COUNT(d.jmeno) AS pocet_detiSELECT p.prijmeni, COUNT(d.jmeno) AS pocet_deti

FROM personal p, TABLE(p.deti) dFROM personal p, TABLE(p.deti) d

GROUP BY p.prijmeniGROUP BY p.prijmeni

ORDER BY p.prijmeni;ORDER BY p.prijmeni;