Databázové Aplikace Slidy k přednášce DBI026 KSI MFF UK

Slides:



Advertisements
Podobné prezentace
Aplikační a programové vybavení
Advertisements

Zpracování SQL Lubomír Andrle 5. přednáška
A5M33IZS – Informační a znalostní systémy Dotazovací jazyk SQL - I.
SQL: DDL v ORACLE CREATE TABLE jméno_tabulky (atribut datový_typ [DEFAULT][attribut_constraint] [, atribut datový_typ [DEFAULT] [attribut_constraint]],...
Aplikační a programové vybavení
Jazyk SQL Ing. Zdena DOBEŠOVÁ. SQL Structured Query Language 1974 SEQUEL (Structured English Query Language) neprocedurální relační dotazovací jazyk norma.
DB1 – 9. cvičení Optimalizace dotazu Konkurenční přístup a deadlock Indexace Transakce.
YDASYS1 Ing. Monika Šimková.
Fakulta elektrotechniky a informatiky
Informační systémy Realizace uložených procedur a spouští, jejich praktické využití.
Další dotazy SQL Structured Query Language. Některé SQL příkazy mohou mít v sobě obsaženy další kompletní příkazy SELECT. Využijeme je tam, kde potřebujeme.
Informatika pro ekonomy II přednáška 11
Architektury a techniky DS Tvorba efektivních příkazů I Přednáška č. 3 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Databázové systémy 1 Cvičení č. 2 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy II Přednáška č. 6 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Databázové systémy II Přednáška č. 5 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Programování v Pascalu Přednáška 7
Materiály k přednášce Úvod do programování Ondřej Čepek.
Radek Špinka Přepínače MSSQL výběr.
Databáze Jiří Kalousek.
MySQL - Vytvoření nové tabulky  create table jméno_tabulky (jméno_položky typ_položky,... ) Přehled nejběžnějších datových typů Přehled nejběžnějších.
Databázové systémy II Přednáška č. 8 – Pohledy (Views)
Vyučovací hodina 1 vyučovací hodina: Opakování z minulé hodiny 5 min Nová látka 20 min Procvičení nové látky 15 min Shrnutí 5 min 2 vyučovací hodiny: Opakování.
Školení správců II. Petr Pinkas RNDr. Vít Ochozka.
Fakulta elektrotechniky a informatiky
Procedurální rozšíření Transact SQL Michal Kopecký Výběr ze slajdů k 3. přednášce předmětu Databázové Aplikace (DBI026) na MFF UK.
Databázové systémy teorie a návrh relačních databázových systémů část II.
Relační databáze.
Vypracoval: Ondřej Dvorský Třída: VIII.A
KIV/ZIS cvičení 6 Tomáš Potužák. Pokračování SQL Klauzule GROUP BY a dotazy nad více tabulkami Stáhnout soubor studenti_dotazy_sql.mdb.
Informatika pro ekonomy II přednáška 10
Databázové systémy Přednáška č. 6.
SQL PVA Jan Hora. SQL „graficky“ Grafický vs. pravý SQL SELECT ORDED BY WHERE.
Databázové systémy 2 Cvičení č. 6 Ing. Tomáš Váňa Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy II Přednáška č. X Ing. Tomáš Váňa, Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky
JavaScript Podmínky, cykly a pole.
Cvičení.
Databázové systémy II Přednáška V Ing. Tomáš Váňa, Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky
Architektury a techniky DS Cvičení č. 9 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Optimalizace SQL dotazů Michal Kopecký
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
Dynamic SQL P. Částek. Dynamic SQL Embedded SQL je překládaný preprocesorem => za běhu nelze nechat uživatele rozhodovat o vzhledu samotných SQL příkazů.
Aplikační a programové vybavení
Databázové systémy Informatika pro ekonomy, př. 18.
Databáze velké množství dat pevně dané struktury
Databázové systémy SQL Výběr dat.
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
Databázové Aplikace Slidy ke cvičení DBI026, část 3 KSI MFF UK Verze
Databázové systémy Přednáška č. 5 Datové typy a Fyzická organizace dat.
Databázové Aplikace Slidy ke cvičení DBI026, část 2 KSI MFF UK Verze
Databázové systémy I Cvičení č. 8 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2015.
Databáze MS ACCESS 2010.
Databázové systémy přednáška 6 – Indexy
SQL – příkaz SELECT Ing. Roman Danel, Ph.D.
Roman Danel Institut ekonomiky a systémů řízení 2016
Dotazovací jazyk SQL - III
Databázové systémy a SQL
Dotazovací jazyk SQL I.
Informatika pro ekonomy přednáška 8
Příkazy cyklu (1) Umožňují vícekrát (nebo ani jednou) pro-vést určitý příkaz Jazyk C rozlišuje příkaz cyklu: s podmínkou na začátku: obecný tvar: while.
Databázové systémy a SQL
Optimalizace SQL dotazů
Databázové systémy a SQL
Počítačová cvičení z předmětu Datové sklady #1 Relační model dat
Přednáška 9 Triggery.
Cyklus for (1) Obecný tvar: for (výraz1; výraz2; výraz3) příkaz
Databázové systémy a SQL
Databázové jazyky Jaroslav Pokorný FI BVŠP Bratislava
Databázové systémy a SQL
Transkript prezentace:

Databázové Aplikace Slidy k přednášce DBI026 KSI MFF UK http://www.ms.mff.cuni.cz/~kopecky/vyuka/dbapl/ Verze 12.11.21.16.00

DBI026 -DB Aplikace - MFF UK Literatura Manuálové stránky Oracle 11g Dostupné odkudkoli http://www.oracle.com/pls/db112/portal.all_books http://www.oracle.com/pls/db112/homepage http://www.orafaq.com/ Dostupné z domény .mff.cuni.cz http://tirpitz.ms.mff.cuni.cz/intra/oracle/doc/ora1120doc/ DBI026 -DB Aplikace - MFF UK

DBI026 -DB Aplikace - MFF UK Literatura, pokrač. Manuálové stránky MS SQL Server 2008 R2 Dostupné odkudkoli http://msdn.microsoft.com/ en-us/library/bb418470%28v=sql.10%29.aspx http://msdn.microsoft.com/ en-us/library/ms166026%28v=sql.90%29.aspx http://msdn.microsoft.com/ en-US/library/ms189826%28v=sql.90%29.aspx DBI026 -DB Aplikace - MFF UK

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, http://www-db.stanford.edu/lore/pubs/lore-demo.pdf, http://www-db.stanford.edu/lore Roy Goldman, Jennifer Widom: DataGuides: Enabling Query Formulation and Optimalization in Semistructured Databases, http://www-db.stanford.edu/lore/pubs/dataguide.pdf DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

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

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

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 http://developer.mimer.com/validator/parser92/ http://developer.mimer.com/validator/parser99/ http://developer.mimer.com/validator/parser200x/ DBI026 -DB Aplikace - MFF UK

SELECT příkaz Vestavěné funkce a operátory Úvod do SQL SELECT příkaz Vestavěné funkce a operátory

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

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

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

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

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

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

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

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

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

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

Přehled software pro cvičení

DBI026 -DB Aplikace - MFF UK Oracle @ 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

DBI026 -DB Aplikace - MFF UK MS SQL @ 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

Vytváření tabulek a pohledů Integritní omezení Aktualizace dat Relační model SQL Vytváření tabulek a pohledů Integritní omezení Aktualizace dat

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

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-8859-2, … DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

Datové typy dle ANSI SQL-92 3) Datumové Konstanty se uzavírají do apostrofů v uvedeném formátu DBI026 -DB Aplikace - MFF UK

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

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

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. 4000 znaků (dop. max. 2000 znaků) DBI026 -DB Aplikace - MFF UK

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

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

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

