Ing. Tomáš Váňa, Ing. Jiří Zechmeister Databázové systémy II Přednáška VI Ing. Tomáš Váňa, Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky tomas.vana@upce.cz, jiri.zechmeister@upce.cz
Obsah přednášky Kolekce Záznamy Hromadné zpracování Asociativní pole Varray (Variable-size arreays) Vnořená tabulka (Nested Table) Záznamy Hromadné zpracování IDAS2 - Přednáška V
Kolekce a záznamy Složené datové typy (composite data types). Kolekce (collection) Interní komponenty mají shodný datový typ a nazývají se elementy. Každý element je přístupný přes unikátní index: nazev_kolekce(index). Záznamy Interní komponenty mohou mít rozdílné datové typy a nazývají se pole (fields). Přístup k jednotlivými polím se ralizuje syntaxí: nazev_promenne.nazev_pole. Lze vytvořit kolekcí záznamů a lze také vytvořit záznam, který bude obsahovat kolekci. IDAS2 - Přednáška V
Kolekce - asociativní pole Množina párů klíč-hodnota (key-value pairs). Každý klíč je unikátní hodnota sloužící pro nalezení přidružené hodnoty. Klič může být následujících datových typů: VARCHAR2 PLS_INTEGER Klíče jsou do pole ukládaný v utříděném pořadí (dle hodnoty klíče) Nikoliv podle pořadí vložení Stejně jako tabulky mohou existovat prázdná asociativní pole a mohou obsahovat předem nespecifikované množství elementů, ke kterým lze přistupovat bez znalosti jejich přesné pozice. Na rozdíl od tabulek s nimi nelze manipulovat pomocí příkazů DML. IDAS2 - Přednáška V
IDAS2 - Přednáška V
Kolekce - asociativní pole Využití: Pro relativně malé vyhledávací tabulky, jež mohou být zkonstruovány v operační paměti pokaždé, když je subprogram zavolán nebo když je balíček inicializován. Předávání kolekcí z/do databázového systému. Asociativní pole není možné definovat na úrovni schématu. Pro využití asociativního pole jako parametru subprogramu je ale možné definovat typ asociativního pole ve specifikaci balíčku. Asociativní pole je primárně zamyšleno pro ukládání temporárních dat. Pro perzistentní uložení asoc. pole je nutné využít balíčku. IDAS2 - Přednáška V
Kolekce - Varray Varray (Variable-Size Array) Počet elementů v poli se může variovat od 0 do deklarovaného maxima. Pro přístup k jednotlivým prvkům pole se využívá číselného klíče (indexu). Spodní hranice indexu je 1. Horní hranice je rovna aktuálnímu počtu prvků v poli. Proměnná typu varray musí být vždy inicializována. Neinicializovaná proměnná typu vnořená tabulka je nedefinovanou kolekcí (null collection) -> před prvním použití musí proběhnout inicializace. IDAS2 - Přednáška V
IDAS2 - Přednáška V
Kolekce - Varray Využití: Počet ukládaných elementů je znám dopředu. K elementům se obvykle přistupuje sekvenčně. Všechny elementy musí být vloženy nebo získány najednou. Nepraktické pro velká pole. Lze deklarovat i na úrovni schématu IDAS2 - Přednáška V
Kolekce - Nested Table Nested table (Vnořená tabulka) V databáze je vnořená tabulka datový typ, který umožňuje uložit nespecifikované množství neutříděných řádků. V PL/SQL je možné k řádkům vnořené tabulky přistupovat přes číselné indexy (PL/SQL automaticky „očísluje“ řádky vnořené tabulky). Indexy a pořadí řádku vnořené tabulky není mezi jednotlivými načteními stabilní. Neinicializovaná proměnná typu vnořená tabulka je nedefinovanou kolekcí (null collection) -> před prvním použití musí proběhnout inicializace. IDAS2 - Přednáška V
IDAS2 - Přednáška V
Kolekce - Nested Table Lze definovat i na úrovni schématu Takto definovaný typ lze již deklarovat v hlavičce PL/SQL subprogramu. IDAS2 - Přednáška V
Varrays vs. Nested Tables Varray má deklarovaný maximální počet elementů, nested table nikoliv. Nested table roste dynamicky. Varray pole je vždy husté (dense). Nested table je inicializováno jako husté pole, ale časem se stává polem řídkým (sparse). Z nested table lze elementy mazat. IDAS2 - Přednáška V
Kolekce - Nested Table Využití nested table: Horní limit počtu elementů není znám. Hodnoty indexu na sebe nenavazují. Aktualizace či mazání se dotýká jen malého počtu elementů -> tzn. nejsou mazány či modifikovány všechny elementy pole. IDAS2 - Přednáška V
Kolekce - metody IDAS2 - Přednáška V
Kolekce - metody DELETE Pokud pracujeme s asociativním polem, které má index typu řetězec, pak přijímá metoda DELETE parametry typu VARCHAR2. IDAS2 - Přednáška V
Kolekce - metody EXISTS Testuje, zdali specifikovaný element v poli existuje. IDAS2 - Přednáška V
Kolekce - metody PRIOR a NEXT PRIOR vrátí index předcházejícího existujícího elementu kolekce, pokud existuje. Jinak vrací NULL. NEXT vrátí index následujícího existujícího elementu kolekce, pokud existuje. Jinak vrací NULL IDAS2 - Přednáška V
Nested table vs. asociativní pole Nested table může být uložena v rámci sloupce databázové tabulky, asociativní pole nikoliv. Asociativní pole se hodí spíše pro malé „lookup tables“, kdy celá kolekce může být konstruována v paměti. Asociativní pole je výhodné ve chvíli, kdy je počet prvků předem neznámý. Indexy asociativního pole jsou více flexibilní - mohou být nesekvenční a jejich indexy mohou být tvořeny řetězci. IDAS2 - Přednáška V
Varray vs. nested table Varray je dobrou volbou ve chvíli, kdy je počet uložených prvků znám dopředu. Při manipulaci s varray musíme pracovat se všemi prvky najednou. Nested table může být řídká. Můžete odebrat libovolný element. IDAS2 - Přednáška V
Record - záznam Záznam (RECORD) je složená proměnná (composite variables), která může obsahovat hodnoty různých datových typů. Jistá podobnost se struct z C/C++ V PL/SQL se využívají pro uchovávání řádků z tabulek. Záznam se umí přispůsobit struktuře tabulky či výstupu dotazu. IDAS2 - Přednáška V
Record - záznam Záznam nelze definovat na úrovni schématu. Standardně jej lze definovat uvnitř PL/SQL bloku. Lze jej též definovat na úrovní balíčku. Proměnou typu záznam není nutné explicitně inicializovat. Výchozí hodnota polí je NULL. IDAS2 - Přednáška V
Record - záznam IDAS2 - Přednáška V
Record - atribut %ROWTYPE %ROWTYPE atribut umožňuje definovat záznam, jehož struktura odpovídá struktuře tabulky či výstupu dotazu. Pole v záznamu pak získá název a datový typ sloupce, od kterého je odvozován. IDAS2 - Přednáška V
Record -atribut %ROWTYPE Typické využití s explicitními kurzory: IDAS2 - Přednáška V
Hromadné zpracování IDAS2 - Přednáška V
Hromadné zpracování PL/SQL umožňuje procedurálně zpracovávat data buď: po jednotlivých řádcích, najednou po skupinách (sadách) řádků. Hromadné zpracování - kompromis mezi jednoduchostí programování a výkonem. Zpracovávání po řádcích je obecně z hlediska programování jednoduší, ale výsledný kód bude pomalejší než kód, který využívá operací hromadného zpracování. Hromadné zpracovávání je vhodné využívat tehdy, když má dramatické účinky. IDAS2 - Přednáška V
Hromadné zpracování Doba běhu PL/SQL bloku: 18.646 s IDAS2 - Přednáška V
Hromadné zpracování Doba běhu PL/SQL bloku: 1.749 s Předefinované typy vnořených tabulek pro čísla, řetězce a data. Naplnění všech vnořených tabulek v rámci jednoho volání dotazu. Doba běhu PL/SQL bloku: 1.749 s IDAS2 - Přednáška V
BULK COLLECT INTO BULK COLLECT minimalizuje režii spojenou s komunikací mezi PL/SQL a SQL. Klauzule BULK COLLECT se může objevit v: SELECT INTO FECTH RETURNING INTO klauzuli příkazů: DELETE INSERT UPDATE EXECUTE IMMEDIATE IDAS2 - Přednáška V
Vnořená tabulka definovaná dle kurzoru. BULK COLLECT - FETCH Vnořená tabulka definovaná dle kurzoru. Načtení všech řádků dotazu do vnořené tabulky v rámci jediného FETCH příkazu IDAS2 - Přednáška V
BULK COLLCET - FETCH,LIMIT Najednou se bude vždy zpracovávat max. 10 záznamů. IDAS2 - Přednáška V
FORALL Operátor FORALL spouští sérii statických nebo dynamických DML příkazů. Nahrazuje FOR cykly. Operátor FORALL využívá bulk binding (hromadné svazování) -> databázi je možné předat celou kolekci dat prostřednictvím jediného příkazu. IDAS2 - Přednáška V
FORALL - příklady Načtení velkého množství řádků (cca. 60000) pomocí implicitního kurzoru. Následně jsou ve smyčce po jednom jednotlivé řádky vkládány do nové tabulky. Doba průběhu PL/SQL bloku: 20.973 s IDAS2 - Přednáška V
Nutné definovat vnořenou tabulku (včetně typu) FORALL - příklady Nutné definovat vnořenou tabulku (včetně typu) Stejné vstupní podmínky a stejný cíl jako předcházející příklad. Tentokrát je místo implicitního kurzoru využito příkazu BULK COLLECT INTO. Vkládání je realizováno pomocí operátoru FORALL. Doba průběhu PL/SQL bloku: 10.972 s IDAS2 - Přednáška V