Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Databázové Aplikace Slidy k přednášce DBI026 KSI MFF UK
Verze
2
DBI026 -DB Aplikace - MFF UK
Literatura Manuálové stránky Oracle 11g Dostupné odkudkoli Dostupné z domény .mff.cuni.cz DBI026 -DB Aplikace - MFF UK
3
DBI026 -DB Aplikace - MFF UK
Literatura, pokrač. Manuálové stránky MS SQL Server 2008 R2 Dostupné odkudkoli en-us/library/bb418470%28v=sql.10%29.aspx en-us/library/ms166026%28v=sql.90%29.aspx en-US/library/ms189826%28v=sql.90%29.aspx DBI026 -DB Aplikace - MFF UK
4
DBI026 -DB Aplikace - MFF UK
Literatura, pokrač. D. Quass, J. Widom. R. Goldman, K. Haas, Q. Luo, J. McHugh, S. Nestorov, A. Rajaraman, H. Rivero, S. Abiteboul, J. Ullman, and J. Wiener: LORE: A Lightweight Object REpository for Semistructured Data, Roy Goldman, Jennifer Widom: DataGuides: Enabling Query Formulation and Optimalization in Semistructured Databases, DBI026 -DB Aplikace - MFF UK
5
DBI026 -DB Aplikace - MFF UK
Přednáška č. 1 O čem to bude? Předpoklady Databázové systémy Základy SQL SELECT příkazy Návrh schémat Normální formy Vlastnosti transakcí, serializovatelnost, Co se dozvím Praktický návrh aplikací Na co si dát pozor Při vytváření relačních schémat Při psaní SQL příkazů Optimalizace odezvy Indexy Plány provádění Ve víceuživatelském provozu Zamykání Transakční zpracování Zabezpečení dat DBI026 -DB Aplikace - MFF UK
6
DBI026 -DB Aplikace - MFF UK
Co zde bude Relační model dosud nejrozšířenější a nejpoužívanější Optimalizace dotazů volba indexů a vhodné formulace dotazu může ovlivnit výsledný čas provádění dotazu i o několik řádů Víceuživatelský provoz nevhodně navržená aplikace může způsobovat nekorektní průběh datových manipulací a neočekávané výsledky DBI026 -DB Aplikace - MFF UK
7
DBI026 -DB Aplikace - MFF UK
Co zde bude, pokrač. Procedurální rozšíření Triggery pro hlídání korektnosti aktualizací Uložené procedury a funkce Objektové rozšíření Uživatelské datové typy Hnízděné tabulky … DBI026 -DB Aplikace - MFF UK
8
DBI026 -DB Aplikace - MFF UK
Na čem se cvičí? DB systém Oracle 11g R2 (cvič. Kopecký) Objektově relační databáze Podpora provádění kódu v jazycích PL/SQL Java C/C++ (obecně jakákoli .dll/.so knihovna) Podpora XML, multimédií a dalších rysů DB MS SQL 2008 R2 (cvič. Kopecký) Objektově relační databáze Podpora provádění kódu v jazycích T-SQL C# (obecně jakákoli .dll/.so knihovna) Podpora XML DBI026 -DB Aplikace - MFF UK
9
Problémy ANSI/ISO norem SQL s jejich (ne)dodržováním
SQL-92 ANSI/SQL2;ISO/IEC 9075:1992 Transitional, Intermediate, Full SQL-99 ANSI/ISO/IEC 9075:1999 SQL-2003 ISO/IEC 9075:2003 78 99 92 DBI026 -DB Aplikace - MFF UK
10
Problémy ANSI/ISO norem SQL s jejich (ne)dodržováním
Jednotlivé databázové servery ne vždy dodržují ANSI normu Obvykle pouze SQL-92 Entry Řada nepřenositelných rozšíření navíc Ne všechny rysy implementovány dle ANSI S novými verzemi se kompatibilita zlepšuje Často nyní existují obě syntaxe zároveň Běžný SQL-92 kompatibilní server 78 92 99 DBI026 -DB Aplikace - MFF UK
11
Problémy ANSI/ISO norem SQL s jejich (ne)dodržováním
Čím více se při vývoji aplikace využijí rysy vyšší než SQL-92 Entry Tím menší je šance, že aplikace bude provozuschopná i na jiné databázi Části vyšších verzí jsou často řešeny pouze proprietárně a nepřenositelně Před začátkem vývoje je proto obvykle nutné zvolit cílovou platformu Její změna v prostředku vývoje nebo po nasazení aplikace je velmi drahá Běžný SQL-92 kompatibilní server 78 92 99 DBI026 -DB Aplikace - MFF UK
12
Problémy ANSI/ISO norem SQL s jejich (ne)dodržováním
Co v případě, že server nechce SQL příkaz přijmout? Je příkaz nekorektní, nebo server normu nepodporuje? Validátory SQL DBI026 -DB Aplikace - MFF UK
13
SELECT příkaz Vestavěné funkce a operátory
Úvod do SQL SELECT příkaz Vestavěné funkce a operátory
14
DBI026 -DB Aplikace - MFF UK
SELECT příkaz SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] DBI026 -DB Aplikace - MFF UK
15
SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu)
SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Nejprve se zkombinují data ze všech zdrojů (tabulek, pohledů, poddotazů) Pokud jsou odděleny čárkami, provede se kartézský součin ANSI SQL-92 zavádí spojení JOIN ON, NATURAL JOIN, OUTER JOIN, … DBI026 -DB Aplikace - MFF UK
16
SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu)
SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Vyřadí se vzniklé řádky, které nevyhovují podmínce DBI026 -DB Aplikace - MFF UK
17
SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu)
SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Zbylé řádky se seskupí do skupin se stejnými hodnotami uvedených výrazů Každá skupina obsahuje atomické sloupce s hodnotami uvedených výrazů a množinové sloupce se skupinami ostatních hodnot sloupců DBI026 -DB Aplikace - MFF UK
18
SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu)
SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Vyřadí se skupiny, nevyhovující podmínce DBI026 -DB Aplikace - MFF UK
19
SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu)
SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Výsledky se setřídí podle požadavků DBI026 -DB Aplikace - MFF UK
20
SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu)
SELECT [DISTINCT] výraz [[AS] alias] [, …] FROM zdroj1 t_alias1 [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Vygeneruje se výstup s požadovanými hodnotami V případě DISTINCT se vyřadí duplicity DBI026 -DB Aplikace - MFF UK
21
Co hlídat při psaní SELECT příkazu
Klauzule GROUP BY setřídí před vytvořením skupin všechny řádky dle výrazů v klauzuli, v lepším případě nejdříve řádky podle hash hodnoty výrazů rozdělí do menších přihrádek Seskupovat by se měl co nejmenší možný počet řádek Pokud je možné řádky odfiltrovat pomocí WHERE, je výsledek efektivnější, než následné odstraňování celých skupin DBI026 -DB Aplikace - MFF UK
22
Co hlídat při psaní SELECT příkazu
SELECT Ulice, COUNT(*) FROM Obyvatel WHERE Mesto='Brno' GROUP BY Mesto, Ulice; Setřídí se jen 370 tis. záznamů obyvatel Brna SELECT Ulice, COUNT(*) FROM Obyvatel GROUP BY Mesto, Ulice HAVING Mesto='Brno'; Všech 10mil. záznamů se setřídí (zahešuje), ponechají se jen skupiny z Brna DBI026 -DB Aplikace - MFF UK
23
Co hlídat při psaní SELECT příkazu
Klauzule DISTINCT třídí (hešuje a třídí) výsledné záznamy (před operací ORDER BY), aby našla duplicitní záznamy Pokud to jde, je vhodné se bez DISTINCT obejít Klauzule ORDER BY by měla být použita, jen v nutných případech Není příliš vhodné ji používat v definicích pohledů, nad kterými se dále dělají další dotazy DBI026 -DB Aplikace - MFF UK
24
Přehled software pro cvičení
25
DBI026 -DB Aplikace - MFF UK
MFF tirpitz.ms.mff… Linux Server tirpitz.ms.mff.cuni.cz Databáze jedenact (11.2.0) Klienti Linux (11.2.0) Java Klient: SQL*Developer Laboratoř S{U|W}{1|2} jedenact TCP/IP S{U|W}{1|2} u-pl*.ms.mff… DBI026 -DB Aplikace - MFF UK
26
DBI026 -DB Aplikace - MFF UK
MS MFF dobrman.ms.mff… Laboratoř S{U|W}{1|2} Microsoft Management Studio 2012 MS SQL Server 2008 R2 NDBI026 TCP/IP S{U|W}{1|2} u-pl*.ms.mff… DBI026 -DB Aplikace - MFF UK
27
Vytváření tabulek a pohledů Integritní omezení Aktualizace dat
Relační model SQL Vytváření tabulek a pohledů Integritní omezení Aktualizace dat
28
DBI026 -DB Aplikace - MFF UK
Vytváření tabulek CREATE TABLE jm_tab ( jm_sloupce typ [(velikost)] [omezení], …, omezení_řádky, … ); CREATE TABLE Osoba ( rc character(11) CONSTRAINT Osoba_PK PRIMARY KEY, jmeno character(50) NOT NULL ); DBI026 -DB Aplikace - MFF UK
29
Reprezentace textových dat
SQL-92 rozlišuje dvoje kódování znaků Důvodem je podpora UTF-8 (UTF-16) Možnost ukládání znaků libovolného jazyka Neefektivní vícebajtová reprezentace znaků pro znaky národních abeced Globální znaková sada, UTF (ne nutně) Národní znaková sada pro texty v jednom konkrétním jazyce - českém, slovenském, … CP-1250, ISO , … DBI026 -DB Aplikace - MFF UK
30
Reprezentace textových dat
SQL-92 dále rozlišuje dvojí reprezentaci řetězců Pevná délka, zprava doplněno mezerami Snadnější aktualizace dat Méně efektivní reprezentace Proměnná délka, ukládají se použité znaky plus délka řetězce Efektivnější reprezentace Komplikovanější aktualizace, nová hodnota může zabrat jiný počet bajtů DBI026 -DB Aplikace - MFF UK
31
Datové typy dle ANSI SQL-92 1) Textové
CHARACTER(n) text v pevné délce n znaků CHARACTER VARYING(n) CHAR VARYING(n) text v proměnné délce max. n znaků NATIONAL CHARACTER(n) text v pevné délce n znaků v národní abecedě NATIONAL CHARACTER VARYING(n) NATIONAL CHAR VARYING(n) NCHAR VARYING(n) text v proměnné délce max. n znaků v národní abecedě DBI026 -DB Aplikace - MFF UK
32
Datové typy dle ANSI SQL-92 1) Textové
Konstanty se uzavírají do apostrofů Apostrof se v konstantách zdvojuje DBI026 -DB Aplikace - MFF UK
33
Datové typy dle ANSI SQL-92 2) Číselné
NUMERIC(p[,s]) obecný číselný typ na p platných míst, s cifer za desetinnou čárkou INTEGER, INT, SMALLINT celé číslo FLOAT(b) reálné číslo v b-bitové přesnosti reprezentace REAL reálné číslo DOUBLE PRECISION reálné číslo ve dvojnásobné přesnosti DBI026 -DB Aplikace - MFF UK
34
Datové typy dle ANSI SQL-92 3) Datumové
DATE datum (YYYY-MM-DD ) s přesností na dny TIME čas (HH:MM.SS.MMMM) s přesností minimálně na sekundy TIMESTAMP datum plus čas (YYYY-MM-DD HH:MM.SS.MMMM) TIME[STAMP](p) WITH TIMEZONE p udává přesnost sekund, čásová zóna se udává na konci ve tvaru +HH:MM, resp. –HH:MM DBI026 -DB Aplikace - MFF UK
35
Datové typy dle ANSI SQL-92 3) Datumové
Konstanty se uzavírají do apostrofů v uvedeném formátu DBI026 -DB Aplikace - MFF UK
36
Datové typy dle ANSI SQL-92 vs. reálná DB
Databázové servery Ne vždy podporují všechny uvedené typy Nemusí tyto typy podporovat nativně, pouze si „přeloží“ název typu na podobný nativně podporovaný typ DBI026 -DB Aplikace - MFF UK
37
Datové typy dle ANSI SQL-92 vs. Oracle SQL
CHARACTER(n) CHARACTER VARYING(n) CHAR VARYING(n) NATIONAL CHARACTER(n) NATIONAL CHARACTER VARYING(n) NATIONAL CHAR VARYING(n) NCHAR VARYING(n) NUMERIC(p,s) INTEGER, INT, SMALLINT FLOAT(b) DOUBLE PRECISION REAL CHAR(n) VARCHAR2(n) VARCHAR2(n) NCHAR(n) NVARCHAR2(n) NVARCHAR2(n) NVARCHAR2(n) NUMBER(p,s) NUMBER(38) NUMBER NUMBER NUMBER DBI026 -DB Aplikace - MFF UK
38
Datové typy dle ANSI SQL-92 vs. Oracle SQL
DATE Přesnost ukládání na sekundy, tj. splňuje požadavky SQL-92 na TIMESTAMP Základní (americký) formát DD-MON-YY např. 01-JAN-2006 VARCHAR2(velikost), //doporučeno VARCHAR(velikost) Řetězec s proměnlivou délkou velikost max znaků (dop. max znaků) DBI026 -DB Aplikace - MFF UK
39
DBI026 -DB Aplikace - MFF UK
Integritní omezení [CONSTRAINT jméno] definice_omezení [INITIALLY {DEFERRED|IMMEDIATE}] [[NOT] DEFERRABLE] Pokud omezení není pojmenované, dostane obvykle nic neříkající jméno (V Oracle např. SYS_Cnnnnnn). Doporučuje se proto omezení pojmenovávat Jednotlivá sloupcová omezení se od sebe oddělují mezerou DBI026 -DB Aplikace - MFF UK
40
DBI026 -DB Aplikace - MFF UK
Integritní omezení NULL, resp. NOT NULL Sloupec může, resp. nemůže mít nedefinovanou hodnotu NULL. UNIQUE Sloupec musí mít všechny hodnoty různé. Obvykle se používá volnější interpretace: Sloupec musí mít všechny definované hodnoty různé. PRIMARY KEY Sloupec tvoří primární klíč tabulky, je automaticky chápán jako NOT NULL a UNIQUE. DBI026 -DB Aplikace - MFF UK
41
DBI026 -DB Aplikace - MFF UK
Integritní omezení Interm. SQL-92 CHECK (podmínka) Hodnota sloupce musí splňovat podmínku. REFERENCES tabulka(sloupec) [ON {DELETE|UPDATE} {CASCADE|SET NULL|NO ACTION}] Hodnota odkazuje na primární klíč, nebo kandidátní klíč (UNIQUE sloupec) uvedené tabulky S klauzulí ON DELETE/UPDATE kromě NO ACTION je povoleno mazání/aktualizace nadřízené řádky. Podřízená řádka je smazána/aktualizována rovněž, nebo je hodnota ve sloupci nastavena na NULL Full SQL-92 DBI026 -DB Aplikace - MFF UK
42
DBI026 -DB Aplikace - MFF UK
Integritní omezení DEFAULT hodnota Defaultní hodnota, pokud není uvedeno jinak Standardně je DEFAULT NULL DBI026 -DB Aplikace - MFF UK
43
DBI026 -DB Aplikace - MFF UK
Integritní omezení Příklad CREATE TABLE Osoba( RC CHARACTER(11) CONSTRAINT Osoba_PK PRIMARY KEY, JMENO CHAR VARYING(30) CONSTRAINT Osoba_U_Jmeno UNIQUE NOT NULL, CHAR VARYING(30) CONSTRAINT Osoba_C_ CHECK ( LIKE ); DBI026 -DB Aplikace - MFF UK
44
Datový slovník v Oracle
Informace o tabulkách jsou uloženy v USER_TABLES USER_TAB_COLUMNS USER_CONSTRAINTS DBI026 -DB Aplikace - MFF UK
45
DBI026 -DB Aplikace - MFF UK
Datový slovník v MS SQL Informace o tabulkách jsou uloženy v INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA.COLUMNS INFORMATION_SCHEMA.TABLE_CONSTRAINTS DBI026 -DB Aplikace - MFF UK
46
Řádková integritní omezení
Mohou kontrolovat vzájemný vztah více sloupců jednoho řádku CHECK (zacatek <= konec) Mohou definovat vícesloupcové primární a kandidátní a cizí klíče PRIMARY KEY (zacatek, konec) FOREIGN KEY (zacatek, konec) REFERENCES Rodic (x, y) DBI026 -DB Aplikace - MFF UK
47
Atributy integritních omezení
ENABLED / DISABLED Omezení je aktivní a platnost se ověřuje ALTER TABLE tabulka {ENABLE|DISABLE} CONSTRAINT omezení; DEFERRED / IMMEDIATE Ověření se odloží na konec transakce, jinak se ověřuje okamžitě DEFERRABLE / NOT DEFERRABLE Ověření je / není možné odkládat na konec transakce DBI026 -DB Aplikace - MFF UK
48
Na co si dát při návrhu pozor
Hlídat na úrovni databáze všechny manipulace s daty, které ohlídat jdou Cokoli jde zadat uživatelem špatně, bude zadáno špatně Integritní omezení, triggery Později je čištění nekonzistentních dat namáhavé a opravy často nemožné Lépe ohlídat vše centrálně, než v každé aplikaci zvlášť DBI026 -DB Aplikace - MFF UK
49
Na co si dát při návrhu pozor
Hlídat unikátnost vkládaných dat Každá tabulka by měla mít primární klíč I v případě, kdy je primární klíč uměle vytvořený, jednotlivé instance (řádky) obvykle mívají svůj přirozený jedno- či vícesloupcový identifikátor, který by měl být definován jako alternativní klíč tabulky (UNIQUE) Nezřídka existuje více alternativních klíčů DBI026 -DB Aplikace - MFF UK
50
INSERT/UPDATE/DELETE Vestavěné funkce
#INCLUDE dbacv_01.ppt INSERT/UPDATE/DELETE Vestavěné funkce
51
Změna schématu aplikace
Přednáška č. 2 Změna schématu aplikace Přidávání a odebírání sloupců a omezení Změna definice sloupců a omezení
52
Proč měnit schéma aplikace
Chyba v návrhu Špatná normální forma aplikace Nelze uložit všechna požadovaná data Chybně definovaná kontrola Změna požadavků ze strany zákazníka Podpora nových vlastností evidovaných entit Změna v omezeních … DBI026 -DB Aplikace - MFF UK
53
Na co při změnách schématu nezapomenout
Změny schématu a aplikace představují obvykle výraznou většinu životního cyklu aplikace Data evidovaná ve schématu mají větší cenu, než použitý software a hardware Schopnost změny schématu aplikace a modifikace dat bez jejich ztráty je důležitější, než vytváření schématu zcela nového DBI026 -DB Aplikace - MFF UK
54
DBI026 -DB Aplikace - MFF UK
Změna definic tabulek Přidání sloupce do již existujících tabulek ALTER TABLE tabulka ADD definice sloupce; Př. ALTER TABLE Osoba ADD Poznamka CHARACTER VARYING(1000); ALTER TABLE Vyrobek ADD EAN NUMERIC(13) CONSTRAINT Vyrobek_U_EAN UNIQUE; DBI026 -DB Aplikace - MFF UK
55
DBI026 -DB Aplikace - MFF UK
Změna definic tabulek Zrušení sloupce v již existující tabulce Před zrušením je obvykle nutné data přesunout na nové místo! ALTER TABLE tabulka DROP COLUMN sloupec; Př. ALTER TABLE Osoba DROP COLUMN Psc; DBI026 -DB Aplikace - MFF UK
56
DBI026 -DB Aplikace - MFF UK
Změna definic tabulek Přidání omezení do již existujících tabulek ALTER TABLE tabulka ADD definice omezení; Př. ALTER TABLE Osoba ADD CONSTRAINT Osoba_FK_Matka FOREIGN KEY(matka) REFERENCES Osoba(ID) ON DELETE SET NULL; DBI026 -DB Aplikace - MFF UK
57
DBI026 -DB Aplikace - MFF UK
Změna definic Zrušení nadbytečného omezení v tabulce ALTER TABLE tabulka DROP CONSTRAINT omezení; Př. ALTER TABLE Osoba DROP CONSTRAINT Osoba_U_Jmeno; DBI026 -DB Aplikace - MFF UK
58
DBI026 -DB Aplikace - MFF UK
Změna definic tabulek Sloupce a omezení lze přidávat najednou příkazem ALTER TABLE tabulka ADD ( definice sloupce | omezení, … ); Př. ALTER TABLE Osoba ADD ( Poznamka CHARACTER VARYING(1000), CONSTRAINT Osoba_Chk_Vek CHECK (Vek>=0) ); DBI026 -DB Aplikace - MFF UK
59
DBI026 -DB Aplikace - MFF UK
Změna definic tabulek Sloupce lze redefinovat příkazem ALTER TABLE tabulka MODIFY ( nová definice sloupce, … ); Př. ALTER TABLE Osoba MODIFY ( Poznamka CHARACTER VARYING(2000) ); Lze měnit NULL na NOT NULL a naopak Šířku sloupce Zvětšení Zmenšení (pokud je sloupec prázdný) DBI026 -DB Aplikace - MFF UK
60
Spojování tabulek v SELECT příkazu
61
DBI026 -DB Aplikace - MFF UK
Spojování tabulek Norma SQL-92 zavedla více typů spojování tabulek v klauzuli WHERE včetně podmínek Kartézský součin Spojení Přirozené spojení Vnější spojení Předchozí normy dovolovaly pouze čárkami oddělený seznam zdrojů (tabulek a pohledů) u každého zdroje bylo možné uvést alias, oddělený mezerou podmínky spojení výhradně v klauzuli WHERE DBI026 -DB Aplikace - MFF UK
62
DBI026 -DB Aplikace - MFF UK
Spojování tabulek ANSI SQL-92 syntaxe dovoluje použití klíčového slova AS pro oddělení definice aliasu od zdroje dat … FROM Emp AS E, Dept AS D Rozlišuje jednotlivé způsoby spojení pomocí dalších klíčových slov Uvádí podmínky spojení v klauzuli FROM Klauzule WHERE slouží pro uvedení dodatečných podmínek (selekci) DBI026 -DB Aplikace - MFF UK
63
DBI026 -DB Aplikace - MFF UK
Spojování tabulek Full SQL-92 1111 10 2222 20 EmpNo DeptNo X CROSS JOIN Y kartézský součin ekvivalent předchozího stylu zápisu X, Y SELECT EmpNo, Loc FROM Emp CROSS JOIN Dept; 20 NEW YORK 30 DALLAS DeptNo Loc 1111 10 EmpNo DeptNo 20 NEW YORK 30 DALLAS Loc 2222 DBI026 -DB Aplikace - MFF UK
64
DBI026 -DB Aplikace - MFF UK
Spojování tabulek Transitional SQL-92 1111 10 2222 20 EmpNo DeptNo X NATURAL [INNER] JOIN Y přirozené spojení přes všechny společné sloupce tabulek SELECT EmpNo, Loc FROM Emp NATURAL JOIN Dept; 20 NEW YORK 30 DALLAS DeptNo Loc EmpNo DeptNo Loc 2222 20 NEW YORK DBI026 -DB Aplikace - MFF UK
65
Spojování tabulek Oracle vs. ANSI SQL-92
X [INNER] JOIN Y ON (podmínka) standardní spojení tabulek, ekvivalent zápisu FROM … X, Y … WHERE podmínka X [INNER] JOIN Y USING (sloupce) standardní spojení přes rovnost uvedených sloupců (v obou tabulkách se musí jmenovat shodně) Transitional SQL-92 Transitional SQL-92 DBI026 -DB Aplikace - MFF UK
66
Vnější spojování tabulek
Místo INNER je možné uvést jednu z možností LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] Pokud je uvedeno … X LEFT JOIN Y ON (podmínka) ... Jsou ve výsledku všechny řádky levé tabulky (X), i když k nim neexistuje žádná odpovídající řádka z pravé tabulky (Y) Transitional SQL-92 DBI026 -DB Aplikace - MFF UK
67
Vnější spojování tabulek
Místo INNER je možné uvést jednu z možností LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] SELECT * FROM Emp NATURAL LEFT JOIN Dept; Ve výsledku jsou uvedeni i zaměstnanci, kteří nejsou v žádném oddělení Neexistující položky z oddělení jsou vyplněny NULL hodnotami Transitional SQL-92 1111 10 EmpNo DeptNo Loc 2222 20 NEW YORK DBI026 -DB Aplikace - MFF UK
68
Vnější spojování tabulek
Místo INNER je možné uvést jednu z možností LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] SELECT * FROM Emp NATURAL RIGHT JOIN Dept; Ve výsledku jsou uvedena i oddělení, ve kterých nejsou žádní zaměstnanci Neexistující položky z oddělení jsou vyplněny NULL hodnotami Transitional SQL-92 2222 20 EmpNo DeptNo Loc 30 DALLAS NEW YORK DBI026 -DB Aplikace - MFF UK
69
Vnější spojování tabulek
Místo INNER je možné uvést jednu z možností LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] SELECT * FROM Emp NATURAL FULL JOIN Dept; Kombinace NATURAL LEFT OUTER JOIN a NATURAL RIGHT OUTER JOIN zároveň Intermediate SQL-92 1111 10 EmpNo DeptNo Loc 2222 20 NEW YORK 30 DALLAS DBI026 -DB Aplikace - MFF UK
70
Vnější spojování tabulek v Oracle
Oracle má i svoji nativní syntaxi pro vnější spojení Starší, pouze pro rovnost hodnot sloupců Použití ANSI SQL je silnější a přenositelné Levé vnější spojení SELECT * FROM Dept, Emp WHERE Dept.Deptno = Emp.Deptno(+); Pravé vnější spojení SELECT * FROM Dept, Emp WHERE Dept.Deptno(+) = Emp.Deptno; Oboustranné neexistuje DBI026 -DB Aplikace - MFF UK
71
Optimalizace SQL dotazů
Indexy Plány provedení dotazu Ovlivnění optimalizátoru
72
DBI026 -DB Aplikace - MFF UK
Indexy Slouží pro zrychlení přístupu k datům na základě podmínky ve WHERE klauzuli Nemění syntaxi ani sémantiku příkazů pro manipulaci s daty Unikátní vs. neunikátní Jednosloupcové vs. vícesloupcové B-stromy vs. bitmapy Nad sloupci vs. nad výrazy Doménové indexy (fulltextové, prostorové, …) DBI026 -DB Aplikace - MFF UK
73
DBI026 -DB Aplikace - MFF UK
Indexy Tvorba indexů není v SQL-92 standardizována Jednotlivé databázové systémy řeší tvorbu indexů svými prostředky, které jsou navzájem více či méně podobné Může se lišit syntaxe podpora různých typů indexů jejich (ne)použití pro daný dotaz a obsah tabulky DBI026 -DB Aplikace - MFF UK
74
DBI026 -DB Aplikace - MFF UK
B-tree indexy Obvykle redundantní B+ stromy Hodnoty v listech Listy oboustranně linkované pro snadný sekvenční průchod. Vhodné pro sloupce s vysokou selektivitou (počtem různých hodnot ve sloupci). Vícesloupcové (složené) indexy mohou zvýšit selektivitu. Použitelné, pokud dotaz omezuje hodnoty prvních k sloupců indexu, přičemž prvních k-1 sloupců musí být omezeno na rovnost Nepoužitelné, pokud v dotazu není omezení na první sloupec indexu Nad jednou tabulkou v jednom dotazu nelze obvykle kombinovat více B-tree indexů. Dotaz se vyhodnocuje s použitím jednoho z indexů a ostatní podmínky se dopočítávají DBI026 -DB Aplikace - MFF UK
75
DBI026 -DB Aplikace - MFF UK
Bitmapové indexy Pro každou hodnotu sloupce / výrazu vytvořen binární řetězec obsahující 1 právě pro řádky s danou hodnotou Vhodné pro sloupce s nízkou selektivitou Lze kombinovat více bitmapových indexů nad jednou tabulkou pro zvýšení selektivity Kombinací více bitmap se zvyšuje selektivita indexu SELECT * FROM Obyvatel WHERE Pohlaví=’M’ AND (Kraj=’Pha’ OR Kraj=’SČ’); Kombinace tří bitmapových řetězců 1 M P h a S Č ( )= DBI026 -DB Aplikace - MFF UK
76
Kdy indexy (ne)pomohou
Pokud je procento vyhovujících záznamů velké zvýšená režie s přístupem k řádkům v nesekvenčním pořadí, daném indexem Při dotazech na hodnotu NULL v indexech se běžně neukládají Pomohou V dotazech na rovnost sloupce s konstantou V dotazech na náležení hodnoty do intervalu DBI026 -DB Aplikace - MFF UK
77
Kdy (ne)vytvářet indexy
Jak Oracle, tak MS SQL vytváří automaticky unikátní indexy pro primární klíče jméno bývá shodné se jménem omezení kandidátní klíče (UNIQUE sloupce) DBI026 -DB Aplikace - MFF UK
78
Kdy (ne)vytvářet indexy
Důležité je vytvářet indexy pro cizí klíče !!! Zrychlení odezvy při manipulaci s nadřízenou tabulkou Při rušení nadřízené řádky je bez indexu nutné projít celou podřízenou tabulku, zda neobsahuje závislé řádky Pokud je aktivované kaskádové mazání a odkazy jsou víceúrovňové, pro každou nalezenou podřízenou řádku je nutné projít celou její pořízenou tabulku atd. atd. Průchod tabulkou čte i bloky, obsahující zrušené záznamy v tabulce Průchod přes index najde efektivně všechny existující závislé řádky bez nutnosti čtení samotné tabulky Např. Oracle řeší nemožnost efektivně najít a zamknout podřízené řádky zamknutím celé podřízené tabulky, čímž velmi omezuje možnost běhu aplikace s více uživateli. DBI026 -DB Aplikace - MFF UK
79
Kdy (ne)vytvářet indexy
Indexy by se jinak měly vytvářet jen v případě, pokud výrazně pomohou často kladeným dotazům V opačném případě spíše zdržují aktualizační operace DBI026 -DB Aplikace - MFF UK
80
DBI026 -DB Aplikace - MFF UK
Indexy Indexy nad sloupci CREATE [UNIQUE] INDEX jméno_indexu ON jméno_tabulky(sloupec1, sloupec2, …); Př. CREATE INDEX Osoba_Pr_Jm_Inx ON Osoba(Prijmeni,Jmeno); Index lze použít v příkazu, omezujícím první použitý sloupec SELECT * From Osoba WHERE Prijmeni=’Svoboda’; DBI026 -DB Aplikace - MFF UK
81
DBI026 -DB Aplikace - MFF UK
Indexy Indexy nad sloupci CREATE [UNIQUE] INDEX jméno_indexu ON jméno_tabulky(sloupec1, sloupec2, …); Př. CREATE INDEX Osoba_Pr_Jm_Inx ON Osoba(Prijmeni,Jmeno); Index nelze použít v příkazu, omezujícím jen druhý použitý sloupec SELECT * From Osoba WHERE Jmeno=’Zdeněk’; DBI026 -DB Aplikace - MFF UK
82
DBI026 -DB Aplikace - MFF UK
Unikátní indexy Vhodnější je definovat unikátnost pomocí integritních omezení PRIMARY KEY a UNIQUE Kromě unikátních indexů jsou tak definována i samotná omezení Na tyto sloupce pak mohou vést cizí klíče DBI026 -DB Aplikace - MFF UK
83
DBI026 -DB Aplikace - MFF UK
Indexy Indexy s definicí třídění CREATE [UNIQUE] INDEX jméno_indexu ON jméno_tabulky(sloupec1 [{ASC|DESC}], …); Definují směr třídění v jednotlivých sloupcích Mohou pomoci určit výsledné pořadí záznamů bez provádění třídících operací během SELECT příkazu Př. CREATE INDEX Zamestnanec_Zarazeni_Plat_Inx ON Zamestnanec(Zarazeni, Plat DESC); DBI026 -DB Aplikace - MFF UK
84
DBI026 -DB Aplikace - MFF UK
Bitmapové indexy Bitmapové indexy (jsou vždy neunikátní) CREATE BITMAP INDEX jméno_indexu ON jméno_tabulky({sloupec1|výraz1}, …); Př. CREATE BITMAP INDEX Vyuka_Den_Inx ON Vyuka(DenVTydnu); DBI026 -DB Aplikace - MFF UK
85
DBI026 -DB Aplikace - MFF UK
B-tree Indexy v Oracle Tabulky mají strukturu HEAP (nijak explicitně netříděné) Indexy obsahují dvojice [hodnoty index. sloupců; ROWID] DBI026 -DB Aplikace - MFF UK 85
86
DBI026 -DB Aplikace - MFF UK
B-tree Indexy v MS-SQL Clustrovaný index CREATE [UNIQUE] CLUSTERED INDEX …; Listy obsahují přímo bloky s řádky tabulky Efektivní pro časté range dotazy a sekvenční přístupy (GROUP BY, ORDER BY, …) Max. 1 pro tabulku (určuje fyzické pořadí), PRIMARY KEY vždy clustrovaný Neclustrovaný index Obsahuje dvojice [Hodnoty ; HodnotyPK] pokud ex. clustrovaný index, nebo [Hodnoty ; Row ID] DBI026 -DB Aplikace - MFF UK 86
87
DBI026 -DB Aplikace - MFF UK
Indexy Zrušení indexu DROP INDEX [schema.]jméno_indexu; U MS SQL schema povinné DROP INDEX schema.jméno_indexu; DBI026 -DB Aplikace - MFF UK
88
DBI026 -DB Aplikace - MFF UK
Datový slovník Informace o indexech jsou v Oracle uloženy v pohledech USER_INDEXES USER_IND_COLUMNS Informace o indexech jsou v MS SQL uloženy v pohledech INFORMATION_SCHEMA .INDEXES DBI026 -DB Aplikace - MFF UK
89
Na co si dát při návrhu pozor
Používat správné typy indexů Negenerovat bez uvážení indexy pro všechny sloupce tabulky a jejich kombinace Zdržují se aktualizace dat Zvyšuje se nárok na diskový prostor DBI026 -DB Aplikace - MFF UK
90
Na co si dát při návrhu pozor
Při návrhu dotazů využívat prostředky daného serveru pro zjištění té nejlepší varianty dotazu ovlivnění způsobu vyhodnocení dotazu Optimalizátory databází mají své meze pro nalezení optimálního plánu se používají heuristické postupy Neuvažují se zdaleka všechny kombinace pořadí tabulek a indexů DBI026 -DB Aplikace - MFF UK
91
DBI026 -DB Aplikace - MFF UK
Optimalizace dotazů Jeden dotaz lze napsat více způsoby Shodná sémantika Rozdílný způsob výpočtu výsledku Doba výpočtu se může lišit i řádově !! O způsobu výpočtu rozhoduje optimalizátor uvnitř databázového serveru Potřebné je Umět zjistit, jakým způsobem výpočet proběhne Zvolit nejlépe optimalizovatelný zápis dotazu nebo optimalizátoru pomoci s výběrem DBI026 -DB Aplikace - MFF UK
92
Co obsahuje plán provedení
Strom elementárních operací Vyhodnocuje se post-order metodou, operace v kořeni získá celý požadovaný výsledek Nástin obsahu plánu V listech přístupy ke zdrojům Index UNIQUE SCAN Index RANGE SCAN Table FULL SCAN Ve vnitřních uzlech Přístupy k řádku tabulky podle indexu Spojení tabulek (vnořené cykly, MERGE JOIN, HASH JOIN) Třídící operace Filtry dle dodatečných podmínek DBI026 -DB Aplikace - MFF UK
93
DBI026 -DB Aplikace - MFF UK
Typy optimalizace V Oracle Starší RULE BASED optimalizace (RBO) Odvozuje plán ze syntaxe příkazu a existence indexů Novější COST BASED optimalizace (CBO) Oracle 8+, doporučována pro lepší vlastnosti Založena na statistikách, počítá cenu zdrojů provedení operace (čas, prostor, třídící operace, …) Dokáže rozlišit plány i pro různé hodnoty konstant v dotazu DBI026 -DB Aplikace - MFF UK
94
Rule-Based Optimalizace dotazů
Cena přístupu k podmnožině řádek v tabulce v klesajícím pořadí Full-scan Prochází se celá tabulka, u každé řádky se ověří podmínka Může být vhodné, pokud procento vyhovujících řádek je dost velké Index-Range-Scan Vyhledání intervalu v indexu, ověření ostatních podmínek v odkazovaných řádcích Unique-Index-Scan Vyhledání jediné možné vyhovující řádky podle unikátního indexu ROWID-Scan Vyhledání řádky na základě známé hodnoty jejího fyzického identifikátoru v databázi DBI026 -DB Aplikace - MFF UK
95
DBI026 -DB Aplikace - MFF UK
Optimalizace dotazů Cena operace JOIN dvou tabulek Databáze se snaží zvolit tabulku s dražším přístupem jako hlavní tabulku Ke každé nalezené vyhovující řádce dohledává odpovídající řádky ve druhé tabulce Pokud obě tabulky nabízí pouze Full-Scan, data obou se setřídí a provede se Merge-Join DBI026 -DB Aplikace - MFF UK
96
DBI026 -DB Aplikace - MFF UK
Optimalizace dotazů Jak zjistit způsob provedení příkazu? Nejprve je nutné mít tabulku PLAN_TABLE s odpovídající strukturou, do které plánovač ukládá informace o plánu provedení SQL*Plus nabízí přepínač SET AUTOTRACE {OFF|ON|TRACEONLY} Oracle obsahuje příkaz EXPLAIN PLAN DBI026 -DB Aplikace - MFF UK
97
DBI026 -DB Aplikace - MFF UK
Tabulka PLAN_TABLE Zajímavé sloupce STATEMENT_ID VARCHAR2(30) OPERATION VARCHAR2(30) OPTIONS VARCHAR2(30) OBJECT_OWNER VARCHAR2(30) OBJECT_NAME VARCHAR2(30) OBJECT_TYPE VARCHAR2(30) ID NUMBER(38) PARENT_ID NUMBER(38) COST NUMBER(38) … Identifikátor příkazu, shodný pro všechny řádky plánu Operace (SCAN, SORT, …) Upřesnění operace (FULL, RANGE, UNIQUE, …) Vlastník zdroje Jméno zdroje Typ zroje (TABLE, INDEX, CLUSTER, …) Identifikace kroku v plánu s daným STATEMENT_ID Identifikace rodičovského kroku ve stromu provedení Odhadovaná cena … Strom plánu se čte od listů ke kořeni Rodičovská operace se provádí po dokončení operací v potomcích Kořenová operace má ID=0 DBI026 -DB Aplikace - MFF UK
98
DBI026 -DB Aplikace - MFF UK
Příkaz EXPLAIN PLAN EXPLAIN PLAN SET STATEMENT_ID = ’jméno’ [INTO tabulka] FOR příkaz; EXPLAIN PLAN SET STATEMENT_ID = ’emp_dept’ FOR SELECT Emp.*, Dept.Loc FROM Dept, Emp WHERE Dept.DeptNo = Emp.Deptno; DBI026 -DB Aplikace - MFF UK
99
DBI026 -DB Aplikace - MFF UK
Příkaz EXPLAIN PLAN Získání plánu provedení např. příkazem SELECT LPad(' ',2*Level-1)||operation ||' '||options ||' '||object_name AS text FROM Plan_Table START WITH Statement_ID=’příkaz’ AND ID = 0 CONNECT BY Parent_ID = PRIOR ID AND Statement_ID = PRIOR Statement_ID; DBI026 -DB Aplikace - MFF UK
100
DBI026 -DB Aplikace - MFF UK
Příkaz EXPLAIN PLAN Získání plánu provedení např. příkazem select plan_table_output from table( dbms_xplan.display( 'PLAN_TABLE',null,'ALL‚ ) ); PLAN_TABLE_OUTPUT | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| | 0 | SELECT STATEMENT | | | 1893K| (2)| | 1 | NESTED LOOPS | | | 1893K| (2)| | 2 | INDEX RANGE SCAN | MF_CISPOLATR_SK_ATR_DO_PBCP | | | (0)| | 3 | COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE | | | | DBI026 -DB Aplikace - MFF UK
101
DBI026 -DB Aplikace - MFF UK
Optimalizace dotazů Jak zjistit způsob provedení příkazu? Konzola ISQL nabízí možnost zobrazit textově plán provedení příkazu sekvencí příkazů set showplan_text on go <příkaz> go set showplan_all on set showplan_xml on DBI026 -DB Aplikace - MFF UK
102
DBI026 -DB Aplikace - MFF UK
Query Analyzer Grafická reprezentace plánu provedení Vložení příkazu Stisk CTRL+L DBI026 -DB Aplikace - MFF UK
103
Jak psát optimalizovatelné dotazy
V aplikacích používat místo konstant tzv. placeholdery a aplikační proměnné Dva různé dotazy mají dva samostatné plány provedení. Jejich vytvoření zabírá čas a jiné zdroje databáze SELECT * FROM Emp WHERE DeptNo=10; SELECT * FROM Emp WHERE DeptNo=20; SELECT * FROM Emp WHERE DeptNo=:d; Někdy ovšem mohou dva plány pomoci, pokud se princip provedení odůvodněně liší. SELECT * FROM Vojaci WHERE Pohlavi=’M’ SELECT * FROM Vojaci WHERE Pohlavi=’Ž’ 90% dat (full s.) 10% dat (range s.) DBI026 -DB Aplikace - MFF UK
104
Jak psát optimalizovatelné dotazy
Jeden dotaz psát všude přesně stejně Různé zápisy databáze vždy znovu analyzuje a vymýšlí plán provedení SELECT * FROM Emp WHERE Ename LIKE ’A%’ AND DeptNo=10; SELECT * FROM Emp WHERE DeptNo=10 AND Ename LIKE ’A%’; DBI026 -DB Aplikace - MFF UK
105
Nevýhody rule-based optimalizace
Pokud existuje více neunikátních indexů na jedné tabulce, nemusí optimalizátor vybrat ten nejlepší SELECT * FROM Osoba WHERE Jmeno=’Jan’ AND Mesto=’Praha’; Buďto se přes index hledají Janové, a ověřuje se bydliště, nebo se hledají Pražáci a ověřuje se jméno DBI026 -DB Aplikace - MFF UK
106
Nevýhody rule-based optimalizace
Použití určitého indexu je možné optimalizátoru znemožnit použitím výrazu v dotazu SELECT * FROM Osoba WHERE CONCAT(Jmeno,’’)=’Jan’ AND Mesto=’Praha’; Index přes jméno nelze použít, použije se tedy index přes město DBI026 -DB Aplikace - MFF UK
107
Cost-based optimalizace
Pro jednotlivé plány se počítá cena provedení v řadě hledisek Množství I/O operací, řádek, Byte, … Cena prováděných třídících operací Cena za HASH operace Vybírá se plán s nejnižší váženou cenou DBI026 -DB Aplikace - MFF UK
108
Cost-based optimalizace
Využívá statistických informací o datech Počet různých hodnot ve sloupci, Histogramy rozložení hodnot ve sloupci, Počet řádek v tabulce, Průměrná délka jedné řádky Pro konkrétní hodnotu nebo interval hodnot lze odhadnout procento vyhovujících řádek v tabulce jejich datový objem DBI026 -DB Aplikace - MFF UK
109
Cost-based optimalizace
V Oracle dovoluje používat indexy přes výrazy, RBO je nepodporuje CREATE INDEX Emp_Income_INX ON Emp(Sal+COALESCE(Comm,0)); SELECT EName FROM Emp WHERE Sal+COALESCE(Comm,0)>5000; DBI026 -DB Aplikace - MFF UK
110
Výběr typu optimalizace
Výběr optimalizace ALTER SESSION SET OPTIMIZER_GOAL= CHOOSE – výběr podle (ne)přítomnosti statistik nejsou-li k dispozici, potom RBO, jinak CBO ALL_ROWS – vždy CBO, minimalizuje se cena za získání všech řádek odpovědi Vhodné pro dávkové zpracování. FIRST_ROWS – vždy CBO, minimalizuje se cena za získání prvních řádek odpovědi. Vhodné pro interaktivní zpracování. RULE – vždy RBO DBI026 -DB Aplikace - MFF UK
111
DBI026 -DB Aplikace - MFF UK
Tvorba statistik ANALYZE TABLE jm_tabulky {COMPUTE | ESTIMATE | DELETE} STATISTICS [FOR {TABLE | ALL [INDEXED] COLUMNS}]; DBMS_UTILITY.ANALYZE_SCHEMA( ’jm_schematu’,’compute’ /* resp. ’delete’, příp. ’estimate’*/ ); DBMS_STATS.GATHER_SCHEMA_STATS(‘jm_sch’); Pohledy v datovém slovníku INDEX_STATS, USER_TAB_COL_STATISTICS USER_USTATS DBI026 -DB Aplikace - MFF UK
112
DBI026 -DB Aplikace - MFF UK
Tvorba statistik Standardně povolen přepínač AUTO_CREATE_STATISTICS Statistiky se generují automaticky ALTER DATABASE dbname SET AUTO_CREATE_STATISTICS {ON|OFF} Ručně pomocí sp_createstats Př. vytvoření dodatečné statistiky pro dvousloupcovou hodnotu na základě vzorku dat CREATE STATISTICS FirstLast ON Person.Contact(FirstName,LastName) WITH SAMPLE 50 PERCENT DBI026 -DB Aplikace - MFF UK
113
Co statistiky obsahují
Tabulky Počet řádek Počet datových bloků na řádku … Sloupce Počet různých hodnot Počet NULL hodnot Histogramy hodnot (kolik hodnot připadne do daného intervalu) DBI026 -DB Aplikace - MFF UK
114
Nápověda optimalizátoru (hinty)
Pomocí plusových komentářů bezprostředně za prvním klíčovým slovem příkazu SELECT/UPDATE/INSERT/DELETE SELECT --+ seznam hintů SELECT /*+ seznam hintů */ Možné použít pro volbu typu optimalizace SELECT /*+ RULE */ * FROM EMP …; SELECT /*+ FIRST_ROWS */ * FROM EMP …; Použití hintu (kromě RULE) vždy použije CBO na základě statistik. Pokud nejsou statistiky spočteny, výsledek optimalizace je kontraproduktivní. DBI026 -DB Aplikace - MFF UK
115
Nápověda optimalizátoru (hinty)
Základní nastavení optimalizátoru CHOOSE Optimalizátor vybere metodu dle přítomnosti/nepřítomnosti statistik RULE Optimalizátor použije optimalizaci založenou na pravidlech i v případě, že má k dispozici statistiky ALL_ROWS Optimalizátor se bude snažit minimalizovat cenu za zpracování všech řádek v dotazu či příkazu FIRST_ROWS, FIRST_ROWS(n) Optimalizátor bude minimalizovat cenu za získání první, resp. prvních n řádek DBI026 -DB Aplikace - MFF UK
116
Nápověda optimalizátoru (hinty)
Další možnosti (výběr dat z tabulek) FULL(jm_tabulky) Full-scan pro tabulku INDEX (jm_tabulky jm_indexu) Pro průchod tabulkou se použije požadovaný index NO_INDEX (jm_tabulky jm_indexu) Pro průchod tabulkou se nepoužije požadovaný index ORDERED Při spojování tabulek se použije pořadí uvedené ve FROM USE_NL, USE_MERGE, USE_HASH Spojení pomocí vnořených cyklů, merge-join, hash-join DBI026 -DB Aplikace - MFF UK
117
Nápověda optimalizátoru (hinty)
FULL(jm_tabulky) SELECT /*+ FULL(Emp) */ EmpNo, Ename FROM Emp WHERE EName>’X’; Použít FULL SCAN i přes případně malé procento vracených řádek DBI026 -DB Aplikace - MFF UK
118
Nápověda optimalizátoru (hinty)
INDEX(jm_tabulky index [index …]) SELECT --+ INDEX(Emp ENameInx EDeptInx) EmpNo, Ename FROM Emp WHERE EName LIKE’SC%’ AND DeptNo>50; Použít ten z uvedených indexů, který nabízí nejnižší cenu provedení operace DBI026 -DB Aplikace - MFF UK
119
Nápověda optimalizátoru (hinty)
NO_INDEX(jm_tabulky index [index …]) SELECT --+ NO_INDEX(Emp ENameInx) EmpNo, Ename FROM Emp WHERE EName LIKE’SC%’ AND DeptNo>50; Index přes EName se nebude pro vytvoření plánu uvažovat DBI026 -DB Aplikace - MFF UK
120
Nápověda optimalizátoru (hinty)
ORDERED SELECT --+ ORDERED EmpNo, Ename FROM Emp, Dept WHERE …; Tabulky se budou spojovat v pořadí, v jakém jsou uvedené ve FROM klauzuli DBI026 -DB Aplikace - MFF UK
121
Nápověda optimalizátoru (hinty)
Pomocí klauzule OPTION (query_hint [, …]) na konci příkazu např.: {HASH | ORDER} GROUP {CONCAT | HASH | MERGE} UNION {LOOP | MERGE | HASH} JOIN FAST number_rows FORCE ORDER OPTIMIZE FOR {UNKNOWN|=constant}, …) DBI026 -DB Aplikace - MFF UK
122
#INCLUDE dbacv_02.ppt #INCLUDE dbacv_03.ppt
Optimalizace Příklady
123
Přednáška č. 3 Pohledy
124
Pohledy nad relačními tabulkami
Pohled ~ pojmenovaný SELECT příkaz Reprezentuje virtuální tabulku Při dotazu nad pohledem se pohled vždy znovu rozvíjí v rámci položeného dotazu DBI026 -DB Aplikace - MFF UK
125
DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Příkazem CREATE VIEW jmeno_pohledu [jmeno_sloupce [, …]] AS SELECT … [WITH [{CASCADE | LOCAL} CHECK OPTION] DBI026 -DB Aplikace - MFF UK
126
DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Příklad: CREATE VIEW Obyvatel_Brna AS SELECT * FROM Obyvatel WHERE Mesto=’Brno’; DBI026 -DB Aplikace - MFF UK
127
DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Sloupce mohou být explicitně pojmenované Pokud nejsou, zdědí jména sloupců ze SELECT příkazu WITH CHECK OPTION zajistí, aby vkládané či aktualizované řádky po provedení odpovídaly podmínce v pohledu Pokud by řádka nebyla v pohledu viditelná, aktualizace je odmítnuta DBI026 -DB Aplikace - MFF UK
128
DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Příklad: CREATE VIEW Obyvatel_Brna AS SELECT * FROM Obyvatel WHERE Mesto=’Brno’ WITH CHECK OPTION; -- chybná aktualizace UPDATE Obyvatel_Brna SET Mesto=’Ostrava’ WHERE RC=’751015/1234’; DBI026 -DB Aplikace - MFF UK
129
DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Použití pohledů Odstínění nutnosti spojení více (normalizovaných) tabulek Individualizace zobrazených dat pro uživatele Různí uživatelé mohou ve stejném pohledu vidět různé řádky Různí uživatelé mohou mít definován stejný pohled různě a zobrazovat jiné sloupce … DBI026 -DB Aplikace - MFF UK
130
DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Příklad: CREATE VIEW Zam_Moje_Odd AS SELECT Z.Cislo, Z.Prijmeni, Z.Jmeno, Z.Zarazeni FROM Zamestnanec AS Z, Zamestnanec AS X WHERE X.Login=CURRENT_USER AND Z.Oddeleni=X.Oddeleni; DBI026 -DB Aplikace - MFF UK
131
DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Některým nevhodně napsaným aplikacím může posun v pořadí ve sloupcích pohledu (nebo i samotné zvýšení počtu sloupců) přinést problémy Při vytváření pohledů je obvykle vhodné zajistit, aby se spolu s přidáváním sloupců do tabulek neposunovaly sloupce stejného významu na jiné pozice v seznamu sloupců Explicitně vyjmenovat sloupce v SELECT příkazu Navíc vhodné všechny sloupce kvalifikovat, buďto jménem tabulky, nebo jejím aliasem Explicitně pojmenovat sloupce pohledu DBI026 -DB Aplikace - MFF UK
132
DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Jak zabránit posunu sloupců v pohledech, které používají symbol * pro zobrazení všech řádek? V pohledu nad více pospojovanými tabulkami je vhodné použít * maximálně jednou, pro sloupce konkrétní tabulky (použitím kvalifikátoru jměna tabulky jm_tabulky.*). Za ní už by neměly být žádné sloupce vyjmenované. DBI026 -DB Aplikace - MFF UK
133
DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Příklad: CREATE VIEW Zam_Odd AS SELECT Z.RC, Z.Jmeno, O.* FROM Zamestnanec AS Z NATUAL RIGHT OUTER JOIN Oddeleni AS O; DBI026 -DB Aplikace - MFF UK
134
DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Není vhodné do pohledu dávat ORDER BY klauzuli Ne vždy je dotaz nad pohledem nutné třídit Někdy je potřeba zcela jiné třídění V řadě případů se více pohledů spojuje v dotazu dohromady a třídění každého z nich může zdržovat DBI026 -DB Aplikace - MFF UK
135
DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Při konstrukci dotazů nad více pohledy je vždy vhodné prověřit výsledek plánovačem, ne vždy se optimalizátoru podaří najít vhodný plán provedení Není příliš vhodné používat pohledy obsahující GROUP BY v dalších dotazech. Velmi špatně se optimalizují DBI026 -DB Aplikace - MFF UK
136
DBI026 -DB Aplikace - MFF UK
Vytváření pohledů Příklad: CREATE VIEW Pocty_Obyvatel AS SELECT Mesto, COUNT(*) AS Velikost FROM Obyvatel GROUP BY Mesto; SELECT * FROM Pocty_Obyvatel WHERE Mesto=’BRNO’; DBI026 -DB Aplikace - MFF UK
137
DBI026 -DB Aplikace - MFF UK
Rušení pohledů Příkazem DROP VIEW jmeno_pohledu; DBI026 -DB Aplikace - MFF UK
138
Odlišnosti v implementaci
CREATE VIEW jm [(sloupec [, …])] AS SELECT … [WITH {CHECK OPION | READ ONLY}]; Seznam sloupců v závorkách WITH READ ONLY nedovoluje žádnou aktualizaci CREATE VIEW jm [(sloupec [, …])] [WITH ENCRYPTION] AS SELECT … [WITH CHECK OPTION]; DBI026 -DB Aplikace - MFF UK
139
DBI026 -DB Aplikace - MFF UK
Datový slovník USER_VIEWS USER_TAB_COLUMNS INFORMATION_SCHEMA.VIEWS DBI026 -DB Aplikace - MFF UK
140
Procedurální rozšíření SQL
PL/SQL vs. Transact SQL
141
Procedurální rozšíření SQL proč jej používat
n x 1 Ve standardním SQL server obdrží a vyhodnotí vždy jednotlivý příkaz. V daném případě se odešle 2n paketů na server a 2n paketů zpět. for (;;) { FETCH; if (…) break; if (…) INSERT …; else UPDATE …; }; DBI026 -DB Aplikace - MFF UK
142
Procedurální rozšíření SQL proč jej používat
1 Pomocí procedurálního rozšíření je možné na server odeslat a zpracovat rozsáhlejší kus kódu včetně řízení toku V daném případě se odešle 1 paket na server a 1 paket zpět. LOOP FETCH; EXIT WHEN (…); IF (…) THEN INSERT …; ELSE UPDATE …; END LOOP; DBI026 -DB Aplikace - MFF UK
143
Procedurální rozšíření SQL proč jej používat
Šetření komunikačního kanálu Menší množství odesílaných povelů v jednom povelu je vetší množství příkazů Podstatně menší objem přenesených dat Data se zpracují na serveru bez přenosu na klienta Odlehčení klienta Možnost ukládat a vykonávat kód na serveru Kód na serveru může být používán všemi klientskými aplikacemi DBI026 -DB Aplikace - MFF UK
144
Procedurální rozšíření SQL použití
Rozšíření možností serveru o další uživatelské funkce a procedury Zvýšená ochrana integrity dat Triggery Zapouzdření povolených manipulací s daty do procedur a funkcí Aplikace nemusí mít práva pro přímý přístup k tabulkám DBI026 -DB Aplikace - MFF UK
145
Procedurální rozšíření SQL problémy
Podstatně menší přenositelnost než v případě definic tabulek a příkazů pro manipulaci s daty (INSERT, UPDATE, DELETE) Standardizováno poprvé v SQL-99 Řada proprietárních řešení v jednotlivých implementacích serverů Navzájem nekompatibilní DBI026 -DB Aplikace - MFF UK
146
DBI026 -DB Aplikace - MFF UK
Struktura Bloky kódu s pevnou strukturou Příkazy ukončené středníkem [DECLARE deklarace] BEGIN výkonná část [EXCEPTION ošetření výjimek] END; Posloupnosti příkazů Nemusí být ukončeny středníkem DECLARE sekce je chápána jako příkaz BEGIN … END také DBI026 -DB Aplikace - MFF UK
147
DBI026 -DB Aplikace - MFF UK
Struktura DECLARE podil NUMBER; BEGIN SELECT citatel/jmenovatel INTO podil FROM Zlomky WHERE citatel=123; IF podil > 0 THEN UPDATE Zlomky SET Vysledek=Podil WHERE citatel=123; END IF; END; DECLARE @podil FLOAT SELECT @podil = citatel/jmenovatel FROM Zlomky WHERE citatel=123 > 0 UPDATE Zlomky SET Vysledek WHERE citatel=123 DBI026 -DB Aplikace - MFF UK
148
DBI026 -DB Aplikace - MFF UK
Deklarace proměnných jméno [CONSTANT] typ [:= výraz]; Základní typy Standardní BOOLEAN obsahující TRUE, FALSE, NULL @jméno [AS] typ DBI026 -DB Aplikace - MFF UK
149
Deklarace typu v PL/SQL
Explicitně jménem X NUMERIC(7,2); Kopírováním typu jiné proměnné Y X%Type; Kopírováním typu sloupce E EMP.Ename%Type; Kopírováním typu řádku R EMP%RowType; Record, obsahující pole odpovídající sloupcům Přístup pomocí obvyklé tečkové notace DBI026 -DB Aplikace - MFF UK
150
DBI026 -DB Aplikace - MFF UK
Příkazy Prázdný příkaz NULL; Přiřazovací příkaz prom := výraz; SQL příkaz UPDATE Emp SET Sal = Sal*1.05; DELETE FROM Emp WHERE EmpNo=1; Přiřazovací příkaz = výraz SQL příkaz UPDATE Emp SET Sal = Sal*1.05; DELETE FROM Emp WHERE EmpNo=1 DBI026 -DB Aplikace - MFF UK
151
DBI026 -DB Aplikace - MFF UK
Příkazy SELECT, vracející právě jednu řádku SELECT výr1 [, …] INTO prom1 [, …] FROM … WHERE …; SELECT, vracející právě jednu řádku SELECT @prom1 = výr1 [, …] FROM … WHERE …; DBI026 -DB Aplikace - MFF UK
152
DBI026 -DB Aplikace - MFF UK
PL/SQL procedury CREATE [OR REPLACE] PROCEDURE jmproc [(deklarace_parametru [, …])] {AS | IS} blok_bez_klíčového_slova_DECLARE; Deklarace parametru jméno [IN] [OUT] typ [{:= | DEFAULT} výraz] IN parametr lze uvnitř procedury číst OUT parametr lze uvnitř procedury měnit Volání procedury v SQL*Plus (v PL/SQL standardně) EXEC jmproc[(výraz [, …])] Parametry se předávají podle pořadí EXEC jmproc[(jméno=>výraz [, …]) Parametry se předávají podle jména DBI026 -DB Aplikace - MFF UK
153
Velikost typů se u parametrů neuvádí
PL/SQL procedury CREATE PROCEDURE UpdEmpSal ( xEmpNo NUMBER, xSal NUMBER, xComm NUMBER DEFAULT NULL ) AS BEGIN UPDATE Emp SET Sal = xSal, Comm = xComm WHERE EmpNo=xEmpNo; END; / EXEC UpdEmpSal(1234,15500) -- bez odměn; EXEC UpdEmpSal(4321,14000,500); Velikost typů se u parametrů neuvádí DBI026 -DB Aplikace - MFF UK
154
DBI026 -DB Aplikace - MFF UK
T-SQL procedury {CREATE | ALTER} PROCEDURE jmproc [; číslo] [[(] deklarace_parametru [, …] [)]] AS příkazy [;] Deklarace parametru @jméno typ [= výraz] [OUT[PUT]] OUT[PUT] parametr je výstupní číslo umožňuje vytvoření více verzí stejné procedury Volání procedury EXEC[UTE] jmproc [výraz [, …]] Parametry se předávají podle pořadí EXEC[UTE] jmproc [, …]] Parametry se předávají podle jména DBI026 -DB Aplikace - MFF UK
155
DBI026 -DB Aplikace - MFF UK
T-SQL procedury CREATE PROCEDURE UpdEmpSal @xEmpNo INTEGER, @xSal INTEGER, @xComm INTEGER = NULL AS UPDATE Emp SET Sal Comm WHERE EXEC = = 15500; GO EXEC UpdEmpSal 4321, 14000, 500; GO DBI026 -DB Aplikace - MFF UK
156
DBI026 -DB Aplikace - MFF UK
PL/SQL funkce CREATE [OR REPLACE] FUNCTION jmfunc [(deklarace_parametru [, …])] RETURN typ {AS | IS} blok_bez_klíčového_slova_DECLARE; Návrat hodnoty RETURN výraz; Ukončí provádění funkce Funkce vždy musí vrátit hodnotu. Pokud ne, generuje se výjimka Volání funkce shodné s jakoukoli standardní funkcí SELECT jmfunc[(výraz [, …])] FROM …; Parametry se předávají podle pořadí SELECT jmfunc[(jméno=>výraz [, …])] FROM …; Parametry se předávají podle jména DBI026 -DB Aplikace - MFF UK
157
DBI026 -DB Aplikace - MFF UK
PL/SQL funkce CREATE FUNCTION Polynom2 ( x NUMBER, a NUMBER DEFAULT 0, b NUMBER DEFAULT 0, c NUMBER DEFAULT 0 ) RETURN NUMBER AS BEGIN RETURN (a*x+b)*x+c; END; / SELECT Polynom2(1, b=>2) FROM DUAL; -- 2*x, x=1, tj. 2 SELECT Polynom2(2, b=>3, c=>5) FROM DUAL; -- 3*x+5, x=2, tj. 11 SELECT Polynom2(2, 1, 1, 1) FROM DUAL; -- x2+x+1, x=2, tj. 7 DBI026 -DB Aplikace - MFF UK
158
DBI026 -DB Aplikace - MFF UK
T-SQL funkce CREATE FUNCTION jmfunc [(deklarace_parametru [, …])] RETURNS typ [AS] BEGIN … RETURN výraz; END [;] Volání funkce shodné se standardní funkcí, ale jméno musí být kvalifikované schématem Závorky musí být i v případě fce bez parametrů SELECT schema.jmfunc([{výraz|DEFAULT}[, …]]) FROM …; Parametry se předávají podle pořadí, mohou být předány defaultní hodnoty jako DEFAULT DBI026 -DB Aplikace - MFF UK
159
DBI026 -DB Aplikace - MFF UK
T-SQL funkce CREATE FUNCTION Polynom2 ( @x FLOAT, @a FLOAT = 0, @b FLOAT = 0, @c FLOAT = 0 ) RETURNS FLOAT AS BEGIN RETURN END; GO SELECT kop.Polynom2(1, DEFAULT, 2, DEFAULT); -- 2*x, x=1, tj. 2 SELECT kop.Polynom2(2, DEFAULT, 3, 5); -- 3*x+5, x=2, tj. 11 SELECT kop.Polynom2(2, 1, 1, 1); -- x2+x+1, x=2, tj. 7 DBI026 -DB Aplikace - MFF UK
160
T-SQL funkce vracející tabulku
CREATE FUNCTION jmfunc [(deklarace_parametru [, …])] RETURNS TABLE [AS] RETURN [(] SELECT …[)] Použití jako pohled (tentokrát i s parametry) SELECT * FROM jmfunc([výraz [, …]]); DBI026 -DB Aplikace - MFF UK
161
T-SQL funkce vracející tabulku
CREATE FUNCTION jmfunc [(deklarace_parametru [, …])] TABLE (def. tabulky) [AS] BEGIN tělo, vkládající data do RETURN END [;] Použití jako pohled (tentokrát i s parametry) SELECT * FROM jmfunc([výraz [, …]]); DBI026 -DB Aplikace - MFF UK
162
DBI026 -DB Aplikace - MFF UK
Řídící příkazy - IF IF podmínka THEN příkazyIF [ELSIF podmínka THEN příkazyELSIF1 [ELSIF podmínka THEN příkazyELSIF2…]] [ELSE příkazyELSE ] END IF; Podmínka, vyhodnocená jako NULL je považována za nesplněnou IF podmínka příkazIF | blokIF [ELSE příkazELSE | blokELSE] Podmínka, vyhodnocená jako NULL je považována za nesplněnou DBI026 -DB Aplikace - MFF UK
163
DBI026 -DB Aplikace - MFF UK
Řídící příkazy - WHILE WHILE podmínka LOOP … [EXIT WHEN podmínka] … END LOOP; While-cyklus s možným výskokem uprostřed WHILE podmínka příkazWHILE | blokWHILE BREAK ukončí cyklus CONTINUE ukončí iteraci DBI026 -DB Aplikace - MFF UK
164
DBI026 -DB Aplikace - MFF UK
Řídící příkazy - LOOP LOOP … [EXIT WHEN podmínka] … END LOOP; Obecný cyklus s výskokem uprostřed Výskok je možné realizovat i pomocí IF podmínka THEN exit; END IF; DBI026 -DB Aplikace - MFF UK
165
DBI026 -DB Aplikace - MFF UK
Řídící příkazy - FOR FOR I IN LOOP … [EXIT WHEN podmínka] … END LOOP; FOR I IN REVERSE LOOP … END LOOP; DBI026 -DB Aplikace - MFF UK
166
DBI026 -DB Aplikace - MFF UK
Řídící příkazy - GOTO GOTO návěští; … <<návěští>> příkaz; Za návěštím musí být příkaz, alespoň prázdný příkaz NULL; GOTO návěští … návěští : … DBI026 -DB Aplikace - MFF UK
167
DBI026 -DB Aplikace - MFF UK
Řídící příkazy PL/SQL Pojmenované bloky <<návěští>> DECLARE … BEGIN … END [návěští]; Pojmenované cykly <<návěští>> LOOP … END LOOP [návěští]; Umožňují přistupovat na překryté proměnné kvalifikací jménem bloku Umožňují vyskakovat z více cyklů najednou: EXIT návěští WHEN … DBI026 -DB Aplikace - MFF UK
168
SELECT příkazy – PL/SQL
SELECT výrazy INTO proměnné FROM … WHERE …; Musí vracet právě jednu řádku, jinak výjimka NO_DATA_FOUND TOO_MANY_ROWS DECLARE xEmpNo EMP.EmpNo%TYPE; xEName EMP.EName%TYPE; y Emp%ROWTYPE; BEGIN SELECT EmpNo, EName INTO xEmpNo, xEName FROM EMP WHERE EmpNo=1; SELECT * INTO y FROM EMP WHERE EmpNo=2; END; DBI026 -DB Aplikace - MFF UK
169
DBI026 -DB Aplikace - MFF UK
SELECT příkazy – T-SQL SELECT výrazy @proměnná=výraz [, …] FROM … WHERE …; Musí vracet právě jednu řádku, jinak výjimka DECLARE @xEmpNo INT, @xEName VARCHAR(30) SELECT @xEmpNo = EmpNo, @xEName = EName FROM EMP WHERE EmpNo=1 DBI026 -DB Aplikace - MFF UK
170
Víceřádkový SELECT - PL/SQL
Víceřádkové SELECT příkazy bez INTO lze zpracovat jedině pomocí kurzorů Kurzory mají atributy, dostupné přes konstrukci kurzor%atribut IsOpen BOOLEAN Found BOOLEAN NotFound BOOLEAN RowCount NUMBER DECLARE CURSOR C IS SELECT * FROM EMP; R C%RowType; BEGIN OPEN C; LOOP FETCH C INTO R; EXIT WHEN NOT C%Found; … END LOOP; CLOSE C; END; DBI026 -DB Aplikace - MFF UK
171
Víceřádkový SELECT – T-SQL
Víceřádkové SELECT příkazy bez INTO lze zpracovat jedině pomocí kurzorů Po každém FETCH je nutné zkontrolovat 0 … v pořádku -1 … za koncem kurzoru -2 … řádka chybí DECLARE C CURSOR FOR SELECT * FROM EMP; OPEN C; FETCH NEXT FROM C; WHILE BEGIN … FETCH NEXT FROM C; END; CLOSE C; DEALLOCATE C; DBI026 -DB Aplikace - MFF UK
172
Víceřádkový SELECT - PL/SQL
Jednodušší zpracování kurzorů nabízejí kurzorové FOR cykly DECLARE CURSOR C IS SELECT * FROM EMP; R C%RowType; BEGIN FOR R IN C LOOP … END LOOP; END; Tato proměnná se nepoužívá Automaticky deklarovaná proměnná, různá od té deklarované v bloku DBI026 -DB Aplikace - MFF UK
173
DBI026 -DB Aplikace - MFF UK
SELECT v PL/SQL Další možností je použití SELECT příkazu přímo v hlavičce FOR cyklu bez deklarace kurzoru DECLARE BEGIN FOR R IN ( SELECT * FROM EMP ) LOOP … END LOOP; END; DBI026 -DB Aplikace - MFF UK
174
DBI026 -DB Aplikace - MFF UK
Kurzory s parametry Deklarace CURSOR C(J VARCHAR2, D NUMBER) IS SELECT * FROM EMP WHERE Job=J AND DeptNo=D; Použití OPEN C(’Manager’,10); … CLOSE C; FOR R IN C(’Manager’,10) LOOP … END LOOP; DBI026 -DB Aplikace - MFF UK
175
DBI026 -DB Aplikace - MFF UK
Kurzory Deklarace C [SCROLL] CURSOR FOR SELECT …; Získání dat FETCH {NEXT | PRIOR | ABSOLUTE n | RELATIVE n | LAST | FIRST} FROM C [, …]] Pokud kurzor není deklarovaný s klíčovým slovem SCROLL, je možné použít jen NEXT DBI026 -DB Aplikace - MFF UK
176
DBI026 -DB Aplikace - MFF UK
Výjimky Slouží k ošetření výjimečných stavů při vykonávání SQL příkazů K výjimkám dochází velmi často Je nutné je korektně obsloužit DBI026 -DB Aplikace - MFF UK
177
DBI026 -DB Aplikace - MFF UK
Výjimky Typy výjimek Určené k ošetření na serveru či v klientské aplikaci Standardní pojmenované výjimky Generované serverem, mají přidělené jméno Standardní nepojmenované výjimky Generované serverem, nemají přidělené jméno Určené k ošetření na serveru Uživatelské vnitřní výjimky Definované uživatelem, mají jméno, nemají popis Určené k ošetření v klientské aplikaci Uživatelské aplikační výjimky Definované uživatelem, nemají jméno, mají popis DBI026 -DB Aplikace - MFF UK
178
Standardní pojmenované výjimky
Základní výjimky NO_DATA_FOUND TOO_MANY_ROWS DUP_VAL_ON_INDEX INVALID_NUMBER ZERO_DIVIDE Zachytávání EXCEPTION WHEN jm1 [OR jm2 …] THEN příkazy; [WHEN jm3 [OR …] THEN příkazy;] [WHEN OTHERS THEN příkazy;] Blok nezachytí výjimky generované v jeho deklarační části DECLARE x NUMBER := 0; y NUMBER := 1/x; /* ZERO_DIVIDE !! */ Ty jsou zachyceny nejdříve o úroveň výše Zachytí jakoukoli dosud neobslouženou výjimku DBI026 -DB Aplikace - MFF UK
179
Uživatelské vnitřní výjimky
Deklarace DECLARE X EXCEPTION; … Generování RAISE X; Zachytávání EXCEPTION [WHEN X THEN …;] WHEN OTHERS …; Problém předefinování <<Vnejsi>> DECLARE X EXCEPTION; BEGIN <<Vnitrni>> DECLARE X EXCEPTION; BEGIN RAISE X; END Vnitrni; EXCEPTION WHEN X THEN …; END Vnejsi; X neošetřeno, propaguje se výš Jiné – Vnejsi.X neošetří Vnitrni.X DBI026 -DB Aplikace - MFF UK
180
Standardní nepojmenované výjimky
Vlastní pojmenování DECLARE X EXCEPTION; PRAGMA EXCEPTION_INIT(X,-54) /* ORA ~ Resource locked */ Zachytávání EXCEPTION WHEN X THEN …; EXCEPTION WHEN OTHERS THEN …; Opětovné vyvolání jakékoli obsloužené výjimky, pokud se má obsloužit i ve vyšších úrovních EXCEPTION … WHEN … THEN … RAISE; DBI026 -DB Aplikace - MFF UK
181
Uživatelské aplikační výjimky
Generování RAISE_APPLICATION_ERROR( , -- číslo výjimky <-20100;-20001> ’Popis’, -- text vysvětlující příčinu ); Pokud se přidá třetí parametr FALSE, výjimka se pouze uloží na zásobník výjimek, ale běh se nepřeruší. To umožňuje vrátit více výjimek, kdy spodní je příčinou té horní DBI026 -DB Aplikace - MFF UK
182
DBI026 -DB Aplikace - MFF UK
Výjimky - příklad CREATE PROCEDURE InsEmp ( xEmpNo NUMBER, xEName VARCHAR2, xSal NUMBER DEFAULT NULL) AS xS NUMBER; BEGIN xS := xSal; IF xS IS NULL THEN SELECT MIN(Sal) INTO xS FROM EMP; END IF; INSERT INTO Emp(EmpNo,EName,Sal) VALUES(xEmpNo,xEName,xS); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN RAISE_APPLICATION_ERROR( , ’Zaměstnanec ’||xEmpNo||’ již existuje!’ ); END; / EXEC InsEmp(1234,’Novák’); DBI026 -DB Aplikace - MFF UK
183
DBI026 -DB Aplikace - MFF UK
Výjimky – T-SQL BEGIN TRY příkaz END TRY BEGIN CATCH příkaz END CATCH Funkce pro identifikaci chyb ERROR_NUMBER() ERROR_SEVERITY() ERROR_STATE() ERROR_PROCEDURE() ERROR_LINE() ERROR_MESSAGE() DBI026 -DB Aplikace - MFF UK
184
DBI026 -DB Aplikace - MFF UK
Výjimky – T-SQL BEGIN TRY příkaz END TRY BEGIN CATCH příkaz END CATCH Zachyceny nejsou Varování s ERROR_SEVERITY<=10 Chyby s ERROR_SEVERITY>20 pokud zastavují vykonávání pro session O úroveň výše zachyceny Kompilační chyby DBI026 -DB Aplikace - MFF UK
185
DBI026 -DB Aplikace - MFF UK
Výjimky – T-SQL BEGIN TRY SELECT 1/0; -- zero divide … END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage; END CATCH; GO DBI026 -DB Aplikace - MFF UK
186
Uživatelské aplikační výjimky
Generování RAISERROR({ msg_id -- číslo výjimky, >= | msg_str -- text výjimky -- text výjimky v proměnné }, severity, state, argument [, …]) Jednotlivé zprávy lze předpřipravit pomocí sp_addmessage a poté se odkazovat jen pomocí msg_id msg_str může obsahovat odkazy na parametry, podobně jako C-funkce printf, hodnoty předány v argumentech Severity je závažnost chyby pouze skup. sysadmin DBI026 -DB Aplikace - MFF UK
187
Přednáška č. 4 Zabezpečení dat Triggery, práva
188
DBI026 -DB Aplikace - MFF UK
Triggery Speciální typ uložené procedury Aktivují se automaticky při splnění nějaké podmínky na serveru Aktualizace dat (zde popsané) Události spojené s DB nebo session Přihlášení, vytvoření/zrušení tabulky atd DBI026 -DB Aplikace - MFF UK
189
Pojmenovávání triggerů
Triggery mohou být pojmenovány libovolným identifikátorem Je vhodné jména konstruovat systematicky tak, aby bylo poznat, ke které tabulce se vztahují, na jakou operaci reagují a další pomocné informace DBI026 -DB Aplikace - MFF UK
190
Použití tabulkových triggerů
Detailní ověření dat v tabulce, nedosažitelné pomocí integritních omezení Typicky BEFORE row-level triggery Ověření oprávnění provést danou operaci Typicky BEFORE statement-level triggery Žurnálování starých hodnot tabulky Typicky AFTER row-level triggery Žurnálování historie operací nad tabulkou Typicky AFTER statement-level triggery Replikace dat DBI026 -DB Aplikace - MFF UK
191
Tabulkové triggery – PL/SQL
CREATE [OR REPLACE] TRIGGER jm_triggeru {BEFORE | AFTER} {INSERT | DELETE | UPDATE [OF sloupec]} ON jm_tabulky [FOR EACH ROW] [REFERENCING OLD AS jm_old NEW AS jm_new] [WHEN (podmínka)] blok kódu PL/SQL; Definují, co se má provést před, resp. po změně dat v DB Row-level triggery se opakují pro každý řádek, ostatní (statement-level) triggery pro příkaz jako celek DBI026 -DB Aplikace - MFF UK
192
Tabulkové triggery – PL/SQL
Aktualizace tabulky se provede takto: 1. BEFORE statement-level triggery 2. BEFORE row-level triggery 3. Aktualizace řádky 4. AFTER row-level triggery 5. AFTER statement-level triggery Pokud kterýkoli krok selže, tj. vrátí neošetřenou výjimku, aktualizace je neplatná Může být definováno více triggerů stejného typu, ale není pro ně definováno relativní pořadí DBI026 -DB Aplikace - MFF UK
193
Tabulkové triggery –T-SQL
CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ WITH APPEND ] AS [{IF UPDATE ( column ) [{ AND | OR } UPDATE ( column ) ] … | IF ( COLUMNS_UPDATED ( bitwise_operator updated_bitmask )}] sql_statement [...] DBI026 -DB Aplikace - MFF UK
194
Tabulkové triggery – T-SQL
Aktualizace tabulky se provede takto: 1. Kontrola integritních omezení 2. Vytvoření tabulek deleted a updated 2. Aktualizace / INSTEAD OF trigger 3. AFTER triggery (totéž, co FOR triggery) Pokud je operace shledána nekorektní, je možné transakci odrolovat pomocí ROLLBACK TRANSACTION V MS SQL 6.5 je pro možnost vytváření více triggerů stejného typu nutné přidat WITH APPEND klauzuli. V MS SQL 7.0+ je tato klauzule již označována za OBSOLETE. Pořadí vykonávání triggerů je možné definovat pomocí procedury sp_settriggerorder DBI026 -DB Aplikace - MFF UK
195
DBI026 -DB Aplikace - MFF UK
Triggery Typy aktualizací lze spojovat v rámci jediného triggeru V Oracle pomocí OR CREATE TRIGGER … BEFORE INSERT OR UPDATE ON … V těle triggerů definovány booleovské predikáty INSERTING, UPDATING, DELETING V MS SQL pomocí oddělení čárkou CREATE TRIGGER … ON … FOR INSERT, UPDATE DBI026 -DB Aplikace - MFF UK
196
DBI026 -DB Aplikace - MFF UK
Tabulkové triggery INSTEAD OF triggery slouží pro definici vlastního postupu aktualizace dat Spouští se místo standardních operací INSERT, UPDATE, DELETE V Oracle jsou povolené pouze nad pohledy, ostatní pouze nad tabulkami MS SQL tabulky a pohledy v tomto směru nerozlišuje DBI026 -DB Aplikace - MFF UK
197
DBI026 -DB Aplikace - MFF UK
Tabulkové triggery Scénář I: Ověření práva na provedení operace Spouští se obvykle před provedením příkazu, a nekontrolují měněná data Mohou zjistit, zda je uživatel přihlášen ze správného terminálu, zda provádí operaci ve vyhrazeném čase (pracovní době), a řadu dalších kontrol, nedostupných pomocí integritních omezení DBI026 -DB Aplikace - MFF UK
198
Tabulkové triggery – PL/SQL
Např.: CREATE OR REPLACE TRIGGER bef_ins_Emp BEFORE INSERT ON Emp BEGIN IF USERENV(’TERMINAL’) NOT LIKE ’PERS%’ THEN RAISE_APPLICATION_ERROR( , ’Zaměstnance lze přijímat pouze na personálním oddělení’ ); END IF; END; / DBI026 -DB Aplikace - MFF UK
199
DBI026 -DB Aplikace - MFF UK
Tabulkové triggery Scénář II: Doplnění funkčně závislých hodnot do jednotlivých řádek Provádí se před provedením operace na každé řádce DBI026 -DB Aplikace - MFF UK
200
Tabulkové triggery – PL/SQL
V rámci row-level triggerů jsou definovány dva záznamy NEW a OLD obsahující data před změnou a po ní INSERT triggery jen NEW DELETE triggery jen OLD UPDATE triggery obojí Jména lze změnit pomocí klauzule REFERENCING DBI026 -DB Aplikace - MFF UK
201
Tabulkové triggery – PL/SQL
Např.: CREATE OR REPLACE TRIGGER bef_ins_Emp_row BEFORE INSERT ON Emp FOR EACH ROW BEGIN -- přidáni umělého klíče IF :NEW.EmpNo IS NULL THEN -- doplnění čísla zaměstnance ze sekvence SELECT SeqEmpNo.nextval INTO :NEW.EmpNo -- před NEW a OLD se píše dvojtečka FROM DUAL; END IF; END; / DBI026 -DB Aplikace - MFF UK
202
Tabulkové triggery – PL/SQL
Spuštění triggeru může být podmíněno splněním podmínky uvedené v klauzuli WHEN CREATE OR REPLACE TRIGGER bef_ins_Emp_row BEFORE INSERT ON Emp FOR EACH ROW WHEN (NEW.EmpNo IS NULL) -- ve WHEN klauzuli se před NEW a OLD dvojtečka nepíše BEGIN SELECT SeqEmpNo.nextval INTO :NEW.EmpNo FROM DUAL; END; / DBI026 -DB Aplikace - MFF UK
203
Tabulkové triggery – T-SQL
V rámci triggerů jsou definovány dvě pseudo-tabulky inserted a deleted, obsahující nové a staré verze záznamů DBI026 -DB Aplikace - MFF UK
204
DBI026 -DB Aplikace - MFF UK
Tabulkové triggery Scénář III: Kontrola vkládaných dat. Provádí se před provedením operace na každé řádce DBI026 -DB Aplikace - MFF UK
205
DBI026 -DB Aplikace - MFF UK
Triggery PL/SQL Např.: CREATE OR REPLACE TRIGGER bef_ins_upd_Emp_row BEFORE UPDATE ON Emp FOR EACH ROW BEGIN IF :NEW.Sal > :OLD.Sal * 1.1 THEN RAISE_APPLICATION_ERROR( ,’Plat může být zvýšen maximálně o 10%.’ ); END IF; END; DBI026 -DB Aplikace - MFF UK
206
DBI026 -DB Aplikace - MFF UK
Tabulkové triggery Scénář IV: Kontrola vkládaných dat, doplnění závislých hodnot v MS SQL. Nutno provést až po aktualizační operaci s využitím tabulek deleted a inserted. DBI026 -DB Aplikace - MFF UK
207
DBI026 -DB Aplikace - MFF UK
Triggery T-SQL Např. CREATE TRIGGER employee_insupd ON emp FOR INSERT, UPDATE AS DECLARE @emp_lvl smallint SELECT @emp_lvl = = i.job_id FROM emp AS e INNER JOIN inserted i ON e.emp_id = i.emp_id JOIN jobs j ON j.job_id = i.job_id IF = 1) and <> 10) BEGIN RAISERROR ('Job id 1 expects the default level of 10.', 16, 1) ROLLBACK TRANSACTION END DBI026 -DB Aplikace - MFF UK
208
DBI026 -DB Aplikace - MFF UK
Triggery T-SQL Např. CREATE TRIGGER employee_insupd ON emp FOR INSERT, UPDATE AS BEGIN UPDATE e SET empname = upper(empname) FROM emp AS e JOIN inserted i ON e.emp_id = i.emp_id WHERE UPDATED(empname) END DBI026 -DB Aplikace - MFF UK
209
DBI026 -DB Aplikace - MFF UK
Tabulkové triggery Scénář V: Žurnálování změn v tabulce. Vhodné provést až po úspěšné aktualizační operaci. Je možné zapamatovat si původní i novou hodnotu, čas aktualizace, jejího autora a podobně DBI026 -DB Aplikace - MFF UK
210
DBI026 -DB Aplikace - MFF UK
Triggery PL/SQL Např.: CREATE OR REPLACE TRIGGER aft_upd_Emp_row AFTER UPDATE ON Emp FOR EACH ROW WHEN (OLD.Sal <> NEW.Sal) BEGIN INSERT INTO Zurnal(Kdo, Kdy, Puvodni, Novy) VALUES(USER, SYSDATE, :OLD.Sal, :NEW.Sal); END; DBI026 -DB Aplikace - MFF UK
211
DBI026 -DB Aplikace - MFF UK
Triggery T-SQL Např.: CREATE TRIGGER aft_upd_Emp ON employee FOR UPDATE AS BEGIN INSERT INTO Zurnal(Kdo, Kdy, Puvodni, Novy) SELECT CURRENT_USER, CURRENT_DATE, d.Sal, e.Sal FROM deleted AS d JOIN employee AS e ON d.emp.id=e.emp_id WHERE UPDATED(Sal); END; DBI026 -DB Aplikace - MFF UK
212
Triggery na pohledech – PL/SQL
CREATE [OR REPLACE] TRIGGER jm_triggeru INSTEAD OF {INSERT | DELETE | UPDATE [OF sloupec]} ON jm_pohledu FOR EACH ROW [REFERENCING OLD AS jm_old NEW AS jm_new] [WHEN (podmínka)] blok kódu PL/SQL; Definují, jak se má provést změna dat v DB DBI026 -DB Aplikace - MFF UK
213
DBI026 -DB Aplikace - MFF UK
Datový slovník Pohledy USER_TRIGGERS USER_SOURCE Pohledy SYS.TRIGGERS SYS.TRIGGER_EVENTS DBI026 -DB Aplikace - MFF UK
214
DBI026 -DB Aplikace - MFF UK
Práva k objektům v SQL Standardně má každý uživatel přístup jen k datům ve svém schématu Přístup k dalším objektům je nutné explicitně povolit pomocí příkazu GRANT, případně opětovně zakázat pomocí příkazu REVOKE DBI026 -DB Aplikace - MFF UK
215
DBI026 -DB Aplikace - MFF UK
Práva k objektům v SQL Standardně má každý uživatel přístup jen k datům ve svém schématu Přístup k dalším objektům je nutné explicitně povolit pomocí příkazu GRANT, případně opětovně zakázat pomocí příkazu REVOKE DBI026 -DB Aplikace - MFF UK
216
Práva k objektům v SQL GRANT
GRANT {ALL [PRIVILEGES] | právo [, …]} ON objekt TO {PUBLIC | uživatel | skupina } [, …] [WITH GRANT OPTION] DBI026 -DB Aplikace - MFF UK
217
Práva k objektům v SQL GRANT
SELECT INSERT UPDATE ALTER EXECUTE … WITH GRANT OPTION Nabyvatel práv může tyto práva dále propůjčovat Pokud tento uživatel o právo v budoucnosti přijde, odebere se i těm, kterým ho propůjčil DBI026 -DB Aplikace - MFF UK
218
DBI026 -DB Aplikace - MFF UK
Práva a role GRANT SELECT, INSERT ON Zamestnanec TO SCOTT; GRANT ALL EXCEPT DROP ON Oddeleni TO SCOTT WITH GRANT OPTION; GRANT SELECT ON Zamestnanec TO PUBLIC; SCOTT může číst a doplňovat data v mé tabulce Zamestnanec SCOTT nemůže tabulku zrušit, ale může propůjčovat svá práva dalším Kdokoli může číst data DBI026 -DB Aplikace - MFF UK
219
DBI026 -DB Aplikace - MFF UK
Práva a role CREATE ROLE Student; GRANT Student TO Novak; GRANT SELECT ON Emp TO Student; CREATE ROLE Seminar [IDENTIFIED BY heslo]; GRANT UPDATE, INSERT ON Emp TO Seminar; GRANT Student TO Seminar; Vytvoř roli Zařaď Nováka mezi studenty Všichni studenti mohou číst data z tabulky Emp Další (zaheslovaná) role Účastníci semináře mohou data měnit a vytvářet Účastníci semináře jsou zároveň studenty DBI026 -DB Aplikace - MFF UK
220
DBI026 -DB Aplikace - MFF UK
Práva k objektům v SQL V databázi může díky WITH GRANT OPTION existovat více než jedna cesta, která propůjčuje uživateli nějaké právo na daný objekt. Uživatel je oprávněn danou operaci provádět, dokud existuje alespoň jedna taková cesta DBI026 -DB Aplikace - MFF UK
221
DBI026 -DB Aplikace - MFF UK
Práva a role SCOTT.Emp SCOTT ALL Seminar Student SELECT UPDATE INSERT ALL WITH G.O. NOVAK UPDATE DELETE WITH G.O. KOPECKY DBI026 -DB Aplikace - MFF UK
222
DBI026 -DB Aplikace - MFF UK
Využití práv přístupu Díky právům je možné zcela oddělit uživatele, který data vlastní (a může s nimi provádět cokoli včetně zrušení tabulek) od uživatel, kteří s daty pracují v klientských aplikacích Uživatelé se mohou hlásit pod jiná schémata a pracovat s daty, které jim nepatří. Mohou tak provádět pouze operace, které jim vlastník explicitně povolil Nemohou například deaktivovat triggery a integritní omezení DBI026 -DB Aplikace - MFF UK
223
Práva k objektům v SQL REVOKE
REVOKE {ALL [PRIVILEGES] | právo [, …]} ON objekt FROM {PUBLIC | uživatel | skupina } [, …] DBI026 -DB Aplikace - MFF UK
224
Přístup k cizím objektům
Prostřednictvím tečkové notace název_schematu.název_objektu DBI026 -DB Aplikace - MFF UK
225
Přístup k datům pomocí procedur, funkcí a triggerů
Procedury, funkce a triggery se standardně vykonávají pod uživatelem, který je definoval (obdoba propůjčení identity v OS UNIX/Linux) To je vhodné pro odstínění uživatele od tabulek, se kterými se manipuluje Uživatel, který je spouští, nemusí mít práva pro manipulaci s tabulkami DBI026 -DB Aplikace - MFF UK
226
Přístup k datům pomocí procedur, funkcí a triggerů
V některých případech je potřebné, aby se procedura vykonávala s právy uživatele, který ji spouští V Oracle pomocí klauzule AUTHID {CURRENT_USER|DEFINER} CURRENT_USER ~ s právy uživatele, volajícího fci, proceduru, … DEFINER ~ s právy toho, kdo proceduru vlastní V MS SQL pomocí klauzule EXECUTE AS {CALLER|SELF|OWNER|’username’} CALLER ~ s právy uživatele, volajícího fci, proceduru, … SELF ~ s právy toho, kdo proceduru vytvořil OWNER ~ s právy toho, kdo proceduru vlastní ’username’ ~ s právy daného uživatele DBI026 -DB Aplikace - MFF UK
227
Přístup k datům pomocí procedur, funkcí a triggerů
Např. CREATE OR REPLACE PROCEDURE p AUTHID CURRENT_USER AS …; CREATE OR REPLACE FUNCTION f RETURN NUMERIC AUTHID CURRENT_USER AS …; DBI026 -DB Aplikace - MFF UK
228
Přístup k datům pomocí procedur, funkcí a triggerů
Např. CREATE PROCEDURE p AS … EXECUTE AS … CREATE FUNCTION f RETURNS NUMERIC AS … EXECUTE AS … DBI026 -DB Aplikace - MFF UK
229
Provedení operace v nezávislé transakci
Některé operace je vhodné provést nezávisle na to, zda se podaří či nepodaří aktualizace, se kterou je operace svázána Např. vhodné pro žurnálování pokusů o provedení nedovolené operace, které se odporují integritním omezením, a proto se neuloží. V Oracle pomocí PRAGMA AUTONOMOUS_TRANSACTION v deklaraci bloku DBI026 -DB Aplikace - MFF UK
230
Provedení operace v nezávislé transakci
Např. CREATE OR REPLACE PROCEDURE p AS PRAGMA AUTONOMOUS_TRANSACTION; …; DBI026 -DB Aplikace - MFF UK
231
Víceuživatelský režim
Je nutné mít na paměti, že databázová aplikace nad daty neběží obvykle sama Většinou běží nad daty několik (desítek, stovek) instancí téže aplikace, případně různé aplikace, pracující se stejnými daty Je nutné, aby aplikace běžela korektně i v paralelním režimu! DBI026 -DB Aplikace - MFF UK
232
Víceuživatelský režim
Kontroly by měly být prováděny „co nejblíže“ k uloženým datům Co lze provést pomocí definic integritních omezení, definovat s jejich pomocí Co lze následně provést pomocí triggerů, provést pomocí triggerů Kontroly, aktualizace závislých hodnot v databázi, … Procedury a funkce pro manipulaci s daty DBI026 -DB Aplikace - MFF UK
233
Víceuživatelský režim
Hlídání unikátnosti sloupce jinak než pomocí UNIQUE / PRIMARY KEY nebude pravděpodobně fungovat Posloupnost SELECT COUNT(*) FROM … IF /* řádka neexistuje */ INSERT INTO … nemusí jít spustit paralelně, obě transakce mohou nejprve zjistit počet a potom obě zapsat stejnou řádku DBI026 -DB Aplikace - MFF UK
234
Víceuživatelský režim
Stupně izolace transakcí dle ANSI SQL READ UNCOMMITED Může nastat: Dirty read, Nonrepeatable Read, Phantom Read READ COMMITED Může nastat: Nonrepeatable Read, Phantom Read REPEATABLE READ Může nastat: Phantom Read SERIALIZABLE DBI026 -DB Aplikace - MFF UK
235
Víceuživatelský režim
Oracle standardně garantuje pouze konzistenci na úrovni příkazů, ekvivalentní nastavení SET TRANSACTION ISOLATION LEVEL READ COMMITED Lze nastavit přísnější kontrolu SET TRANSACTION ISOLATION LEVEL SERIALIZABLE která se ale hodí pouze pro krátké transakce DBI026 -DB Aplikace - MFF UK
236
Víceuživatelský režim
MS SQL podporuje všechny úrovně izolace Ve verzi 6.5 je REPEATABLE READ shodná s přísnější variantou SERIALIZABLE Od verze 7.0 jsou díky existenci řádkových zámků obě úrovně rozlišené DBI026 -DB Aplikace - MFF UK
237
Přednáška č. 5 Transakce
238
Transakční zpracování
Dovoluje uzavírat více logicky souvisejících příkazů do jediné atomické operace SŘBD zajistí, aby se provedly a permanentně uložily výsledky všech příkazů, nebo žádný z nich Příkazy dle SQL-92 COMMIT [WORK] … potvrzení transakce ROLLBACK [WORK] … odvolání transakce DBI026 -DB Aplikace - MFF UK
239
Transakční zpracování
Na konci každé transakce musí být databáze v konzistentním stavu Integritní omezení se standardně kontrolují po každé operaci Integritní omezení má dva příznaky: DEFERRABLE a DEFERRED [CONSTRAINT jméno] definice_omezení [INITIALLY {DEFERRED|IMMEDIATE}] [[NOT] DEFERRABLE] Pokud jsou oba příznaky zapnuté, kontrola se provádí při COMMITu. Pokud nejsou splněny, provede se ROLLBACK DBI026 -DB Aplikace - MFF UK
240
Víceuživatelský režim
Oracle automaticky zahajuje transakce, jakmile je předchozí transakce ukončena. Transakce nemohou být hnízděné (Procedury, funkce a triggery mohou běžet v samostatných nezávislých transakcích) DBI026 -DB Aplikace - MFF UK
241
Víceuživatelský režim
MS SQL dovoluje rovněž syntaxi COMMIT TRANSACTION [name|:var] ROLLBACK TRANSACTION [name|:var] pro ukončení transakce, začaté příkazem BEGIN TRANSACTION [name|:var] Transakce mohou být hnízděné DBI026 -DB Aplikace - MFF UK
242
Transakční zpracování
Bod zotavení (SAVEPOINT) V rámci transakce je možné vytvářet pojmenované kontrolní body, které slouží k částečnému odvolávání transakcí Vhodné např. pokud je potřeba nějakou část transakce při neúspěchu zopakovat, s možností zachování předcházejících operací v transakci beze změny S1 DBI026 -DB Aplikace - MFF UK
243
Víceuživatelský režim
Oracle používá standardní syntaxi SAVEPOINT name; ROLLBACK [WORK] TO SAVEPOINT name; DBI026 -DB Aplikace - MFF UK
244
Víceuživatelský režim
MS SQL používá syntaxi SAVE TRANSACTION name|:var ROLLBACK TRANSACTION name|:var DBI026 -DB Aplikace - MFF UK
245
Explicitní zamykání
246
DBI026 -DB Aplikace - MFF UK
Explicitní zamykání Za běžných okolností provádí zamykání řádek v tabulkách databázový server sám na základě nastavení úrovně izolace příkazem SET TRANSACTION ISOLATION LEVEL V některých případech je potřebné či žádoucí zamknout některé řádky či celé tabulky explicitně DBI026 -DB Aplikace - MFF UK
247
DBI026 -DB Aplikace - MFF UK
Explicitní zamykání Kdy zamykat tabulky před provedením hromadných aktualizací dat v tabulce či tabulkách migrace na jinou strukturu dat hromadné zpracování dat na přelomu roku inventury ... lze použít rovněž jako synchronizační prvek (semafor) pro vzájemné vyloučení více klientů v kritické sekci aplikace DBI026 -DB Aplikace - MFF UK
248
DBI026 -DB Aplikace - MFF UK
Explicitní zamykání Kdy zamykat řádky Například řádka v nadřízené tabulce při manipulaci s podřízenými řádkami Zabránění současné manipulace s daty více transakcemi DBI026 -DB Aplikace - MFF UK
249
Explicitní zamykání v Oracle
Uzamknutí řádek získaných SELECT příkazem v exkluzivním režimu SELECT …FOR UPDATE [NOWAIT]; Pokud je uvedeno NOWAIT, Oracle vrací výjimku ORA DECLARE UZAMKNUTO EXCEPTION; PRAGMA EXCEPTION_INIT(UZAMKNUTO,-54); BEGIN … EXCEPTION WHEN UZAMKNUTO THEN …; END; DBI026 -DB Aplikace - MFF UK
250
Explicitní zamykání v Oracle
Uzamknutí řádek získaných SELECT příkazem v exkluzivním režimu SELECT …FOR UPDATE [NOWAIT]; Pokud není uvedeno NOWAIT, transakce je zablokována do uvolnění zámku ostatními transakcemi. Může dojít k deadlocku. V takovém případě je v některé z transakcí generována výjimka ORA-00060 DBI026 -DB Aplikace - MFF UK
251
Explicitní zamykání v MS SQL
Uzamknutí stránek/řádek získaných SELECT příkazem: BEGIN TRAN[SACTION] SELECT …WITH (požadavky_na_zamykání); NOLOCK … nevytvářet sdílený z., ignorovat exist. z. HOLDLOCK … ponechat sdílený z. do konce transakce UPDLOCK … vytvořit aktualizační zámek do konce transakce READ[UN]COMMITTED, REPEATABLEREAD, SERIALIZABLE … stejná sémantika jako při odpovídajícím nastavení transakce DBI026 -DB Aplikace - MFF UK
252
Explicitní zamykání v MS SQL
Uzamknutí stránek/řádek získaných SELECT příkazem: BEGIN TRAN[SACTION] SELECT …WITH (požadavky_na_zamykání); READPAST … vynechá zamčené řádky ROWLOCK … jemnější řádkové z. místo (defaultních) stránkových zámků PAGLOCK … defaultní stránkové zamykání DBI026 -DB Aplikace - MFF UK
253
Explicitní zamykání v Oracle
Uzamknutí tabulky možné jak v exkluzivním, tak sdíleném režimu. Ve sdíleném režimu může tabulku souběžně uzamknout více transakcí. Číst data z tabulky mohou číst i ostatní transakce. LOCK TABLE t IN {SHARED | EXCLUSIVE} MODE [NOWAIT]; DBI026 -DB Aplikace - MFF UK
254
Explicitní zamykání v MS SQL
Uzamknutí stránek/řádek získaných SELECT příkazem: BEGIN TRAN[SACTION] SELECT …WITH (požadavky_na_zamykání); TABLOCK … sdílený zámek na celé tabulce do konce příkazu, spolu s HOLDLOCK do konce transakce TABLOCKX … exkluzivní zámek na celé tabulce do konce příkazu, spolu s HOLDLOCK do konce transakce DBI026 -DB Aplikace - MFF UK
255
DBI026 -DB Aplikace - MFF UK
Odemknutí zámků Odemyká se pouze implicitně současně s ukončením transakce COMMIT; Změny se potvrdí a zámky uvolní ROLLBACK; Změny se odvolají a zámky uvolní ROLLBACK TO SAVEPOINT jméno; resp. ROLLBACK TRANSACTION jméno|:proměnná Odvolá změny v Oracle, resp. MS SQL od uvedené značky a uvolní odpovídající zámky DBI026 -DB Aplikace - MFF UK
256
DBI026 -DB Aplikace - MFF UK
Použití zámků v Oracle DECLARE CURSOR C(d NUMBER) IS SELECT * FROM Emp WHERE DeptNo=d FOR UPDATE NOWAIT; UZAMKNUTO EXCEPTION; PRAGMA EXCEPTION_INIT(UZAMKNUTO,-54); BEGIN <<Pokusy>> FOR I IN LOOP BEGIN FOR R IN C(10) LOOP … END LOOP; EXIT Pokusy; -- Úspěšný pokus, dále nezkoušet EXCEPTION WHEN UZAMKNUTO THEN NULL; END; END LOOP Pokusy; END; DBI026 -DB Aplikace - MFF UK
257
DBI026 -DB Aplikace - MFF UK
Použití zámků v MS SQL BEGIN TRANS = COUNT(*) FROM tbl WITH ( TABLOCK, UPDLOCK, HOLDLOCK ) DBI026 -DB Aplikace - MFF UK
258
Množinové operace, UNION [ALL], INTERSECT, EXCEPT
259
DBI026 -DB Aplikace - MFF UK
Množinové operace SQL Pro množinové operace jsou v ANSI SQL definovány tři operátory UNION [ALL] SELECT … FROM … WHERE … UNION ALL SELECT … FROM … WHERE … UNION ALL … Pokud není uvedeno ALL, obsahuje výsledek unikátní řádky, jinak se jen výsledky spojí za sebe Unikátní UNION vyžaduje třídění a slévání výsledků, pokud je to možné, je žádoucí se mu vyhnout INTERSECT Průnik výsledků dvou a více SELECT příkazů EXCEPT (Oracle používá vlastní operátor MINUS) DBI026 -DB Aplikace - MFF UK
260
Příkaz WITH, Rekurzivní dotazy
261
Rekurzivní dotazy a SQL
Standardní SQL obsahuje podporu pro rekurzi od verze ANSI SQL-99 v příkazu WITH Oracle podporuje od verze 9i release 2 omezenou sémantiku bez podpory rekurze MS SQL podporuje od verze MS SQL Server 2005 Oracle SQL navíc pro rekurzi obsahuje proprietární řešení (s omezenějšími možnostmi) s pomocí speciálních klauzulí START WITH a CONNECT BY příkazu SELECT DBI026 -DB Aplikace - MFF UK
262
DBI026 -DB Aplikace - MFF UK
Příkaz WITH WITH t1[(c11[,…])] AS (SELECT …) [,t2[(c21[,…])] AS (SELECT …) SELECT … FROM t1, t2, … Konstrukt WITH definuje zdroje t1, t2, … ze kterých se data vybírají Definice zdroje se může (a nemusí) odkazovat na svojí vlastní definici, či definice předchozích zdrojů v příkazu WITH SELECT se může a nemusí odkazovat na zdroje DBI026 -DB Aplikace - MFF UK
263
DBI026 -DB Aplikace - MFF UK
Příkaz WITH Příklad: Nejvyšší počet zaměstnanců v jednom oddělení WITH x AS ( SELECT OddID, COUNT(*) AS Poc FROM Zamestnanec GROUP BY OddID) SELECT MAX(Poc) FROM x; DBI026 -DB Aplikace - MFF UK
264
DBI026 -DB Aplikace - MFF UK
Příkaz WITH S použitím WITH WITH x AS ( SELECT OddID, COUNT(*) AS Poc FROM Zamestnanec GROUP BY OddID ) SELECT MAX(Poc) FROM x; Bez použití WITH SELECT MAX(Poc) FROM ( SELECT OddID, COUNT(*) AS Poc FROM Zamestnanec GROUP BY OddID ) x DBI026 -DB Aplikace - MFF UK
265
Rekurzivní dotazy a SQL
Příklad: Tabulka Zamestnanec s následující strukturou: ZamID … ID zaměstnance Jmeno … Jméno zaměstnance VedID … ID přímého nadřízeného Je potřeba vypsat zaměstnance spolu s informací, na jaké úrovni řízení jsou zaměstnáni. Zaměstnanci bez vedoucích jsou na první úrovni DBI026 -DB Aplikace - MFF UK
266
Rekurzivní dotazy a SQL
Příklad: WITH z AS ( SELECT Jmeno, 1 AS Uroven FROM Zamestnanec x WHERE VedID IS NULL UNION ALL SELECT Jmeno, Uroven+1 AS Uroven FROM Zamestnanec y JOIN z ON (y.VedID=z.ZamID) ) SELECT * FROM z; DBI026 -DB Aplikace - MFF UK
267
DBI026 -DB Aplikace - MFF UK
Stromy v Oracle SQL SELECT sloupce FROM tabulka [WHERE podmínka3] START WITH podmínka1 CONNECT BY podmínka2 [ORDER BY …] Řádky vyhovující podmínce ve START WITH jsou považovány za kořenové řádky na první úrovni vnoření DBI026 -DB Aplikace - MFF UK
268
DBI026 -DB Aplikace - MFF UK
Stromy v Oracle SQL SELECT sloupce FROM tabulka [WHERE podmínka3] START WITH podmínka1 CONNECT BY podmínka2 [ORDER BY …] Pro každou řádku na úrovni i se rekurzivně hledají přímí potomci vyhovující podmínce v klauzuli CONNECT BY na úrovni i+1 Řádka předka se v podmínce označuje klíčovým slovem PRIOR DBI026 -DB Aplikace - MFF UK
269
DBI026 -DB Aplikace - MFF UK
Stromy v Oracle SQL SELECT sloupce FROM tabulka [WHERE podmínka3] START WITH podmínka1 CONNECT BY podmínka2 [ORDER BY …] Na závěr jsou odstraněny řádky nevyhovující podmínce ve WHERE DBI026 -DB Aplikace - MFF UK
270
DBI026 -DB Aplikace - MFF UK
Stromy v Oracle SQL SELECT sloupce FROM tabulka [WHERE podmínka3] START WITH podmínka1 CONNECT BY podmínka2 [NOCYCLE] [ORDER BY …] Pokud není definováno třídění, odpovídá pořadí průchodu pre-order Každý řádek obsahuje pseudo-sloupec LEVEL, obsahující úroveň řádku v hierarchii DBI026 -DB Aplikace - MFF UK
271
Rekurzivní dotazy a SQL
Příklad: SELECT Jmeno, Level AS Uroven FROM Zamestnanec z START WITH VedID IS NULL CONNECT BY PRIOR ZamID = VedID; SELECT -- s odsazením dle úrovně LPAD(Jmeno,2*Level) AS Jmeno, … DBI026 -DB Aplikace - MFF UK
272
CASE výrazy
273
DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy V řadě případů je potřeba hodnotu výrazu podřídit nějakému větvícímu se rozhodování význam dle číselníku 1 ~ pondělí … 7 ~ neděle 0 ~ 0% DPH, 1 ~ 14% DPH, 2 ~ 20% DPH … Vytvářet funkci pro každý takový případ, nebo používat poddotaz do číselníku může být časově náročné (množina hodnot je omezená a nemění se v čase – u DPH to bohužel až tak neplatí) DBI026 -DB Aplikace - MFF UK
274
DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy SQL-92 definuje dvě podoby CASE výrazu a) jednoduchý (simple) CASE výraz: CASE výraz WHEN vzor1 THEN obraz1 WHEN vzor2 THEN obraz2 … [ELSE default] END Vrací obraz pro první shodu výraz=vzori, resp. default hodnotu, resp. NULL DBI026 -DB Aplikace - MFF UK
275
DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy SQL-92 definuje dvě podoby CASE výrazu b) vyhledávací (searched) CASE výraz: CASE WHEN podm1 THEN obraz1 WHEN podm2 THEN obraz2 … [ELSE default] END Vrací obraz pro první podmi = TRUE, resp. default hodnotu, resp. NULL DBI026 -DB Aplikace - MFF UK
276
DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy Příklad: SELECT Predmet, CASE Den WHEN 1 THEN ’Pondělí’ WHEN 2 THEN ’Úterý’ … WHEN 7 THEN ’Neděle’ ELSE ’Neznámý den v týdnu’ END AS Den_v_tydnu FROM Rozvrh; DBI026 -DB Aplikace - MFF UK
277
DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy Příklad prodeje, DPH rozdělené dle sazby: SELECT Cena, Sazba, CASE WHEN Sazba=1 THEN Cena* ELSE NULL END AS SnizDPH, CASE WHEN Sazba=2 THEN Cena* ELSE NULL END AS ZaklDPH FROM Prodej; DBI026 -DB Aplikace - MFF UK
278
DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy Příklad prodeje, Ceny rozdělené dle sazby: SELECT Sazba, CASE WHEN Sazba=0 THEN Cena ELSE NULL END AS Cena0, CASE WHEN Sazba=1 THEN Cena ELSE NULL END AS Cena1, CASE WHEN Sazba=2 THEN Cena ELSE NULL END AS Cena2 FROM Prodej; DBI026 -DB Aplikace - MFF UK
279
Podmíněné výrazy v Oracle
Oracle obsahuje navíc propretární řešení s využitím funkce DECODE DECODE(výraz vzor1, obraz1, vzor2, obraz2 [, default]) Obdoba jednoduchého CASE DBI026 -DB Aplikace - MFF UK
280
DBI026 -DB Aplikace - MFF UK
Podmíněné výrazy Příklad: SELECT Predmet, DECODE(Den 1, ’Pondělí’, 2, ’Úterý’, … 7, ’Neděle’ ’Neznámý den v týdnu’ ) AS Den_v_tydnu FROM Rozvrh; DBI026 -DB Aplikace - MFF UK
281
Strukturované typy Pole Hnízděné tabulky
Přednáška č. 6 Objektové rozšíření Strukturované typy Pole Hnízděné tabulky
282
Objektové rozšíření – SQL:1999
Nové rysy v normě ANSI SQL:1999 Rozšiřitelnost Standardizace typů pro objemná data typ BLOB (Binary Large OBjects) typ CLOB (Character Large OBjects) Možnosti interpretace jejich vnitřního obsahu texty, obrázky, zvuky, videa, ... Možnosti doplňování dalších formátů a manipulace s nimi DBI026 -DB Aplikace - MFF UK
283
Objektové rozšíření – SQL:1999
Nové rysy v normě ANSI SQL:1999 Rozšiřitelnost Nové (uživatelské) datové typy - UDT Abstraktní datové typy – ADT Strukturovaná data Řádkové typy Reference … DBI026 -DB Aplikace - MFF UK
284
Abstraktní datové typy – SQL:1999
Možnost vytvářet vlastní strukturované datové typy zapouzdřující data a operace (například porovnávací operace) Metody psané buďto v SQL, nebo externích jazycích (C, Pascal, …) DBI026 -DB Aplikace - MFF UK
285
Abstraktní datové typy – SQL:1999
ADT mohou tvořit hierarchie s jednoduchou dědičností Je podporován polymorfismus metod a dotazů nad daty DBI026 -DB Aplikace - MFF UK
286
Abstraktní datové typy – SQL:1999
Příklad ADT CREATE TYPE T_Student AS ( Jm CHAR(30), Adresa CHAR(40), Zac_ studia DATE ) UNINSTANTIABLE NOT FINAL METHOD Poc_Prednasek() RETURNS INTEGER; DBI026 -DB Aplikace - MFF UK
287
Abstraktní datové typy – SQL:1999
Pomocí [UN]INSTANTIABLE je možné zakázat či povolit vytváření instancí daného typu V daném příkladu typu T_Student se jedná o abstraktní třídu bez možnosti tvořit instance Pomocí [NOT] FINAL je možné zakázat či povolit vytváření potomků daného typu V případě abstraktních tříd je NOT FINAL předpokladem, bez možnosti vytváření potomků nemá abstraktní třída uplatnění DBI026 -DB Aplikace - MFF UK
288
Abstraktní datové typy – SQL:1999
Vytvoření implementace metody se vytváří příkazem CREATE METHOD Poc_Prednasek() FOR T_Student BEGIN … END; DBI026 -DB Aplikace - MFF UK
289
Abstraktní datové typy – SQL:1999
Vytvoření odvozeného typu z typu rodičovského se provede příkazem CREATE TYPE T_PhDStudent UNDER T_Student( … ) [UN]INSTANTIABLE [NOT] FINAL …; DBI026 -DB Aplikace - MFF UK
290
Abstraktní datové typy – SQL:1999
Vytvoření tabulky instancí abstraktního datového typu CREATE TABLE PhD OF T_PhDStudent; Každá řádka je identifikována pomocí omělého klíče (OID – Object IDentificator) generovaného systémem DBI026 -DB Aplikace - MFF UK
291
DBI026 -DB Aplikace - MFF UK
Reference na ADT – SQL:1999 Na instanci abstraktního datového typu je možné se odkázat pomocí nově zavedeného typu reference Pro každý typ T je automaticky definován typ „reference na T“ REF(T) Povolené hodnoty je možné omezit jen na reference do dané tabulky pomocí REF(T) SCOPE Tabulka DBI026 -DB Aplikace - MFF UK
292
DBI026 -DB Aplikace - MFF UK
Řádkové typy – SQL:1999 Norma rozlišuje ještě tzv. řádkové typy CREATE ROW TYPE T_Automobil( SPZ VARCHAR(7), Majitel REF(T_Osoba), Typ CHAR(10), Barva CHAR(10), Cena INT ); DBI026 -DB Aplikace - MFF UK
293
DBI026 -DB Aplikace - MFF UK
Řádkové typy – SQL:1999 Tabulka instancí řádkových typů CREATE TABLE Automobily OF T_Automobil( CONSTRAINT Automobily_PK PRIMARY KEY(SPZ) ); Instance nejsou identifikovány pomocí OID DBI026 -DB Aplikace - MFF UK
294
Použití reference – SQL:1999
Pomocí operátoru -> lze procházet přes jednotlivé reference SELECT SPZ, Majitel->Jmeno, … FROM Automobily WHERE Majitel->RokNar >= 1980; Pokud odkazovaný objekt již neexistuje, je reference ve stavu DANGLING Pro test se používá operátor IS [NOT] DANGLING DBI026 -DB Aplikace - MFF UK
295
DBI026 -DB Aplikace - MFF UK
Řádkové typy – SQL:1999 Řádkové typy mohou být použity i pro typy sloupců CREATE TABLE T( … Auto T_Automobil, … ); Mohou být vnořené do sebe Mohou být použity ad-hoc bez předchozí definice typu: Auto ROW(SPZ VARCHAR(7), …) DBI026 -DB Aplikace - MFF UK
296
DBI026 -DB Aplikace - MFF UK
Typ pole – SQL:1999 Typ „pole hodnot typu T s maximálním počtem n prvků“ se deklaruje pomocí T ARRAY[n] Např.: Telefony VARCHAR(15) ARRAY[5] DBI026 -DB Aplikace - MFF UK
297
Reprezentace tříd bez objektových rozšíření
Uvažujme hierarchii čtyř tříd A, B, C, D viz schéma Používají se tři základní způsoby mapování na relační tabulky Každá má své výhody a nevýhody A aa B bb C cc D dd DBI026 -DB Aplikace - MFF UK
298
Reprezentace tříd bez objektových rozšíření
Filtrované (filtered) mapování Jediná tabulka se schématem (ID,aa,bb,cc,dd) Nemusí se dělat žádná spojení Komplikace s NOT NULL, cizími klíči Neefektivní využití místa Problémy s formulací dotazů B C D A DBI026 -DB Aplikace - MFF UK
299
Reprezentace tříd bez objektových rozšíření
Horizontální mapování n tabulek se schématy (ID,aa),(ID,aa,bb), (ID,aa,cc),(ID,aa,bb,dd) Každá obsahuje kompletní instance jedné třídy Nemusí se dělat spojení pro získání instancí dané třídy V polymorfních dotazech nutné UNION operace navíc je nutné znát všechny potomky třídy B C D A DBI026 -DB Aplikace - MFF UK
300
Reprezentace tříd bez objektových rozšíření
Vertikální mapování n tabulek se schématy (ID,aa),(ID,bb), (ID,cc),(ID,dd) Každá obsahuje kompletní údaje definované v jedné třídě Snadno se definují cizí klíče na danou třídu V polymorfních dotazech nutné spojení se všemi tabulkami nadtříd D C B A DBI026 -DB Aplikace - MFF UK
301
DBI026 -DB Aplikace - MFF UK
Objektové rozšíření Proprietární řešení podpory UDT se v jednotlivých databázích značně liší od normy i mezi sebou navzájem V Oracle podpora od verze 8i Strukturované uživatelské typy Od verze 9i včetně jednoduché dědičnosti Pole s proměnnou délkou (VARRAY) Hnízděné tabulky Typ REF DBI026 -DB Aplikace - MFF UK
302
DBI026 -DB Aplikace - MFF UK
Objektové rozšíření Proprietární řešení podpory UDT se v jednotlivých databázích značně liší od normy i navzájem V MS SQL podpora od verze SQL Server 2005 Využívá managed kódu .NET platformy DBI026 -DB Aplikace - MFF UK
303
Objektové rozšíření MS SQL
Nejprve je nutné napsat definici objektu a metod v některém z .NET jazyků (VB, C#, …) a zkompilovat dll soubor [Serializable] [Microsoft.SqlServer.Server.SqlUserDefinedType(Format.Native,IsByteOrdered=true)] public struct Point : Inullable {…} DBI026 -DB Aplikace - MFF UK
304
Objektové rozšíření MS SQL
Dále je nutné zaregistrovat DLL na serveru CREATE ASSEMBLY Point FROM ’\\Comp\Share\Folder\Poind.dll’ WITH PERMISSION_SET = SAFE; DBI026 -DB Aplikace - MFF UK
305
Objektové rozšíření MS SQL
Dále je nutné vytvořit odpovídající typ CREATE TYPE Point EXTERNAL NAME Point.[Point]; DBI026 -DB Aplikace - MFF UK
306
Objektové rozšíření MS SQL
Typ je možné použít v definici sloupce CREATE TABLE Points ( ID int IDENTITY(1,1) PRIMARY KEY, PointValue Point ) Je možné indexovat buďto binárně přes celý sloupec, nebo přes hodnotu deterministického výrazu nad typem DBI026 -DB Aplikace - MFF UK
307
Objektové rozšíření MS SQL
Příklady vkládání dat INSERT INTO Points (PointValue) VALUES (CONVERT(Point, '3,4')); INSERT INTO Points (PointValue) VALUES (CONVERT(Point, '1,5')); INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point)); DBI026 -DB Aplikace - MFF UK
308
Objektové rozšíření MS SQL
Příklady dotazů SELECT ID, CAST(PointValue AS varchar) FROM Points; SELECT ID, CONVERT(varchar, PointValue) FROM Points; SELECT ID, PointValue.X AS xVal, PointValue.Y AS yVal FROM Points; DBI026 -DB Aplikace - MFF UK
309
Objektové rozšíření MS SQL
Příklady dotazů s voláním metod V definici třídy musí být zapnuto IsByteOrdered=true SELECT ID, PointValue.ToString() AS Points FROM Points WHERE PointValue > CONVERT(Point, '2,2'); SELECT ID, PointValue.X as X, PointValue.Y as Y, PointValue.DistanceFromXY(1,99) AS Dist FROM dbo.Points WHERE PointValue.Distance() > 10; DBI026 -DB Aplikace - MFF UK
310
Objektové rozšíření Oracle strukturované typy
Základní typ bez předků CREATE [OR REPLACE] TYPE t {AS|IS} OBJECT ( definice členských atributů, definice členských metod ) [[NOT] FINAL] [[NOT] INSTANTIABLE] Odvozený typ CREATE [OR REPLACE] TYPE t1 UNDER t (…) …; Implementace metod CREATE [OR REPLACE] TYPE BODY t {AS|IS} implementace členských metod END; Zrušení typu DROP TYPE t; DBI026 -DB Aplikace - MFF UK
311
Objektové rozšíření Oracle
Více odpovídá normě SQL:1999 Přesto řada menších i větších rozdílů V definici tříd Nerozlišují se ADT a řádkové typy na vše se používá jednotná deklarace V definici implementací (převzato z definic těl balíků) V definicích polí se používá vlastní syntaxe VARRAY V práci s referencemi … DBI026 -DB Aplikace - MFF UK
312
Objektové rozšíření Oracle strukturované typy
CREATE TYPE T_Adresa AS OBJECT( Ulice VARCHAR2(50), CP VARCHAR2(10), CO VARCHAR2(10), Mesto VARCHAR2(50), PSC VARCHAR2(5) ); CREATE TYPE T_Osoba AS OBJECT( Jmeno VARCHAR2(50), Prijmeni VARCHAR2(50), Adresa T_Adresa ); DBI026 -DB Aplikace - MFF UK
313
Objektové rozšíření Oracle strukturované typy
Použití v tabulkách stejné jako u atomických typů CREATE TABLE Projekty( Nazev VARCHAR2(50) CONSTRAINT Projekt_PK PRIMARY KEY, Vedouci T_Osoba NOT NULL ); Řádky obsahují instance jako své položky Objektové tabulky CREATE TABLE Osoby OF T_Osoba; Řádky jsou instancemi typu, mohou se na ně vytvářet reference DBI026 -DB Aplikace - MFF UK
314
Objektové rozšíření Oracle strukturované typy
Implicitní konstruktory: jméno_typu(hodnota,…) T_Adresa(’Krátká’,’2a’,’27’,’Praha 10’,’10000’) T_Osoba(’Jan’,’Nový’, T_Adresa(…)) Použití v SQL INSERT INTO Projekty VALUES( ’Znak’, T_Osoba(’Jan’,’Nový’, T_Adresa(…)) ); INSERT INTO Osoby VALUES( T_Osoba(’Jan’,’Nový’, T_Adresa(…)) ); INSERT INTO Osoby VALUES(’Jan’,’Nový’, T_Adresa(…)); -- Objektovou tabulku lze chápat jako vícesloupcovou tabulku -- obsahující jednotlivé členy samostatně DBI026 -DB Aplikace - MFF UK
315
Objektové rozšíření Oracle strukturované typy
Výběr dat SELECT * FROM Osoby; SELECT Jmeno, Prijmeni FROM Osoby; SELECT X.Vedouci FROM Projekty X WHERE X.Vedouci.Prijmeni=’Nový’; SELECT Nazev, X.Vedouci.Prijmeni, X.Vedouci.Adresa.Mesto FROM Projekty X SELECT T_Adresa(Adresa.Ulice, null, null, Adresa.Mesto, null) AS Adr FROM Osoby; DBI026 -DB Aplikace - MFF UK
316
Objektové rozšíření Oracle členské funkce a procedury
CREATE TYPE T_Complex AS OBJECT( Re Real, Im Real, MEMBER FUNCTION Abs RETURN Real, MEMBER PROCEDURE SetRe(x Real), MEMBER PROCEDURE SetIm(x Real) ); CREATE TYPE BODY T_Complex AS MEMBER FUNCTION Abs RETURN Real IS BEGIN RETURN SQRT(Re*Re + Im*Im); END; MEMBER PROCEDURE SetRe(x Real) IS BEGIN Re := x; END; MEMBER PROCEDURE SetIm(x Real) IS BEGIN Im := x; END; END; DBI026 -DB Aplikace - MFF UK
317
Objektové rozšíření Oracle statické funkce a procedury
CREATE TYPE T_Complex AS OBJECT( Re Real, Im Real, MEMBER FUNCTION Abs RETURN Real, STATIC FUNCTION New(r: Real, i: Real DEFAULT 0) RETURN T_Complex ); CREATE TYPE BODY T_Complex AS … STATIC FUNCTION New(r: Real, i: Real DEFAULT 0) RETURN T_Complex IS BEGIN RETURN T_Complex(r,i); END; DBI026 -DB Aplikace - MFF UK
318
Objektové rozšíření Oracle
Členské funkce typu t mají skrytý implicitní IN OUT parametr SELF typu t Volání členských funkcí a procedur musí vždy obsahovat závorky, i když nemají parametry SELECT T_Complex(3,4).Abs() FROM DUAL; Statické funkce a procedury parametr SELF nemají, volají se kvalifikací jménem typu SELECT T_Complex.New(0,1) FROM DUAL; DBI026 -DB Aplikace - MFF UK
319
Členské a statické Oracle funkce a procedury - dědičnost
Statické funkce a procedury mohou obsahovat následující modifikátory [[NOT] FINAL] Funkce (ne)lze redefinovat v potomcích [[NOT] INSTANTIABLE] Funkce nemá definovanou implementaci Členské funkce a procedury mohou navíc obsahovat [[NOT] OVERRIDING] Funkce (ne)redefinuje metodu předka Příklad OVERRIDING FINAL MEMBER FUNCTION … DBI026 -DB Aplikace - MFF UK
320
Třídění strukturovaných typů Oracle
Typ může definovat právě jednu MAP funkci, nebo právě jednu ORDER funkci. Ne obě. MAP funkce mapuje instance typu na jiný typ s uspořádáním ORDER funkce definuje uspořádání sama CREATE TYPE t AS OBJECT( … MAP MEMBER FUNCTION m RETURN uspoř_typ, ORDER MEMBER FUNCTION o(x: t) RETURN Number Potom a,b typu t platí a < b a.m() < b.m(), a=b a.m()=b.m() a < b a.o(b) < 0, a = b a.o(b) = 0 DBI026 -DB Aplikace - MFF UK
321
Třídění strukturovaných typů Oracle
Způsob uspořádání nemůže být v potomcích změněn z MAP na ORDER ani naopak MAP funkce může být v potomcích redefinována ORDER funkce nemůže být v potomcích redefinována Pokud kořenová třída hierarchie nemá MAP metodu, žádný potomek nemůže třídění dodefinovat DBI026 -DB Aplikace - MFF UK
322
Konstruktory typů Oracle
[FINAL] [INSTANTIABLE] CONSTRUCTOR FUNCTION jméno_typu [(SELF IN OUT jméno_typu [, parametr [, …]])] RETURN SELF AS RESULT {IS|AS} … CONSTRUCTOR FUNCTION T_Complex( SELF IN OUT T_Complex, r: Real) RETURN SELF AS RESULT IS BEGIN SELF.Re := r; SELF.Im := 0; RETURN SELF; END; DBI026 -DB Aplikace - MFF UK
323
DBI026 -DB Aplikace - MFF UK
Typ VARRAY v Oracle Pole s proměnnou délkou CREATE OR REPLACE TYPE t AS {VARRAY | VARYING ARRAY} (n) OF typ_prvku; Kde n je maximální počet prvků v poli CREATE TYPE T_Telefony AS VARRAY(5) OF VARCHAR2(15); DBI026 -DB Aplikace - MFF UK
324
DBI026 -DB Aplikace - MFF UK
Typ VARRAY v Oracle Konstruktor typu VARRAY jméno_typu(hodnota [,…]) Proměnná typu VARRAY např. T_Telefony může nabývat hodnot NULL … prázdná hodnota T_Telefony() … prázdné pole T_Telefony(NULL) … jednoprvkové pole T_Telefony(’ ’, ’ ’) Přístup k i-tému prvku pole tel: T_Telefony v PL/SQL tel(i) DBI026 -DB Aplikace - MFF UK
325
DBI026 -DB Aplikace - MFF UK
Typ VARRAY v Oracle Metody typu VARRAY Použitelné jen v PL/SQL, ne SQL společné i pro kolekce, u VARRAY jsou některé funkce zbytečné, protože pole je obsazené hustě bez mezer Exists(k) … TRUE, pokud existuje k-tý prvek pole Count … Počet existujících prvků v poli Limit … Max. možný počet prvků v poli First, Last … Indexy prvního a posledního ex. prvku Prior, Next … Indexy předchozího a následujícího prvku Extend[(n[,i])] … přidá 1 (n) prázdných prvků, resp. kopií i-tého Trim[(n)] … odebere 1 (n) prvků z konce pole DBI026 -DB Aplikace - MFF UK
326
Typ TABLE v Oracle kolekce, hnízděné tabulky
Neuspořádaná kolekce s neomezenou délkou CREATE OR REPLACE TYPE t AS TABLE OF typ_prvku; CREATE TYPE Tab_Telefony AS TABLE OF VARCHAR2(15); DBI026 -DB Aplikace - MFF UK
327
Typ TABLE v Oracle kolekce, hnízděné tabulky
Konstruktor typu TABLE jméno_typu(hodnota [,…]) Proměnná typu TABLE, např. Tab_Telefony může nabývat hodnot NULL … prázdná hodnota Tab_Telefony() … prázdné pole Tab_Telefony(NULL) … jednoprvkové pole Tab_Telefony(’ ’, ’ ’) DBI026 -DB Aplikace - MFF UK
328
Typ TABLE v Oracle kolekce, hnízděné tabulky
Metody kolekcí Použitelné jen v PL/SQL, ne SQL společné i pro kolekce, u VARRAY jsou některé funkce zbytečné, protože pole je obsazené hustě bez mezer Exists(k) … TRUE, pokud existuje k-tý prvek pole Count … Počet existujících prvků v poli Limit … Max. možný počet prvků v poli First, Last … Indexy prvního a posledního ex. prvku Prior, Next … Indexy předchozího a následujícího prvku Extend[(n[,i])] … přidá 1 (n) prázdných prvků, resp. kopií i-tého Trim[(n)] … odebere 1 (n) prvků z konce pole Delete [(n[,m])] … smaže všechny / n-tý / n-tý..m-tý nelze použít u VARRAY, jen kolekcí DBI026 -DB Aplikace - MFF UK
329
Typ TABLE v Oracle kolekce, hnízděné tabulky
Deklarace hnízděné tabulky CREATE TABLE Zam( ID NUMBER(10) CONSTRAINT Zam_PK PRIMARY KEY, Jmeno VARCHAR2(50) NOT NULL, Tel Tab_Telefony) NESTED TABLE(Tel) STORE AS Zam_Tel; DBI026 -DB Aplikace - MFF UK
330
Typ TABLE v Oracle kolekce, hnízděné tabulky
Manipulace s prvky hnízděné tabulky V Oracle 8 Operátor THE V Oracle 9 Operátor TABLE, THE je zastaralý INSERT INTO TABLE( SELECT Tel FROM Zam WHERE ID=1 ) VALUES(’ ’); SELECT z.Jmeno, t.* FROM Zam z, TABLE(z.Tel) t; DBI026 -DB Aplikace - MFF UK
331
Nekompletní strukturované typy
Definují pouze jméno typu Nedefinují obsah ani chování Nutné při křížových odkazech mezi typy CREATE TYPE t1; CREATE TYPE t2 AS OBJECT( reft1 REF t1, … ); DBI026 -DB Aplikace - MFF UK
332
DBI026 -DB Aplikace - MFF UK
Typ REF v Oracle Reference mezi objekty Deklarace bez omezení oboru hodnot: REF jméno_typu CREATE TYPE T_ListItem AS OBJECT( Key VARCHAR2(20) NOT NULL, Next REF T_ListItem ); Deklarace s omezením oboru hodnot (Scoped REF): REF jméno_typu SCOPE IS jméno_objektové_tabulky CREATE TYPE T_ListItem AS OBJECT( Key VARCHAR2(20) NOT NULL, Next REF T_ListItem SCOPE IS ItemTable ); DBI026 -DB Aplikace - MFF UK
333
DBI026 -DB Aplikace - MFF UK
Typ REF v Oracle Dangling REF Reference odkazující na již neexistující objekt Predikát IS [NOT] DANGLING Deklarace reference v PL/SQL DECLARE refListItem REF TO T_ListItem; Získání reference pomocí operátoru REF SELECT REF(x) FROM ItemTable x; Dereference pomocí tečkové notace SELECT x.Next.Key FROM ItemTable x WHERE x.Next IS NOT NULL AND x.Next IS NOT DANGLING; DBI026 -DB Aplikace - MFF UK
334
DBI026 -DB Aplikace - MFF UK
Objektové pohledy Z objektové tabulky CREATE VIEW OF typ AS SELECT … Z relační tabulky CREATE VIEW OF typ WITH OBJECT IDENTIFIER (sloupec [, …]) AS SELECT typ(…) FROM …; Vytvoření reference do objektového pohledu MAKE_REF(hodnota [, …]) DBI026 -DB Aplikace - MFF UK
335
DBI026 -DB Aplikace - MFF UK
Objektové pohledy Hierarchie objektových pohledů CREATE SuperTyp_VW OF SuperTyp AS …; CREATE SubTyp_VW OF SubTyp UNDER SuperTyp_VW AS …; DBI026 -DB Aplikace - MFF UK
336
Objektové predikáty a konverze
Predikát objekt IS OF (typ) True, pokud je objekt typu typ, nebo potomek Predikát ONLY objekt IS OF (ONLY typ) True, pokud je objekt právě typu typ Operátor TREAT(objekt AS typ) Přetypuje typ na podtyp DBI026 -DB Aplikace - MFF UK
337
Objektové predikáty a konverze
Funkce SYS_TYPEID(objekt) Číselný interní identifikátor typu dané instance Kořenové FINAL typy (bez předků a potomků) mají SYS_TYPEID prázdný (NULL) Funkce REF(objekt) Vrací referenci na objekt Funkce DEREF(reference) Vrací objekt odkazovaný referencí DBI026 -DB Aplikace - MFF UK
338
Nahraditelnost předků potomky
Standardně může tabulka instancí typu typ, obsahovat potomky Lze explicitně vypnout klauzulí NOT SUBSTITUTABLE AT ALL LEVELS Vnořená tabulka CREATE TABLE departments( name VARCHAR2(10), emps emp_set ) NESTED TABLE (emps) NOT SUBSTITUTABLE AT ALL LEVELS STORE AS ...; DBI026 -DB Aplikace - MFF UK
339
Nahraditelnost předků potomky
Standardně může sloupec typu typ obsahovat potomky Lze explicitně vypnout klauzulí IS OF (ONLY …) Sloupec tabulky CREATE TABLE Student_books OF Book_typ COLUMN author IS OF (ONLY Student_typ); DBI026 -DB Aplikace - MFF UK
340
Deklarace omezení na obj. tabulkách
CREATE TYPE TOsoba AS OBJECT( rc VARCHAR2(11), jm VARCHAR2(30) ); / CREATE TABLE OOsoby OF TOsoba( rc CONSTRAINT OOsoby_PK PRIMARY KEY ); ALTER TABLE OOsoby ADD( CONSTRAINT OOsoby_PK PRIMARY KEY(rc) ); DBI026 -DB Aplikace - MFF UK
341
Deklarace indexů na obj. tabulkách
Pouze přes atomické položky strukturovaných objektů Nelze vytvořit index přes celou instanci objektu CREATE INDEX ON OOsoby(jm); DBI026 -DB Aplikace - MFF UK
342
Fulltextové vyhledávání
Filtrace, Disambiguace, Lemmatizace, Indexy, Tezaury, Dotazování
343
Fulltextové vyhledávání
Odlišné od principů běžného vyhledávání Neprohledávají se striktně strukturovaná data, kde má každý sloupec každé tabulky předem daný význam Prohledávají se volně psané texty, kde může být stejná událost popsaná více autory rozdílně Různá slova stejného významu (Synonyma) Různé slovní obraty a opisy … DBI026 -DB Aplikace - MFF UK
344
Fulltextové vyhledávání
Databázové systémy využívají svých prostředků rozšiřitelnosti a dodávají standardně prostředky, které vyhledávání v textových datech umožňují DBI026 -DB Aplikace - MFF UK
345
Fulltextové vyhledávání
Rozdílné přístupy a možnosti Neexistuje objektivně nejlepší řešení Výsledky navíc podléhají subjektivním názorům tazatelů DBI026 -DB Aplikace - MFF UK
346
DBI026 -DB Aplikace - MFF UK
Porozumění textu Posloupnost slov v přirozeném jazyce. Každé slovo zastupuje pro autora nějakou představu, kterou v něm slovo vyvolá - význam. Tyto představy reprezentují reálné předměty. ... DBI026 -DB Aplikace - MFF UK
347
DBI026 -DB Aplikace - MFF UK
Porozumění textu Synonymie slov Více slov může mít pro autora stejný význam krychle = kostka buldozer = nakladač ... DBI026 -DB Aplikace - MFF UK
348
DBI026 -DB Aplikace - MFF UK
Porozumění textu Homonymie slov Jedno slovo může mít pro autora několik významů taška: střešní, nákupní koruna: platidlo, královská k., k. stromu třída: školní, kategorie v teorii množin los: zvíře, poukázka ke slosování ... DBI026 -DB Aplikace - MFF UK
349
DBI026 -DB Aplikace - MFF UK
Porozumění textu Homonymie slov Jedno slovo může používat stejný tvar pro různé pády a další gramatické jevy (gramatická homonymie) kontroly: 1. p. m.č., 2. p. j.č. není zřejmé, zda se jedná o jednu, nebo více kontrol Jeden tvar slova může mít různý význam plesy: podst. jm. ples, podst. jm. pleso žena: podst. jm. žena, sloveso hnát hnát: sloveso hnát, podst. jm. hnát tři: číslovka tři, sloveso třít pět: číslovka pět, sloveso pět DBI026 -DB Aplikace - MFF UK
350
DBI026 -DB Aplikace - MFF UK
Porozumění textu Významy slov se mohou překrývat. Hierarchicky zvíře > kůň > hřebec Asociace kalkulátor ~ počítač ~ procesor ... DBI026 -DB Aplikace - MFF UK
351
DBI026 -DB Aplikace - MFF UK
Porozumění textu Jednotlivá přiřazení jsou navíc závislá na subjektu, který dokument píše nebo čte. Dva lidé mohou jednomu slovu přikládat zcela nebo jen částečně jiný význam. Dva lidé si i pod stejným významem mohou představit jiný konkrétní předmět nebo množinu předmětů. máma, pokoj, ... Výsledkem je situace, kdy dva různí čtenáři nemusí přečtením získat stejnou informaci jako autor, ani navzájem. DBI026 -DB Aplikace - MFF UK
352
DBI026 -DB Aplikace - MFF UK
Porozumění textu Homonymie a nejednoznačnosti narůstají při přechodu od slov k větám. Homonymie vlastních jmen na začátku věty Dohnal zvítězil. (Čtrnáctý zvítězil.) Dohnal předešel gen. Kvapila velmi výrazně. - jedna, nebo dvě věty? Homonymie spojky a v předmětu věty Funkce rezistoru a zesilovače v radiotechnice. (funkce rezistoru v radiotechnice) a (funkce zesilovače v radiotechnice) (funkce rezistoru) a (funkce zesilovače v radiotechnice) (funkce rezistoru) a (zesilovače v radiotechnice) Homonymie podmětu a předmětu Popílek přikryl sníh. – co leží navrchu? DBI026 -DB Aplikace - MFF UK
353
DBI026 -DB Aplikace - MFF UK
Porozumění textu Příklad české věty s více gramaticky možnými významy viz např. Podivné fungování gramatiky, věta „Ženu holí stroj“ může - podle volby přísudku ve větě - znamenat: Poháním stroj pomocí hole (hnát) Žena používá depilační přístroj (holit) Návod k nekonvenčnímu způsobu oblékání (strojit) … a další DBI026 -DB Aplikace - MFF UK
354
DBI026 -DB Aplikace - MFF UK
Porozumění textu Příklad anglické věty s více gramaticky možnými významy viz např. Podivné fungování gramatiky, věta „Time flies like an arrow“ může - podle volby přísudku ve větě - znamenat: Čas letí jako voda (fly) Časové mouchy/zipy mají rády šíp (like) … a další DBI026 -DB Aplikace - MFF UK
355
Fulltextové vyhledávání
Samotná formulace dotazu, který by vrátil všechny dokumenty, které tazatele zajímají a žádné jiné obvykle nelze zformulovat Spolu s vyhovujícími – relevantními – odpověďmi se obvykle vrací i odpovědi nerelevantní DBI026 -DB Aplikace - MFF UK
356
Fulltextové vyhledávání
Problémy Homonyma Ptá se tazatel dotazem „koruna“ na finanční, lesnické či panovnické dokumenty? Synonyma Vyhovuje dokument o „krychlích“ dotazu na dokumenty o „kostkách“? Vyhovuje dokument o „stromech“ dotazu na „souvislé grafy bez cyklů“? DBI026 -DB Aplikace - MFF UK
357
Fulltextové vyhledávání
Problémy Hierarchie významů Zvíře – Savec – Šelma – Medvěd Tiskovina – Časopis Ohebnost slov Jít, Jde, Jdu, Jdou, … DBI026 -DB Aplikace - MFF UK
358
Fulltextové vyhledávání
Striktní boolská logika není pro formulaci dotazů příliš vhodná Dokument buďto vyhovuje dotazu, nebo nevyhovuje Dotazování v textech vyžaduje třídit odpovědi podle předpokládané vhodnosti pro tazatele Je potřebné mít možnost definovat míru shody dotazu s dokumentem DBI026 -DB Aplikace - MFF UK
359
DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost Dva DIS mohou vrátit na shodný dotaz různé odpovědi, které se nemusí překrývat ani v jediném vráceném dokumentu Jak porovnat kvalitu odpovědí navzájem? Dokumenty v databázi Relevantní dokumenty Vrácené v DIS1 Vrácené v DIS2 DBI026 -DB Aplikace - MFF UK
360
DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost Dva tazatelé mohou mít při položení shodného dotazu různý názor na relevanci vrácených dokumentů Jak vyhovět subjektivnímu názoru tazatelů? Dokumenty v databázi Relevantní Vrácené dok. DBI026 -DB Aplikace - MFF UK
361
DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost Kvalita výsledné množiny dokumentů se měří na základě těchto čísel Přesnost (Precision) P = Nvr / Nv Pravděpodobnost, že dokument zařazený v odpovědi je skutečně relevantní Úplnost (Recall) R = Nvr / Nr Pravděpodobnost, že skutečně relevantní dokument je zařazený v odpovědi DBI026 -DB Aplikace - MFF UK
362
DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost Koeficienty jsou opět závislé na subjektivním názoru tazatele Dokument vrácený na výstupu může uspokojovat požadavky dvou uživatel, kteří položili stejný dotaz, různou měrou. DBI026 -DB Aplikace - MFF UK
363
DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost V ideálním případě P=R=1 V odpovědi jsou zařazeny právě a pouze všechny relevantní dokumenty V běžném případě Odpověď na první verzi dotazu není ani přesná, ani úplná 1 Optimum Počáteční odpověď 1 DBI026 -DB Aplikace - MFF UK
364
DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost Ladění dotazu Postupná modifikace dotazu s cílem zvýšit kvalitu odpovědi Teoreticky je sice možné dosáhnout optima, ale … R 1 Optimum P 1 DBI026 -DB Aplikace - MFF UK
365
DBI026 -DB Aplikace - MFF UK
Přesnost a úplnost … vlivem víceznačností jsou v praxi oba koeficienty na sobě nepřímo závislé, tj. P*R konst. < 1 Při snaze zvýšit P se na výstup dostane méně relev. dokumentů. Při snaze zvýšit R se na výstup dostane s více relev. dok. i mnohem více těch nerelevantních. R 1 Optimum P 1 DBI026 -DB Aplikace - MFF UK
366
DBI026 -DB Aplikace - MFF UK
Kritérium predikce Při formulaci dotazů je potřebné uhádnout, které termy (slova) byly v dokumentu autorem použity pro vyjádření dané myšlenky Problémy m.j. způsobují Synonyma (autor mohl použít synonymum, které si tazatel při formulaci dotazů ani nemusí neuvědomí) Překrývající se významy slov Opisy jedné situace jinými slovy DBI026 -DB Aplikace - MFF UK
367
DBI026 -DB Aplikace - MFF UK
Kritérium predikce Částečným řešením je zařazení tezauru, který obsahuje Hierarchie slov a jejich významů Synonyma slov Asociace mezi slovy Tazatel může tezaurus využít při formulaci svých dotazů DBI026 -DB Aplikace - MFF UK
368
DBI026 -DB Aplikace - MFF UK
Kritérium predikce Při ladění dotazů má uživatel tendenci postupovat konzervativně V dotazu zůstávají často ty jeho části, které uživatele napadly na začátku a mění se jen podružné části, které nekvalitní výsledek nemusí nijak zásadně ovlivnit Vhodné je uživateli pomoci s odstraněním nevhodných částí dotazu, které nepopisují relevantní dokumenty a naopak s přidáváním formulací, které relevantní dokumenty popisují DBI026 -DB Aplikace - MFF UK
369
DBI026 -DB Aplikace - MFF UK
Kritérium maxima Tazatel obvykle není schopen (nebo ochoten) procházet příliš mnoho dokumentů do té míry, aby se rozhodl, zda jsou pro něj relevantní nebo ne Obvykle podle velikosti Potřeba nejen dokumenty rozlišovat na odpovídající/neodpovídající dotazu, ale řadit je na výstupu podle míry předpokládané relevance DBI026 -DB Aplikace - MFF UK
370
DBI026 -DB Aplikace - MFF UK
Kritérium maxima V důsledku kritéria maxima se při ladění dotazu uživatel obvykle snaží zvýšit přesnost Malé množství dokumentů v odpovědi, obsahující co největší poměr relevantních dokumentů Některé oblasti použití vyžadují co nejvyšší přesnost i úplnost Právnictví „lepší“ Vr. Rel. „horší“ Vr. Rel. DBI026 -DB Aplikace - MFF UK
371
Obvyklý postup předzpracování
Databáze obvykle používají některý z boolských modelů reprezentace dokumentů Nejlépe odpovídá běžným dotazům Relativně snadno se implementuje Dotazy jsou ve formě boolských formulí, ve kterých operandy tvoří jednotlivá slova Řada různých modifikací DBI026 -DB Aplikace - MFF UK
372
Obvyklý postup předzpracování
Filtrace Lemmatizace Desambiguace Seznam lemmat Tezaurus Stoplist Lemm. text Invertovaný seznam Indexace Invertovaný seznam DBI026 -DB Aplikace - MFF UK
373
Obvyklý postup předzpracování
Filtrace Odstraní formátovací značky a nechá čistý ASCII text Desambiguace Určí význam slova podle kontextu „pět chválu“ … sloveso pět „pět vozidel“ … číslovka pět Lemmatizace Určí základní tvar slova a gramatický tvar v dokumentu Často nahrazen pomocí stemmeru, který hledá kmen slova DBI026 -DB Aplikace - MFF UK
374
Obvyklý postup předzpracování
Indexace Vytvoří pomocné seznamy lemmat a dokumentů a invertovaný soubor dvojice [id_dok,id_lemmatu] setříděné dle id_lemmatu a zbavené duplicit dnes obvykle více informací, např. pětice [id_dok,č_odstavce,č_věty,č_slova,id_lemmatu] setříděné id_lemmatu Dovoluje vyhodnocování tzv. proximitních omezení na vzdálenost slov v dokumentu DBI026 -DB Aplikace - MFF UK
375
Fulltextové vyhledávání
Pro podporu vyhledávání je potřeba nad textovým sloupcem vytvořit index – invertovaný soubor Běžné textové sloupce jsou pro tyto účely krátké a nevyhovující Obvykle se takto indexují sloupce některého z LOB (Large OBject) typů DBI026 -DB Aplikace - MFF UK
376
DBI026 -DB Aplikace - MFF UK
Large OBjects (LOB) LOBy Standardní typy pro ukládání objemných dat na serveru definován v SQL-92 Full Až 4GB dat BLOB … standardní binární typ CLOB … znakový typ v univerzální znakové sadě serveru NCLOB … znakový typ v národní znakové sadě serveru V Oracle navíc externí typ BFILE pouze pro čtení samostatný binární soubor uložený vně databáze v OS DBI026 -DB Aplikace - MFF UK
377
DBI026 -DB Aplikace - MFF UK
Large OBjects (LOB) LOBy Standardní typy pro ukládání objemných dat na serveru definován v SQL-92 Full Až 4GB dat (Oracle 8i), až 8TB (Oracle 9i/10g), až 4G*Velikost_DB_bloku, tj. 8TB-128TB (Oracle 11i) BLOB … standardní binární typ CLOB … znakový typ v univerzální znakové sadě serveru NCLOB … znakový typ v národní znakové sadě serveru V MS SQL Image, Varbinary(max) … binární data do velikosti 2 GB Text, Varchar(max) … textová data do velikosti 2 GB NText, NVarchar(max) … textová data v nár. zn. sadě DBI026 -DB Aplikace - MFF UK
378
DBI026 -DB Aplikace - MFF UK
Large Objects Ve sloupcích tabulky je uložen pouze deskriptor (tzv. LOB lokátor), odkazující na samotně uložená data DBI026 -DB Aplikace - MFF UK
379
Struktura MS SQL full-text
DBI026 -DB Aplikace - MFF UK
380
DBI026 -DB Aplikace - MFF UK
MS SQL fulltext Vytvoření indexu nad textovým sloupcem CREATE FULLTEXT INDEX ON table_name [(column_name [TYPE COLUMN type_column_name] [LANGUAGE language_term] [,...n])] KEY INDEX index_name [ON fulltext_catalog_name] [WITH {CHANGE_TRACKING {MANUAL | AUTO | OFF [, NO POPULATION]}} ] DBI026 -DB Aplikace - MFF UK
381
DBI026 -DB Aplikace - MFF UK
MS SQL fulltext Potřebné zadat Jméno tabulky, jméno textového sloupce typu char, nchar, varchar, nvarchar, text, ntext Jméno (co nejmenšího) unikátního indexu nad tabulkou v klauzuli KEY INDEX DBI026 -DB Aplikace - MFF UK
382
DBI026 -DB Aplikace - MFF UK
MS SQL fulltext Z dalších možností: Definice jazyka (LANGUAGE) Způsob aktualizace WITH CHANGE_TRACKING MANUAL … vytváření žurnálu změn v datech, jeho promítnutí do indexu se může provést ručně, nebo automaticky schedulerem AUTO … index se bude aktualizovat zároveň s daty OFF … index se nebude aktualizovat vůbec DBI026 -DB Aplikace - MFF UK
383
DBI026 -DB Aplikace - MFF UK
MS SQL fulltext Příklad vytvoření indexu: USE AdventureWorks; GO CREATE UNIQUE INDEX ui_ukJobCand ON HumanResources.JobCandidate(JobCandidateID); CREATE FULLTEXT CATALOG ft AS DEFAULT; CREATE FULLTEXT INDEX ON HumanResources.JobCandidate(Resume) KEY INDEX ui_ukJobCand; GO DBI026 -DB Aplikace - MFF UK
384
Struktura Oracle full-text
DBI026 -DB Aplikace - MFF UK
385
DBI026 -DB Aplikace - MFF UK
Oracle fulltext Filtrování vstupních dokumentů NULL_FILTER pro textové dokumenty TXT, HTML, XML INSO_FILTER pro binární dokumenty CHARSET_FILTER pro konverzi získaných dokumentů do znakové sady databáze DBI026 -DB Aplikace - MFF UK
386
DBI026 -DB Aplikace - MFF UK
Oracle fulltext Druhy fulltextových indexů CONTEXT Základní typ indexu pro vyhledávání v textových datech Vhodný pro větší dokumenty Synchronizace indexu s daty je nutné provést explicitně zavoláním CTX_DDL.SYNC_INDEX (obdoba WITH CHANGE_TRACKING MANUAL z MS SQL) DBI026 -DB Aplikace - MFF UK
387
DBI026 -DB Aplikace - MFF UK
Oracle fulltext Druhy fulltextových indexů CTXCAT Vhodný pro menší dokumenty a jejich úryvky Může být zkombinován s dalšími netextovými sloupci pro kombinované dotazování Synchronizace indexu s daty se provádí automaticky se změnami v tabulce (obdoba WITH CHANGE_TRACKING AUTO z MS SQL) DBI026 -DB Aplikace - MFF UK
388
DBI026 -DB Aplikace - MFF UK
Oracle fulltext Druhy fulltextových indexů CTXRULE Postaven na množině předdefinovaných dotazů Slouží pro klasifikaci dokumentů do skupin podle toho, kterým dotazům vyhovuje DBI026 -DB Aplikace - MFF UK
389
DBI026 -DB Aplikace - MFF UK
Oracle fulltext Uložení dokumentů NORMAL_DATASTORE Text je v jednom sloupci jednoho řádku MULTI_COLUMN_DATASTORE Text je ve více sloupcích jednoho řádku URL_DATASTORE Text je na Internetu, dostupný přes URL ve sloupci … DBI026 -DB Aplikace - MFF UK
390
DBI026 -DB Aplikace - MFF UK
Oracle fulltext Vytvoření indexu nad textovým sloupcem CREATE INDEX index_name ON table_name(column_name) INDEXTYPE IS ctxsys.{context|ctxcat|ctxrule} [PARAMETERS (’param_name param_value …)]; DBI026 -DB Aplikace - MFF UK
391
DBI026 -DB Aplikace - MFF UK
Oracle fulltext Potřebné zadat Jméno tabulky, jméno textového sloupce typu char, nchar, varchar2, nvarchar2, clob, nclob Typ indexu DBI026 -DB Aplikace - MFF UK
392
DBI026 -DB Aplikace - MFF UK
Oracle fulltext Z dalších možností: Filter … formát vstupních dat Lexer … členění textu na slova s ohledem na jazyk, diakritiku a její přepisy (ö, oe, o), … Datastore Stoplist, Sync … způsob synchronizace SYNC (ON COMMIT | MANUAL | EVERY “SYSDATE+1”) … DBI026 -DB Aplikace - MFF UK
393
DBI026 -DB Aplikace - MFF UK
Oracle fulltext Příklad vytvoření indexu: CREATE INDEX myindex ON doc(htmlfile) INDEXTYPE IS ctxsys.context PARAMETERS( ’datastore ctxsys.default_datastore filter ctxsys.null_filter section group ctxsys.html_section_group’); DBI026 -DB Aplikace - MFF UK
394
Dotazování se nad textovým indexem
Spolu s novými typy indexů databáze implementují nové operátory pro porovnávání dotazu s textem Operátory vrací číslo – očekávanou míru shody obsahu textu s tazatelovými požadavky DBI026 -DB Aplikace - MFF UK
395
Dotazování se nad textovým indexem
MS SQL používá boolský operátor – predikát CONTAINS( sloupec, ’dotaz’[, LANGUAGE jazyk ]) DBI026 -DB Aplikace - MFF UK
396
Dotazování se nad textovým indexem
Oracle používá numerickou funkci CONTAINS( sloupec, ’dotaz’[, číslo_porovnání ]) Pomocí SCORE(číslo_porovnání) lze v SELECT části zjistit hodnotu operátoru DBI026 -DB Aplikace - MFF UK
397
Dotazování se nad textovým indexem
Operátory pro dotazování AND, & … ‘mice & cats’ OR, | … ‘mice | cats’ AND NOT, & ! … ‘mice AND NOT cats’ NEAR, ~ … proximitní dotazování ‘mice NEAR cats’ DBI026 -DB Aplikace - MFF UK
398
Dotazování se nad textovým indexem
Operátory pro dotazování Fráze v uvozovkách FORMSOF ( INFLECTIONAL , slovo) slovo se hledá ve všech tvarech hide, hidden, … FORMSOF ( THESAURUS , slovo) slovo se rozvine pomocí tezauru pro daný jazyk na seznam slov s podobným významem DBI026 -DB Aplikace - MFF UK
399
Dotazování se nad textovým indexem
Operátory pro dotazování Začátek slova následovaný hvězdičkou pro hledání všech slov začínajících prefixem ISABOUT ( slovo WEIGHT (n) [,…]) Vážený term, vhodný pro dotazy s využitím operátoru CONTAINSTABLE DBI026 -DB Aplikace - MFF UK
400
Dotazování se nad textovým indexem
CONTAINSTABLE( tabulka,sloupec,dotaz[,jazyk][,top_n] ) Vrací tabulku hodnot shody sloupce tabulky s dotazem. Ohodnocení je v pseudo sloupci RANK DBI026 -DB Aplikace - MFF UK
401
Dotazování se nad textovým indexem
SELECT select_list FROM table AS FT_TBL INNER JOIN CONTAINSTABLE(table, column, query) AS KEY_TBL ON FT_TBL.unique_key_column = KEY_TBL.[KEY] DBI026 -DB Aplikace - MFF UK
402
Dotazování se nad textovým indexem
SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK FROM Categories AS FT_TBL INNER JOIN CONTAINSTABLE(Categories, Description, 'ISABOUT (breads weight (.8), fish weight (.4), beers weight (.2) )' ) AS KEY_TBL ON FT_TBL.CategoryID = KEY_TBL.[KEY] ORDER BY KEY_TBL.RANK DESC DBI026 -DB Aplikace - MFF UK
403
Dotazování se nad textovým indexem
SELECT FT_TBL.Description, FT_TBL.CategoryName , KEY_TBL.RANK FROM Categories AS FT_TBL INNER JOIN CONTAINSTABLE (Categories, Description, '("sweet and savory" NEAR sauces) OR ("sweet and savory" NEAR candies)', 10) AS KEY_TBL ON FT_TBL.CategoryID = KEY_TBL.[KEY] DBI026 -DB Aplikace - MFF UK
404
Dotazování se nad textovým indexem
Operátory pro dotazování AND, & … ‘mice & cats’ OR, | … ‘mice | cats’ NOT, ~ … ‘mice ~ cats’ NEAR, ; … proximitní dotazování ‘mice ; cats’ NEAR((mice,cats),5) DBI026 -DB Aplikace - MFF UK
405
Dotazování se nad textovým indexem
Operátory pro dotazování ABOUT ( téma ) dokumenty pojednávající o tématu ‘about(politics)’ WEIGHT, * vynásobí skóre výrazu danou konstantou STEM, $ nalezne termy se stejným slovním základem DBI026 -DB Aplikace - MFF UK
406
Dotazování se nad textovým indexem
Operátory pro dotazování Na začátku / konci slova je možné uvést zástupné symboly _ a % dotaz WITHIN PARAGRAPH dotaz WITHIN SENTENCE Hledání v rámci odstavce, věty DBI026 -DB Aplikace - MFF UK
407
Dotazování se nad textovým indexem
SELECT nazev, SCORE(1)+SCORE(2) FROM dokument WHERE CONTAINS(abstrakt,’database & search’,1) > 0 AND CONTAINS( text, ’(object|relational) NEAR database’, 2) > 0 DBI026 -DB Aplikace - MFF UK
408
Dotazování se nad textovým indexem
Využití tezauru BT(slovo[,n]) … zahrnout i širší term pro slovo pokud je slovo homonymní, zahrnout všechny NT(slovo[,n]) … zahrnout i užší termy pro slovo PT(slovo) … nahradit preferovaným termem pro slovo TT(slovo) … nahradit nejširším termem pro slovo SYN(slovo) … zahrnout i synonyma pro slovo DBI026 -DB Aplikace - MFF UK
409
DBI026 -DB Aplikace - MFF UK
Synonyma v Oracle Vytvoření CREATE [PUBLIC] SYNONYM jmeno FOR [schema.]stare_jmeno; Zrušení DROP [PUBLIC] SYNONYM jmeno; Všude, kde lze použít původní název, lze použít nové jméno Lze vytvářet synonyma téměř ke všemu včetně synonym Veřejná synonyma vidí všichni bez prefixu vlastníka DBI026 -DB Aplikace - MFF UK
410
ROLLUP a CUBE operátory
Přednáška č. 7 Agregace dat ROLLUP a CUBE operátory
411
DBI026 -DB Aplikace - MFF UK
Agregace dat Pro jednoduché agregace dat v SQL slouží klauzule GROUP BY a HAVING spolu s agregačními funkcemi MIN, MAX, AVG, COUNT, COUNT DISTINCT, … Vytvářejí z řádků databáze skupiny se shodnými hodnotami v dané množině sloupců Pro tyto skupiny počítají agregované hodnoty Jedna skupina řádek vytvoří v agregovaném výsledku jednu řádku DBI026 -DB Aplikace - MFF UK
412
DBI026 -DB Aplikace - MFF UK
Agregace dat Sloupce, podle kterých se data seskupují nejsou v řadě případů nezávislé, ale tvoří hierarchii Př.: řetězec obchodů, evidující prodeje zboží: sloupce: Kraj, Město, Pobočka, Prodavač tvoří postupné zpřesnění místa prodeje Pro management je žádoucí znát obraty pro jednotlivé kraje, města, pobočky i jednotlivé prodavače DBI026 -DB Aplikace - MFF UK
413
DBI026 -DB Aplikace - MFF UK
Agregace dat Jednou z možností je vygenerování výstupu pomocí několika agregovaných dotazů a jejich spojení pomocí UNION ALL SELECT Kraj, Mesto, Pobocka, Prodavac, SUM(Cena) FROM Prodeje GROUP BY Kraj, Mesto, Pobocka, Prodavac UNION ALL SELECT Kraj, Mesto, Pobocka, NULL, SUM(Cena) FROM Prodeje GROUP BY Kraj, Mesto, Pobocka UNION ALL … DBI026 -DB Aplikace - MFF UK
414
DBI026 -DB Aplikace - MFF UK
GROUP BY ROLLUP SQL-92 Entry definuje rozšíření klauzule GROUP BY ROLLUP (sloupec1, sloupec2, …) která vytváří agregace pro vyšší úrovně automaticky v jediném dotazu Snadná formulace dotazu Zajištění konzistence výsledku (původní varianta nemusí při ISOLATION LEVEL < SERIALIYABLE počítat agregace v jednotlivých poddotazech nad stejnými daty) DBI026 -DB Aplikace - MFF UK
415
DBI026 -DB Aplikace - MFF UK
GROUP BY ROLLUP Pro GROUP BY ROLLUP nad k sloupci se pro každou místo jedné skupiny vytvoří k+1 řádek s agregacemi pro prvních k, k-1, k-2, ..., 0 sloupců DBI026 -DB Aplikace - MFF UK
416
DBI026 -DB Aplikace - MFF UK
GROUP BY ROLLUP SELECT Kraj, Mesto, Pobocka, Prodavac, SUM(Cena) FROM Prodeje GROUP BY ROLLUP ( Kraj, Mesto, Pobocka, Prodavac ); KRAJ MESTO POBOCKA PRODAVAC SUM(CENA) Praha Praha Karlín Novák Praha Praha Karlín Dvořák Praha Praha Karlín Praha Praha Smíchov Malá Praha Praha Smíchov Praha Praha … DBI026 -DB Aplikace - MFF UK
417
DBI026 -DB Aplikace - MFF UK
Agregace dat Pokud sloupce naopak jsou nezávislé, je v některých případech žádoucí spočítat součty pro všechny podmnožiny sloupců Př.: řetězec obchodů, evidující prodeje zboží: sloupce: Kraj, TypZboží Potřebujeme znát objemy prodejů jednotlivých typů zboží v jednotlivých krajích, stejně jako prodejnost zboží bez ohledu na kraj, prodejnost v krajích bez ohledu na typ zboží, a celkový obrat firmy DBI026 -DB Aplikace - MFF UK
418
DBI026 -DB Aplikace - MFF UK
Agregace dat Generovat výsledky pomocí více dotazů je neefektivní, pro k sloupců je potřebné spočítat výsledky pro všech 2k podmnožin DBI026 -DB Aplikace - MFF UK
419
DBI026 -DB Aplikace - MFF UK
GROUP BY CUBE Generovat výsledky pomocí více dotazů je neefektivní, pro k sloupců je potřebné spočítat výsledky pro všech 2k podmnožin SQL-92 Entry definuje rozšíření klauzule GROUP BY CUBE (sloupec1, sloupec2, …) která vytváří agregace pro podskupiny automaticky v jediném dotazu DBI026 -DB Aplikace - MFF UK
420
DBI026 -DB Aplikace - MFF UK
GROUP BY CUBE SELECT Kraj, TypZbozi, SUM(Cena) FROM Prodeje GROUP BY CUBE (Kraj, TypZbozi); KRAJ TYPZBOZI SUM(CENA) Praha Elektro Praha Potraviny Kladno Elektro Liberec Potraviny Praha Elektro … DBI026 -DB Aplikace - MFF UK
421
DBI026 -DB Aplikace - MFF UK
GROUP BY GROUPING SETS Dovoluje určit jen vybrané podmnožiny sloupců, pro které se agregace počítají SELECT Sloupec1, Sloupec2, Sloupec3, … FROM Tabulka GROUP BY GROUPING SETS( (Sloupec1, Sloupec2, Sloupec3), (Sloupec1, Sloupec2), (Sloupec2, Sloupec3) ); DBI026 -DB Aplikace - MFF UK
422
DBI026 -DB Aplikace - MFF UK
GROUPING, GROUPING_ID Funkce GROUPING(sloupec) {0,1} vrací informaci, zda se podle daného sloupce v daném řádku provádělo seskupování, či nikoli Funkce GROUPING_ID N vrací bitovou mapu sloupců podle kterých se v dané řádce výsledku data seskupovala DBI026 -DB Aplikace - MFF UK
423
Využití XML v DB aplikacích
424
Komunikace aplikace s okolím
Databázová aplikace potřebuje často komunikovat s dalšími informačními systémy Export podkladů z IS pro externí účetnictví B2G (business-to-government) Export výkazů pro státní správu B2B (business-to-business) Import údajů z IS jiných firem Elektronické objednávky SOA service-oriented architecture Komunikace mezi jednotlivými komponentami DBI026 -DB Aplikace - MFF UK
425
Komunikace aplikace s okolím
Pro komunikaci se ve stále větší míře používá XML formát dat Čitelný i pro lidskou obsluhu aplikací Strukturovaný Snadno parsovatelný Velký objem dat Přímé dotazování nad XML daty vyžaduje zcela odlišné nástroje a datové struktury, než relační databází DBI026 -DB Aplikace - MFF UK
426
DBI026 -DB Aplikace - MFF UK
XML a relační databáze Pro komunikaci databázové aplikace s okolím je proto často potřebné Exportovat uložená relační data do XML Získat informace uložené v uzlech XML stromu a uložit je do relačních tabulek Ukládat původní XML dokumenty, získané od obchodních partnerů Vyhledávat XML dokumenty obsahující dané informace DBI026 -DB Aplikace - MFF UK
427
Adresování dat v XML - XPath
XPath je jedním z často používaných dotazovacích jazyků nad XML Výsledkem dotazu je množina uzlů či atributů, které vyhovují zadané podmínce Dokument je chápán jako strom, obsahující Kořenový uzel (není součástí dokumentu) Elementy Atributy Textové uzly (listy, odpovídají volnému textu mezi uzly) … (komentáře, jmenné prostory, instrukce pro zpracování) DBI026 -DB Aplikace - MFF UK
428
Adresování dat v XML - XPath
Cesta je základním prostředkem pro adresaci uzlu či uzlů ve stromě Absolutní začínají znakem ’/’ Relativní Zapisuje se jako seznam kroků, oddělených lomítky. DBI026 -DB Aplikace - MFF UK
429
Adresování dat v XML - XPath
Příklady Xpath dotazů /knihy/kniha/nazev seznam všech elementů nazev, které jsou přímým potomkem elementu kniha, který je přímým potomkem kořenového elementu knihy. //nazev seznam všech elementů nazev v XML stromu, nacházejících se na libovolných cestách DBI026 -DB Aplikace - MFF UK
430
Adresování dat v XML - XPath
Příklady Xpath dotazů /knihy/*/nazev na druhém kroku cesty může být libovolný element /knihy/kniha[1]/autor[2] druhý autor první knihy v seznamu /knihy/kniha[autor=’Pokorný J.’]/titul tituly všech knih od J. Pokorného DBI026 -DB Aplikace - MFF UK
431
Adresování dat v XML - XPath
Osy v XPath self:: - aktuální uzel parent::, child:: - přímý rodič/potomci aktuálního uzlu ancestor::, descendand:: - všichni předci/potomci, včetně nepřímých descendand-or-self::, ancestor -or-self:: following::, preceding:: - uzly před/za aktuálním uzlem a všemi jeho předky following-sibling::, preceding-sibling:: - sourozenci attribute:: - atributy aktuálního uzlu child:: tvoří defaultní osu, nemusí se uvádět DBI026 -DB Aplikace - MFF UK
432
Adresování dat v XML - XPath
preceding:: following:: DBI026 -DB Aplikace - MFF UK
433
Adresování dat v XML - XPath
Obvykle se využívají zkrácené notace jméno_uzlu místo child::jméno_uzlu @jméno_atributu místo attribute:: jméno_atributu ’.’ pro aktuální uzel ’..’ pro rodičovský uzel DBI026 -DB Aplikace - MFF UK
434
Adresování dat v XML - XPath
Příklady dotazů Názvy všech knih /knihy/kniha/nazev/text() První kniha v seznamu /knihy/kniha[1] <kniha><nazev>…</nazev><autor>…</autor></kniha> DBI026 -DB Aplikace - MFF UK
435
DBI026 -DB Aplikace - MFF UK
Indexování dat v XML Problémem je efektivita vyhodnocování XPath dotazů, případně dotazů v jiných dotazovacích jazycích nad XML Data mohou být v relační databázi uložena po částech, a využity standardní nástroje (spojení, indexy) Použitelné v libovolné relační databázi Nutná znalost struktury ukládaných dokumentů (DTD, XMLSchema) Data mohou být uložena nativně v podobě textu Nutná podpora speciálních typů indexů DBI026 -DB Aplikace - MFF UK
436
Ukládání XML do relačních databází
Pokud je potřeba ukládat XML dokumenty, platné vzhledem ke konkrétnímu DTD, je možné použít několik variant uložení Nástin jednoho z možných řešení: Předpokládá dostatečně jednoduché DTD, nebo vytvoření jednoduššího DTD’, které je méně striktní, než DTD původní, tj.: platnost v DTD platnost v DTD’ Elementy jmenují jiné elementy ve svém obsahu nejvýše jednou Obsažený element může být nepovinný (?) nebo opakující se (*) Obsažené elementy jsou oddělené pouze čárkou, ne ’|’ Na pořadí elementů nezáleží DBI026 -DB Aplikace - MFF UK
437
Ukládání XML do relačních databází
Pro takto zjednodušené DTD je možné vytvořit Seznam možných cest v XML stromu Pro každý element je E vytvořena tabulka, obsahující sloupce pro jednotlivé atributy E(DocID,ElemID,ParID,PathID,atributy) Id dokumentu, Id elementu,sloupce pro uchování atributů, Id rodičovského elementu, Id cesty na které element leží DBI026 -DB Aplikace - MFF UK
438
Ukládání XML do relačních databází
<!ELEMENT kniha (titul, autor)> <!ATTLIST kniha isbn CDATA)> <!ELEMENT titul (#PCDATA)> <!ELEMENT autor (#PCDATA)> Kniha(DocID,ElemID,ParID,PathID,ISBN) Titul(DocID,ElemID,ParID,PathID,PCDataId) Autor(DocID,ElemID,ParID,PathID,PCDataId) PCData(DocID,ElemID,Data) DBI026 -DB Aplikace - MFF UK
439
Ukládání XML do relačních databází
Dotazy v XPath jsou přeformulovány na SQL Často je nutné spojovat velké množství tabulek. Jejich počet je možné snížit např. tím, že pro podstromy, ve kterých se nemůže vyskytovat opakující se element, se vytvoří jediná tabulka obsahující element a všechny podelementy DBI026 -DB Aplikace - MFF UK
440
Ukládání XML do relačních databází
<!ELEMENT kniha (titul, autor)> <!ATTLIST kniha isbn CDATA)> <!ELEMENT titul (#PCDATA)> <!ELEMENT autor (#PCDATA)> Kniha( DocID,ElemID, ISBN, TitulPCDataId, AutorPCDataId, ParID,PathID) PCData(DocID,ElemID,Data) DBI026 -DB Aplikace - MFF UK
441
Ukládání XML do relačních databází
<!ELEMENT kniha (titul, autor*)> <!ATTLIST kniha isbn CDATA)> <!ELEMENT titul (#PCDATA)> <!ELEMENT autor (#PCDATA)> Pokud se autor může vícekrát opakovat, je nutné jej uložit do samostatné tabulky, titul ale může být sloučen Kniha( DocID,ElemID,ISBN,TitulPCDataId,ParID,PathID) Autor(DocID,ElemID,ParID,PathID,PCDataId) PCData(DocID,ElemID,Data) DBI026 -DB Aplikace - MFF UK
442
DBI026 -DB Aplikace - MFF UK
Indexace XML dat DataGuide index obsahuje strom cest, vyskytujících se v XML dokumentu Každá cesta je vněm uložena právě jednou Uzly obsahují metainformace o uzlech, které dané cestě odpovídají Je možné jej uložit v XML formátu DBI026 -DB Aplikace - MFF UK
443
DBI026 -DB Aplikace - MFF UK
Indexace XML dat Index cest v XML Obdoba DataGuide indexu V uzlech obsahuje přímo množiny odkazů na jednotlivé elementy, které cestě odpovídají Výrazně urychluje odpovědi na dotazy ve formě cest bez použití // Přispívá pro vyhodnocení dotazů, které alespoň začínají absolutní cestou, a // obsahují ve větší hloubce DBI026 -DB Aplikace - MFF UK
444
DBI026 -DB Aplikace - MFF UK
Indexace XML dat Lore Index VIndex (Value index) - indexuje textové hodnoty uzlů a atributů TIndex (Term index) - indexuje slova v hodnotách elementů LIndex - index pro nalezení otců pro jednotlivé uzly PIndex (Path index) - indexuje cesty a udržuje pro ně množiny odpovídajících uzlů DBI026 -DB Aplikace - MFF UK
445
DBI026 -DB Aplikace - MFF UK
Indexace XML dat Lore Index pomocí VIndexu se naleznou atributy stat s hodnotou ”CZ”, pro ně se bottom-up postupem přes LIndex ověří cesta DBI026 -DB Aplikace - MFF UK
446
DBI026 -DB Aplikace - MFF UK
Uložení XML dat – MS SQL Nativní datový typ XML CREATE TABLE XmlTab( ID NUMERIC CONSTRAINT XmlTabPk PRIMARY KEY, Dok XML ); INSERT INTO XmlTab VALUES( 1, ’<a><b>b1</b></a>’ ); DBI026 -DB Aplikace - MFF UK
447
Uložení XML dat– Oracle
Typ XMLType, který dovoluje dvojí způsob uložení: Pomocí CLOB Dokument je vrácen přesně v původním tvaru včetně bílých znaků (formátování) Není nutné znát XMLSchema Komplikované částečné aktualizace Pouze full-text indexování DBI026 -DB Aplikace - MFF UK
448
Uložení XML dat– Oracle
Typ XMLType, který dovoluje dvojí způsob uložení: Pomocí rozložení do tabulek Je vrácen dokument, shodný s ohledem na DOM, tj. bez zachování bílých znaků (formátování) Je nutné znát a předem v databázi zaregistrovat XMLSchema Efektivní částečné aktualizace Možné indexování i pomocí B-stromů DBI026 -DB Aplikace - MFF UK
449
Uložení XML dat – Oracle
Nativní datový typ XMLType CREATE TABLE XmlTab( ID NUMERIC CONSTRAINT XmlTabPk PRIMARY KEY, Dok XMLType ); INSERT INTO XmlTab VALUES( 1, ’<a><b>b1</b></a>’ ); DBI026 -DB Aplikace - MFF UK
450
Export tabulky do XML – MS SQL
MS SQL pro export dat z tabulek do XML podoby používá konstrukci SELECT … FOR XML {RAW|AUTO|EXPLICIT|PATH} [,XMLDATA][,ELEMENTS][BINARY BASE64] [ROOT(’korenovy_element’)] RAW generuje pro každou řádku jeden element row, hodnoty jsou obsažené v atributech elementu, názvy atributů odpovídají názvům sloupců (aliasů) v dotazu DBI026 -DB Aplikace - MFF UK
451
Export tabulky do XML – MS SQL
MS SQL pro export dat z tabulek do XML podoby používá konstrukci SELECT … FOR XML {RAW|AUTO|EXPLICIT|PATH} [,XMLDATA][,ELEMENTS][BINARY BASE64] RAW generuje pro každou řádku jeden element row, hodnoty jsou obsažené v atributech elementu, názvy atributů odpovídají názvům sloupců (aliasů) v dotaz <row empno=”1230” ename=”King” deptno=”10” /> <row empno=”4560” ename=”Scott” deptno=”10” /> <row empno=”7800” ename=”King” deptno=”20” /> DBI026 -DB Aplikace - MFF UK
452
Export tabulky do XML – MS SQL
AUTO generuje pro každou tabulku v použitém dotazu jeden element. Struktura odpovídá spojení. Názvy elementů odpovídají názvům tabulek <dept deptno=”10”> <emp empno=”1230” ename=”King” /> <emp empno=”4560” ename=”Scott” /> </dept> <dept deptno=”20”> <emp empno=”7800” ename=”King” deptno=”20” /> </dept> DBI026 -DB Aplikace - MFF UK
453
Export tabulky do XML – MS SQL
Modifikátor ELEMENTS zajistí, že hodnoty atributů jsou uloženy jako podelementy, nikoli jako atributy <dept> <deptno>10</deptno> <emp> <empno>1230</empno><ename>King</ename> <empno>4560</empno><ename>Scott</ename> </emp> </dept> <dept deptno=”20”> </dept> DBI026 -DB Aplikace - MFF UK
454
Export tabulky do XML – Oracle
Pro export dat do XML lze použít např. funkci SYS_XMLGEN, která jako argument může dostat buďto atomickou hodnotu, nebo strukturovaný uživatelský datový typ SELECT SYS_XMLGEN(ename) FROM … <ENAME>SMITH</ENAME> <ENAME>ALLEN</ENAME> ... DBI026 -DB Aplikace - MFF UK
455
Export tabulky do XML – Oracle
SYS_XMLGEN(instance) SELECT SYS_XMLGEN( dept_t(deptno,dname, CAST(MULTISET( select empno, ename from emp e where e.deptno = d.deptno) AS emplist_t))).getClobVal() AS deptxml FROM dept d; <?xml version="1.0"?> <ROW DEPTNO="100"> <DNAME>Sports</DNAME> <EMPLIST> <EMP_T EMPNO="200"> <ENAME>John</ENAME> </EMP_T> <EMP_T> <ENAME>Jack</ENAME> </EMP_T> </EMPLIST> </ROW> DBI026 -DB Aplikace - MFF UK
456
Export tabulky do XML – Oracle
XML lze generovat rovněž po částech s použitím řady funkcí. XMLElement( jméno[,atributy][,potomek1, …]] ) XMLAttributes(jm1 AS alias1 [, …]) DBI026 -DB Aplikace - MFF UK
457
Export tabulky do XML – Oracle
SELECT XMLElement( ”emp”, XMLAttributes(empno, ename AS name), XMLElement(”salary”, sal), XMLElement(”comm”, comm) ) FROM Emp WHERE empno=1000; <emp empno=”1000” name=”King”> <salary>578</salary> <comm>50</comm> </emp> Každý řádek vygeneruje jednu hodnotu XMLType DBI026 -DB Aplikace - MFF UK
458
Export tabulky do XML – Oracle
XMLForest(hodnota1 AS alias1, …) Vygeneruje posloupnost elementů která nemá jediný kořen, nejedná se proto o XML dokument SELECT XMLForest( empno, deptno as name ) FROM emp; <empno>1000</empno><deptno>10</deptno> <empno>2300</empno><deptno>20</deptno> … DBI026 -DB Aplikace - MFF UK
459
Export tabulky do XML – Oracle
XMLConcat(XML1, …) Sloučí všechny XML dokumenty za sebe, výsledkem nebude XML dokument, protože bude obsahovat více kořenových elementů XMLSequence(fragment) Kolekce XML dokumentů, každý odpovídá jednomu kořenovému elementu ve fragmentu DBI026 -DB Aplikace - MFF UK
460
Indexování XML dat – MS SQL
MS SQL dovoluje nad sloupcem typu XML vytvořit tři typy indexů Nejprve je nutné vytvořit primární XML index CREATE PRIMARY XML INDEX XmlIdx ON XmlTab(Dok) Následně lze vytvořit hodnotový index, index cest a index vlastností CREATE XML INDEX jm ON XmlTab(Dok) USING XML INDEX XmlIdx FOR {VALUE|PATH|PROPERTY} DBI026 -DB Aplikace - MFF UK
461
DBI026 -DB Aplikace - MFF UK
Získání dat z XML Pokud je k dispozici XML dokument s požadavkem na databázovou aplikaci, je potřebné získat z něj potřebné údaje a požadavek vyřídit, nebo data uložit do relační databáze DBI026 -DB Aplikace - MFF UK
462
Získání dat z XML – MS SQL
Využívá XPath pro adresaci jednotlivých elementů a jejich množin, případně Xquery pro konstrukci výsledného XML z XML zdrojového xml.Query(dotaz) Vrací fragment, obsahující elementy, vyhovující dotazu Dok.Query(’/kniha/autor’) xml.Exist(dotaz) Vrací 1, pokud ex. alespoň jeden uzel, odpovídající dotazu. Jinak vrací 0 xml.Value(dotaz,typ) Vrací hodnotu odpovídajícího uzlu DBI026 -DB Aplikace - MFF UK
463
Získání dat z XML – Oracle
Využívá XPath pro adresaci jednotlivých elementů a jejich množin Extract(xml,xpath) Vrací fragment, obsahující elementy, vyhovující dotazu Extract(xml,’/kniha/autor’) ExistsNode(xml,xpath) Vrací 1, pokud ex. alespoň jeden uzel, odpovídající dotazu. Jinak vrací 0 ExtractValue(xml,xpath) Vrací hodnotu (jediného) odpovídajícího uzlu DBI026 -DB Aplikace - MFF UK
464
Získání dat z XML – MS SQL
SELECT dok.Query(’/kniha/autor’) FROM knihy; <autor>Pokorný J.</autor> <autor>Král J.</autor> SELECT dok.Value(’/kniha/autor’,’varchar(30)’) FROM knihy; Pokorný J. Král J. DBI026 -DB Aplikace - MFF UK
465
Získání dat z XML – Oracle
SELECT Extract(dok,’/kniha/autor’) FROM knihy; <autor>Pokorný J.</autor> <autor>Král J.</autor> SELECT ExtractValue(dok,’/kniha/autor’) FROM knihy; Pokorný J. Král J. DBI026 -DB Aplikace - MFF UK
466
Aktualizace XML - MS SQL
Metoda xml.Modify(’XQuery’) UPDATE Knihy SET seznam=seznam.Modify( ’delete /knihy/kniha[autor=”Kopecký M.”]’ ) WHERE … UPDATE Knihy SET seznam=seznam.Modify( ’insert <kniha><autor>…</autor>…</kniha> into /knihy’) WHERE ... DBI026 -DB Aplikace - MFF UK
467
Aktualizace XML - Oracle
Funkce UpdateXML(xml,path1,val1,path2,val2,…) UPDATE Knihy SET seznam=UpdateXML(seznam, ’/kniha[nazev=”DIS”]/autor’,’Pokorný J.’ ) WHERE … DBI026 -DB Aplikace - MFF UK
468
Zpřístupnění XML dat – MS SQL
Pomocí nástroje „IIS Virtual Directory Management for SQL Server “ lze definovat v IIS 5 a vyšším adresář, pomocí kterého lze XML data publikovat na webu // * FROM KNIHY FOR XML AUTO&root=knihy DBI026 -DB Aplikace - MFF UK
469
Zpřístupnění XML dat – Oracle
Pomocí XML DB repozitory je možné XML dokumenty, uložené v databázi, zveřejnit na webu ve virtuálních adresářích DBI026 -DB Aplikace - MFF UK
470
Přístup ke vzdáleným XML zdrojům
HttpUriType Konstruktor HttpUriType(url) Metody GetCLOB() GetBLOB() GetXML() DBI026 -DB Aplikace - MFF UK
471
National Language Support Oracle
NLS National Language Support Oracle
472
Podpora národních jazyků (National Language Support)
Zahrnuje řadu rozšíření pro provoz v národním i vícejazyčném prostředí Znakové sady Národní datové typy Použití speciálních znaků v názvech objektů Kódy měny Zobrazování čísel Kalendář, formát datumu, ... Způsob třídění a porovnávání dle pravidel jazyka Jazyk komunikace DBI026 -DB Aplikace - MFF UK
473
Podpora národních jazyků (National Language Support)
Národní prostředí databázového serveru Dvojí znaková sada databáze Univerzální (UTF-8, ISO Latin 2, CP 1250, …) Národní (ISO Latin 2, US ASCII 7bit) Ne „větší“ než univerzální sada Úspora místa v případě vícebajtového univerzálního kódování Dvojí znakové datové typy Dle ANSI SQL: NATIONAL <jméno typu> např. NATIONAL CHARACTER VARYING Proprietární typy N<jméno typu> např. NVARCHAR2 DBI026 -DB Aplikace - MFF UK
474
Podpora národních jazyků (National Language Support)
Národní prostředí klienta Proprietární řešení, používající přepínače NLS_* x Tři úrovně nastavení Pro počítač, resp. Uživatele Proměnné prostředí (UNIX) Hodnoty v registru (MS Windows) HKLM\Software\Oracle\ HKCU\Software\Oracle\ Pro session Na začátku dle nastavení 1. Změna příkazem ALTER SESSION SET přepínač=hodnota Platí do další explicitní změny či odhlášení Pro konkrétní příkaz Dodatečný (nepovinný) parametr u některých funkcí DBI026 -DB Aplikace - MFF UK
475
Podpora národních jazyků (National Language Support)
Přepínač NLS_LANG základní nastavení NLS prostředí ostatní jsou pouze doplňkové pro předefinování detailů Formát hodnoty NLS_LANG=Language_Territory.CodePage American_America.EE8ISO8859P2 Jazyk komunikace anglický (US) Národní prostředí pro USA Kódová stránka na klientovi ISO Latin 2 Czech_Czech Republic.EE8WIN1250 DBI026 -DB Aplikace - MFF UK
476
Podpora národních jazyků (National Language Support)
Přepínač NLS_LANGUAGE Předefinuje nastavení jazyka z NLS_LANG Formát hodnoty NLS_LANGUAGE=Language Czech, Slovak, German, … Ovlivňuje jazyk komunikace Chybová hlášení Názvy dní, měsíců DBI026 -DB Aplikace - MFF UK
477
Podpora národních jazyků (National Language Support)
Přepínač NLS_TERRITORY Předefinuje nastavení oblasti z NLS_LANG Formát hodnoty NLS_TERRITORY=Territory Czech Republic, Slovakia, Germany, … Ovlivňuje většinu nastavení národního prostředí Formáty čísel, datumů Kalendář DBI026 -DB Aplikace - MFF UK
478
Podpora národních jazyků Porovnávání a třídění
Přepínač NLS_SORT Předefinuje nastavení třídění, odvozené z NLS_LANGUAGE Formát hodnoty NLS_SORT=BINARY | Language Czech, Slovak, German, … Pro BINARY se třídí dle kódů znaků, tedy např. Máma > My Pro např. Czech se třídí lingvisticky, včetně H < Ch < I Obdobně se dodrží specifika i pro ostatní jazyky ALE nealfanumerické znaky se ignorují A < *B DBI026 -DB Aplikace - MFF UK
479
Podpora národních jazyků Porovnávání a třídění
Přepínač NLS_COMP Definuje nastavení porovnávání Formát hodnoty NLS_COMP=BINARY | ANSI Czech, Slovak, German, … Pro BINARY se porovnává dle kódů znaků, tedy např. Máma > My Pro ANSI se použije lingvistické porovnávání podle nastavení NLS_SORT. Pro NSL_SORT=Czech platí mj. H < Ch < I DBI026 -DB Aplikace - MFF UK
480
Podpora národních jazyků Porovnávání a třídění
Funkce NLSSORT( s VARCHAR2 [, nls_settings VARCHAR2] ) RETURN VARCHAR2 Vrací pro řetězec s jeho reprezentaci takovou, aby při jejich binárním porovnávání byly dodrženy lingvistické pravidla jazyka NLSSORT(x) <bin NLSSORT(y) x <lang y DBI026 -DB Aplikace - MFF UK
481
Podpora národních jazyků Porovnávání a třídění
Lingvistické indexy Funkční indexy, využívající funkci NLSSORT CREATE INDEX nls_index ON tabulka( NLSSORT(sloupec, 'NLS_SORT = German') ); DBI026 -DB Aplikace - MFF UK
482
Podpora národních jazyků Porovnávání a třídění
Vícejazykové indexy Funkční indexy, využívající funkci NLSSORT CREATE INDEX german_index ON tabulka( NLSSORT(sloupec, 'NLS_SORT = German') ); CREATE INDEX czech_index ON tabulka( NLSSORT(sloupec, 'NLS_SORT = Czech') ); Správný index se vybere dle NLS_SORT v session DBI026 -DB Aplikace - MFF UK
483
Podpora národních jazyků Porovnávání a třídění
Lingvistické indexy fungují, pokud Povolený přepínač QUERY_REWRITE_ENABLED ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE; Přepínač NLS_COMP nastavený na ANSI ALTER SESSION SET NLS_COMP=ANSI; Optimalizace nastavena na cost-based, s cílem minimalizovat odezvu na první řádky ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS; DBI026 -DB Aplikace - MFF UK
484
Podpora národních jazyků Porovnávání a třídění
ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE; ALTER SESSION SET NLS_COMP = ANSI; ALTER SESSION SET NLS_SORT='FRENCH'; ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS; CREATE INDEX test_idx ON test(NLSSORT(col, 'NLS_SORT=FRENCH')); SELECT * FROM test ORDER BY col; SELECT * FROM test WHERE col > 'JJJ'; DBI026 -DB Aplikace - MFF UK
485
Podpora národních jazyků Porovnávání a třídění
Vyhledávání bez ohledu na velikost znaků Funkční indexy, využívající funkci NLSSORT CREATE INDEX nls_index ON tabulka( NLS_UPPER(sloupec, 'NLS_SORT = German') ); DBI026 -DB Aplikace - MFF UK
486
Podpora národních jazyků Porovnávání a třídění
Vyhledávání bez ohledu na diakritiku: háčky, čárky (přehlásky, …) ALTER SESSION SET NLS_COMP=ANSI; ALTER SESSION SET NLS_SORT=GENERIC_BASELETTER; Písmena e,é,ě,E,É,Ě budou považována při porovnávání za shodná DBI026 -DB Aplikace - MFF UK
487
Podpora národních jazyků Datumy
Přepínač NLS_CALENDAR Defaultně Gregorian Existují i další Arabic Hijrah English Hijrah Japanese Imperial Persian ROC Official Thai Buddha DBI026 -DB Aplikace - MFF UK
488
Podpora národních jazyků Datumy
Přepínač NLS_DATE_LANGUAGE Jazyk pro názvosloví dní a měsíců Default odvozen z NLS_LANGUAGE Použitelný v konverzní funkci TO_CHAR(datum, formát,’NLS_DATE_LANGUAGE=Czech’) Formátovací značky Day … den v týdnu (Pondělí, …, Neděle) Dy … den zkratkou (Po, …, Ne) Month … měsíc slovem (Leden, …, Prosinec) Mon … měsíc zkratkou (Led, …, Pro) Neovlivní spelování a skloňování DDTH … 12TH, ne 12tého DDSP … twelve, ne dvanáct DDSPTH … twelfth, ne dvanáctého DBI026 -DB Aplikace - MFF UK
489
Podpora národních jazyků Datumy
Přepínač NLS_DATE_FORMAT Formát datumu Default odvozen z NLS_TERRITORY DD-MON-RR pro America DD.MM.YYYY pro Czech Republic Použitý jako default v konverzní funkci TO_CHAR(datum) TO_DATE(’text’) DBI026 -DB Aplikace - MFF UK
490
Podpora národních jazyků Časová razítka
Datový typ TIMESTAMP Od verze 9i Obdobný typu date, přesnost na tisícinu sekundy Funkce TO_TIMESTAMP Zlomky sekund mají masku FF Přepínač NLS_TIMESTAMP_FORMAT DBI026 -DB Aplikace - MFF UK
491
Podpora národních jazyků Časové zóny
Datový typ TIMESTAMP WITH TIME ZONE Funkce SESSIONTIMEZONE CURRENT_DATE … datum s ohledem na časové zóny Od verze 9i Přepínač TIME_ZONE ALTER SESSION SET TIME_ZONE = '+1:0'; Přepínač NLS_TIMESTAMP_TZ_FORMAT Pro funkce TO_CHAR, TO_TIMESTAMP_TZ 'DD.MM.YYYY HH24:MI:SS.FF TZH:TZM' DBI026 -DB Aplikace - MFF UK
492
Podpora národních jazyků Časové zóny
ALTER SESSION SET TIME_ZONE = local; Nastavit TZ pro session dle operačního systému ALTER SESSION SET TIME_ZONE = DBTIMEZONE; Nastavit TZ pro session dle databáze ALTER SESSION SET TIME_ZONE = '+01:00'; Nastavit TZ pro session na časový posun oproti GMT ALTER SESSION SET TIME_ZONE = 'America/New_York'; DBI026 -DB Aplikace - MFF UK
493
Podpora národních jazyků Časové zóny
Funkce LOCALTIMESTAMP Vrací typ TIMESTAMP Funkce CURRENT_TIMESTAMP Vrací typ TIMESTAMP WITH TIME ZONE Funkce SESSIONTIMEZONE Funkce DBTIMEZONE DBI026 -DB Aplikace - MFF UK
494
Podpora národních jazyků Čísla a měna
Přepínač NLS_NUMERIC_CHARACTERS Znaky pro oddělovač desetin a skupin Default odvozen z NLS_TERRITORY ’.,’ pro America ’, ’ pro Czech Republic Použitý v konverzní funkci TO_CHAR(číslo, formát) DBI026 -DB Aplikace - MFF UK
495
Podpora národních jazyků Čísla a měna
Přepínač NLS_NUMERIC_CHARACTERS Znaky pro oddělovač desetin a skupin Default odvozen z NLS_TERRITORY ’.,’ pro America ’, ’ pro Czech Republic Použitý v konverzní funkci TO_CHAR(číslo, formát) DBI026 -DB Aplikace - MFF UK
496
Podpora národních jazyků Čísla a měna
Konverzní funkce TO_CHAR(číslo, formát) 9 cifra, resp. mezera, pokud číslo nemá dost cifer 0 cifra, resp. nula, pokud číslo nemá dost cifer D oddělovač desetin G oddělovač skupin Příklad: ’999G999G990D00’ DBI026 -DB Aplikace - MFF UK
497
Podpora národních jazyků Čísla a měna
Přepínač NLS_CURRENCY Symbol měny, odvozený z NLS_TERRITORY Defaultně Kč pro Czech Republic Formátovací znak po TO_CHAR(n) … L Přepínač NLS_ISO_CURRENCY ISO symbol měny, odvozený z NLS_TERRITORY Defaultně CZK pro Czech Republic Formátovací znak po TO_CHAR(n) … C DBI026 -DB Aplikace - MFF UK
498
Podpora národních jazyků Čísla a měna
Konverzní funkce TO_CHAR(číslo, formát) I kód měny dle ISO C kód měny Příklad: ’999G990D00 I’ DBI026 -DB Aplikace - MFF UK
499
Podpora národních jazyků Funkce
UPPER, LOWER, INITCAP Řídí se nastavením NLS_LANGUAGE NLS_UPPER, NLS_LOWER, NLS_INITCAP Mají nepovinný druhý parametr s NLS přepínači DBI026 -DB Aplikace - MFF UK
500
DBI026 -DB Aplikace - MFF UK
MFF - Výhled mates.ms.mff… Linux Server mates.ms.mff.cuni.cz Databáze devitka (9.2.0) Databáze desitka (10.x) Klienti Linux (9.2.0, 10.x) Laboratoř UW1, UW2 Klienti Win32 (9.2.0, 10.x) Laboratoř US1, US2 (u-pl*.ms.mff…) Klienti Linux (10.x) devitka desitka TCP/IP UW1,2 u-pl*.ms.mff… DBI026 -DB Aplikace - MFF UK
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.