DBI026 -DB Aplikace - MFF UK Integritní omezení DEFAULT hodnota Defaultní hodnota, pokud není uvedeno jinak Standardně je DEFAULT NULL DBI026 -DB Aplikace - MFF UK

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, EMAIL CHAR VARYING(30) CONSTRAINT Osoba_C_Email CHECK (EMAIL LIKE '_%@_%._%' ); DBI026 -DB Aplikace - MFF UK

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

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

Řá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

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

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

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

INSERT/UPDATE/DELETE Vestavěné funkce #INCLUDE dbacv_01.ppt INSERT/UPDATE/DELETE Vestavěné funkce

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í

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

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

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

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

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

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

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

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

Spojování tabulek v SELECT příkazu

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

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

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

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

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

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

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

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

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

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

Optimalizace SQL dotazů Indexy Plány provedení dotazu Ovlivnění optimalizátoru

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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í příkazu @?\rdbms\admin\utlxplan[.sql] SQL*Plus nabízí přepínač SET AUTOTRACE {OFF|ON|TRACEONLY} Oracle obsahuje příkaz EXPLAIN PLAN DBI026 -DB Aplikace - MFF UK

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

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

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

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 | | 96961 | 1893K| 270 (2)| | 1 | NESTED LOOPS | | 96961 | 1893K| 270 (2)| | 2 | INDEX RANGE SCAN | MF_CISPOLATR_SK_ATR_DO_PBCP | 12 | 216 | 3 (0)| | 3 | COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE | | | | DBI026 -DB Aplikace - MFF UK

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

DBI026 -DB Aplikace - MFF UK Query Analyzer Grafická reprezentace plánu provedení Vložení příkazu Stisk CTRL+L DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 (@variable {UNKNOWN|=constant}, …) DBI026 -DB Aplikace - MFF UK

#INCLUDE dbacv_02.ppt #INCLUDE dbacv_03.ppt Optimalizace Příklady

Přednáška č. 3 Pohledy

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

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

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

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

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

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

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

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

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

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

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

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

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

DBI026 -DB Aplikace - MFF UK Rušení pohledů Příkazem DROP VIEW jmeno_pohledu; DBI026 -DB Aplikace - MFF UK

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

DBI026 -DB Aplikace - MFF UK Datový slovník USER_VIEWS USER_TAB_COLUMNS INFORMATION_SCHEMA.VIEWS DBI026 -DB Aplikace - MFF UK

Procedurální rozšíření SQL PL/SQL vs. Transact SQL

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

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

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

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

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

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

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 IF @podil > 0 UPDATE Zlomky SET Vysledek = @podil WHERE citatel=123 DBI026 -DB Aplikace - MFF UK

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

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

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 SET @prom = výraz SQL příkaz UPDATE Emp SET Sal = Sal*1.05; DELETE FROM Emp WHERE EmpNo=1 DBI026 -DB Aplikace - MFF UK

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

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

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

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 [@jméno=výraz [, …]] Parametry se předávají podle jména DBI026 -DB Aplikace - MFF UK

DBI026 -DB Aplikace - MFF UK T-SQL procedury CREATE PROCEDURE UpdEmpSal @xEmpNo INTEGER, @xSal INTEGER, @xComm INTEGER = NULL AS UPDATE Emp SET Sal = @xSal, Comm = @xComm WHERE EmpNo=@xEmpNo; EXEC UpdEmpSal @xEmpNo = 1234, @xSal = 15500; GO EXEC UpdEmpSal 4321, 14000, 500; GO DBI026 -DB Aplikace - MFF UK

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

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

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

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 (@a*@x+@b)*@x+@c; 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

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

T-SQL funkce vracející tabulku CREATE FUNCTION jmfunc [(deklarace_parametru [, …])] RETURNS @promenna TABLE (def. tabulky) [AS] BEGIN tělo, vkládající data do pseudotabulky @promenna RETURN END [;] Použití jako pohled (tentokrát i s parametry) SELECT * FROM jmfunc([výraz [, …]]); DBI026 -DB Aplikace - MFF UK

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

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

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

DBI026 -DB Aplikace - MFF UK Řídící příkazy - FOR FOR I IN 1..10 LOOP … [EXIT WHEN podmínka] … END LOOP; FOR I IN REVERSE 10..1 LOOP … END LOOP; DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

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 @@FETCH_STATUS 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 @@FETCH_STATUS=0 BEGIN … FETCH NEXT FROM C; END; CLOSE C; DEALLOCATE C; DBI026 -DB Aplikace - MFF UK

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

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

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

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 [INTO @proměnná [, …]] Pokud kurzor není deklarovaný s klíčovým slovem SCROLL, je možné použít jen NEXT DBI026 -DB Aplikace - MFF UK

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

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

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

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

Standardní nepojmenované výjimky Vlastní pojmenování DECLARE X EXCEPTION; PRAGMA EXCEPTION_INIT(X,-54) /* ORA-00054 ~ 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

Uživatelské aplikační výjimky Generování RAISE_APPLICATION_ERROR( -20001, -- čí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

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( -20011, ’Zaměstnanec ’||xEmpNo||’ již existuje!’ ); END; / EXEC InsEmp(1234,’Novák’); DBI026 -DB Aplikace - MFF UK

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

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

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

Uživatelské aplikační výjimky Generování RAISERROR({ msg_id -- číslo výjimky, >= 50000 | msg_str -- text výjimky | @msg_var -- 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 19-25 pouze skup. sysadmin DBI026 -DB Aplikace - MFF UK

Přednáška č. 4 Zabezpečení dat Triggery, práva

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

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

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

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

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

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

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

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

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

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

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( -20001, ’Zaměstnance lze přijímat pouze na personálním oddělení’ ); END IF; END; / DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

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

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( -21001,’Plat může být zvýšen maximálně o 10%.’ ); END IF; END; DBI026 -DB Aplikace - MFF UK

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

DBI026 -DB Aplikace - MFF UK Triggery T-SQL Např. CREATE TRIGGER employee_insupd ON emp FOR INSERT, UPDATE AS DECLARE @emp_lvl tinyint, @job_id smallint SELECT @emp_lvl = i.job_lvl, @job_id = 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 (@job_id = 1) and (@emp_lvl <> 10) BEGIN RAISERROR ('Job id 1 expects the default level of 10.', 16, 1) ROLLBACK TRANSACTION END DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

DBI026 -DB Aplikace - MFF UK Datový slovník Pohledy USER_TRIGGERS USER_SOURCE Pohledy SYS.TRIGGERS SYS.TRIGGER_EVENTS DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

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

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

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

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

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

Přístup k cizím objektům Prostřednictvím tečkové notace název_schematu.název_objektu DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

Provedení operace v nezávislé transakci Např. CREATE OR REPLACE PROCEDURE p AS PRAGMA AUTONOMOUS_TRANSACTION; …; DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

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

Přednáška č. 5 Transakce

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

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

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

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

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

Víceuživatelský režim Oracle používá standardní syntaxi SAVEPOINT name; ROLLBACK [WORK] TO SAVEPOINT name; DBI026 -DB Aplikace - MFF UK

Víceuživatelský režim MS SQL používá syntaxi SAVE TRANSACTION name|:var ROLLBACK TRANSACTION name|:var DBI026 -DB Aplikace - MFF UK

Explicitní zamykání

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

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

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

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-00054. DECLARE UZAMKNUTO EXCEPTION; PRAGMA EXCEPTION_INIT(UZAMKNUTO,-54); BEGIN … EXCEPTION WHEN UZAMKNUTO THEN …; END; DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

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

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 1 .. 5 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

DBI026 -DB Aplikace - MFF UK Použití zámků v MS SQL BEGIN TRANS SELECT @dummy = COUNT(*) FROM tbl WITH ( TABLOCK, UPDLOCK, HOLDLOCK ) DBI026 -DB Aplikace - MFF UK

Množinové operace, UNION [ALL], INTERSECT, EXCEPT

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

Příkaz WITH, Rekurzivní dotazy

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

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

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

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

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

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

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

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

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

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

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

CASE výrazy

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

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

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

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

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*0.14 ELSE NULL END AS SnizDPH, CASE WHEN Sazba=2 THEN Cena*0.20 ELSE NULL END AS ZaklDPH FROM Prodej; DBI026 -DB Aplikace - MFF UK

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

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

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

Strukturované typy Pole Hnízděné tabulky Přednáška č. 6 Objektové rozšíření Strukturované typy Pole Hnízděné tabulky

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Č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

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

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

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

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

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(’+420 123456789’, ’+420 987654321’) Přístup k i-tému prvku pole tel: T_Telefony v PL/SQL tel(i) DBI026 -DB Aplikace - MFF UK

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

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

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(’+420 123456789’, ’+420 987654321’) DBI026 -DB Aplikace - MFF UK

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

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

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(’+420 123123123’); SELECT z.Jmeno, t.* FROM Zam z, TABLE(z.Tel) t; DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

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

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

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

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

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

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

Fulltextové vyhledávání Filtrace, Disambiguace, Lemmatizace, Indexy, Tezaury, Dotazování

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

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

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

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

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

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

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

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

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

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

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, http://www.scienceworld.cz/sw.nsf/lingvistika 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

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, http://www.scienceworld.cz/sw.nsf/lingvistika 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 20-50 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

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

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

Obvyklý postup předzpracování Filtrace Lemmatizace Desambiguace Seznam lemmat Tezaurus Stoplist Lemm. text Invertovaný seznam Indexace Invertovaný seznam DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

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

Struktura MS SQL full-text DBI026 -DB Aplikace - MFF UK

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

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

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

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

Struktura Oracle full-text DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ROLLUP a CUBE operátory Přednáška č. 7 Agregace dat ROLLUP a CUBE operátory

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

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

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

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

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

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 12500 Praha Praha Karlín Dvořák 14700 Praha Praha Karlín 27200 Praha Praha Smíchov Malá 16100 Praha Praha Smíchov 16100 Praha Praha 43300 … DBI026 -DB Aplikace - MFF UK

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

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

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

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 157000 Praha Potraviny 234000 Kladno Elektro 131000 Liberec Potraviny 98700 Praha 391000 Elektro 288000 … 620700 DBI026 -DB Aplikace - MFF UK

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

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

Využití XML v DB aplikacích

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

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

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

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

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

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

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

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

Adresování dat v XML - XPath preceding:: following:: DBI026 -DB Aplikace - MFF UK

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

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

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

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

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

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

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

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

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

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

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

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

DBI026 -DB Aplikace - MFF UK Indexace XML dat Lore Index /knihy//autor[@stat=”CZ”] 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 //http://localhost/xml?SELECT * FROM KNIHY FOR XML AUTO&root=knihy DBI026 -DB Aplikace - MFF UK

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

Přístup ke vzdáleným XML zdrojům HttpUriType Konstruktor HttpUriType(url) Metody GetCLOB() GetBLOB() GetXML() DBI026 -DB Aplikace - MFF UK

National Language Support Oracle NLS National Language Support Oracle

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

DBI026 -DB Aplikace - MFF UK Oracle @ 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