Ing. Tomáš Váňa, Ing. Jiří Zechmeister

Slides:



Advertisements
Podobné prezentace
Databázové systémy 2 Cvičení č. 8
Advertisements

Zpracování SQL Lubomír Andrle 5. přednáška
Aplikační a programové vybavení
LOV, Listbox, Poplist a Combobox v Oracle Forms LOV – seznam hodnot, které se zobrazí po stisku klávesy Enter v textovém poli. LOV – seznam hodnot, které.
Fakulta elektrotechniky a informatiky
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
Fakulta elektrotechniky a informatiky
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í č. 4 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
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 2 Cvičení č. 6 Ing. Tomáš Váňa Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy 1 Cvičení č. 3 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy II Přednáška č. 5 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Radek Špinka Přepínače MSSQL výběr.
PL/SQL Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd. Rozšířením jazyka SQL.
Databázové systémy II Přednáška č. 8 – Pohledy (Views)
Databázové systémy 2 Cvičení č. 7 Ing. Tomáš Váňa Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy II Přednáška č. 4, 5 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Školení správců II. Petr Pinkas RNDr. Vít Ochozka.
Databázové systémy 2 Cvičení V Ing. Tomáš Váňa Fakulta elektrotechniky a informatiky
Sémantická analýza Jakub Yaghob
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.
Databázové systémy I Cvičení č. 6 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
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
Ing. Tomáš Váňa, Ing. Jiří Zechmeister
Fakulta elektrotechniky a informatiky
Fakulta elektrotechniky a informatiky
Databázové systémy 2 Zkouška – 08:00. Příklad I – Funkce – 4 body Vytvořte funkci F_ZK1(p_id_zamestnance NUMBER) RETURN VARCHAR2. Daná funkce.
Architektury a techniky DS Efektivní programování v jazyce PL/SQL
Databázové systémy II Přednáška V Ing. Tomáš Váňa, Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky
C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
Databázové systémy I Cvičení č. 8 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Architektury a techniky DS Cvičení č. 9 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Databázové systémy 2 Zkouška – 08:00. Příklad I – Procedura – 5 bodů Vytvořte proceduru P_ZK3(p_oddeleni_id_from NUMBER, p_oddeleni_id_to NUMBER,
Databázové systémy II Přednáška č. 9. Transakce je logická jednotka práce sestávající z jednoho nebo více SQL příkazů, které jsou atomické z hlediska.
Databázové systémy II Cvičení č. 3 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Databázové systémy I Cvičení č. 10 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
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.
Databázové systémy 2 Zkouška – 8:00. Příklad I – Procedura – 5 bodů Vytvořte proceduru P_ZK2(p_table_name VARCHAR2, p_min_nuls NUMBER, p_drop.
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 2 Cvičení č. 5 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy SQL Výběr dat.
Problémy s češtinou České znaky se standardně nepovažují za alfanumerické znaky (\w) Vadí to při třídění vyhodnocování regulárních výrazů Je třeba použít.
Databázové systémy 2 Zkouška – 8:00. Příklad I - Procedura Vytvořte proceduru PROCEDURE ZK_ZAM_HISTOGRAM(P_ROK_OD IN NUMBER, P_ROK_DO IN NUMBER)
Databázové systémy 2 Cvičení IV Ing. Tomáš Váňa Fakulta elektrotechniky a informatiky
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é systémy 2 Zkouška – 12:00. Příklad I - Funkce Vytvořte funkci ZK_IS_COLUMN_FK(P_TABLE_NAME IN VARCHAR2, P_COLUMN_NAME IN VARCHAR2)
JUI přednáška Vstup a výstup, cykly RNDr. Jiří Dvořák, CSc.
Vnořené SQL (embedded SQL) Dotazovací jazyky I
Databázové systémy 2 Zkouška – 8:00. Příklad I - Funkce Vytvořte funkci ZK_DIFF_MIN_MAX (P_ZAM_ID NUMBER) RETURN VARCHAR2. Funkce může vracet.
Soubory BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
SQL Další dotazy a pohledy Databázové systémy. Některé SQL příkazy mohou mít v sobě obsaženy další kompletní příkazy SELECT. Využijeme je tam, kde potřebujeme.
Zanořené SQL a dynamické SQL
Architektury a techniky DS Cvičení č. 6 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Dynamické SQL (dynamic SQL)‏ Dotazovací jazyky Šárka Hlušičková.
Databázové systémy I Cvičení č. 8 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2015.
Roman Danel Institut ekonomiky a systémů řízení 2016
Úvod do Pythonu – IO operace se soubory.
ZAL – 3. cvičení 2016.
Databázové systémy a SQL
Optimalizace SQL dotazů
Databázové systémy a SQL
Přednáška 9 Triggery.
Databázové systémy a SQL
Transkript prezentace:

Ing. Tomáš Váňa, Ing. Jiří Zechmeister Databázové systémy II Přednáška č. VIII Ing. Tomáš Váňa, Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky tomas.vana@upce.cz, jiri.zechmeister@upce.cz

Obsah Dynamické SQL Nativní dynamické dotazy Balíček DBMS_SQL IDAS2 - Přednáška VIII

Dynamické SQL Metoda, jak generovat a spouštět dotazy za běhu aplikace. Dotaz tedy není nutné znát ve chvíli. Dynamické SQL umožňuje uvnitř bloků PL/SQL provádět příkazy, jenž jsou v případě statického SQL. PL/SQL - dva přístupy k dynamickým dotazům. Nativní dynamické dotazy - jsou jednoduché a rychlé. Balíček DBMS_SQL - komplikovanější a pomalejší, nicméně nabízí vyšší flexibilitu při psaní dynamických dotazů. IDAS2 - Přednáška VIII

Dynamické SQL Kdy využijeme dynamické SQL? Přesný text příkazu v době kompilace ještě neznáme. Například neznáme ještě přesný počet klauzuli uvnitř WHERE či nemáme k dispozici seznam sloupců, podle kterých se bude výstup dotazu řadit. Statický příkaz není v PL/SQL bloku podporován. Například DDL příkazy. Reference na databázové objekty, který v době kompilace ještě neexistují. Pokud výhody dynamického SQL nevyužijeme, je lepší využít statického SQL, protože: Úspěšná kompilace ověří, že se jedná o platný příkaz SQL, který se odkazuje na validní databázové objekty, k nimž má právo přistupovat. Úspěšná kompilace vytvoří tzv. řetězec závislostí. Dají se lépe „vyladit“ na optimální výkon. IDAS2 - Přednáška VIII

Nativní Dynamické SQL Native Dynamic SQL Nejčastěji se dynamické dotazy využivají ve spojení s příkazem EXECUTE IMMEDIATE. Pokud je dynamickým SQL příkaz typu SELECT, který navíc vrací více řádku, je nutné využít jednu z následujících možností: EXECUTE IMMEDEATE s BULK COLLECT INTO klauzulí. OPEN FOR, FETCH, CLOSE IDAS2 - Přednáška VIII

EXECUTE IMMEDIATE Provedení DDL uvnitř bloku PL/SQL Definice SQL dotazu uvnitř VARCHAR proměnné Provedení příkazu a uložení výsledku do proměnné. IDAS2 - Přednáška VIII

EXECUTE IMMEDIATE Příkaz sloužící k vykonání většiny dynamických příkazů jazyka SQL. Pokud je dynamický SQL příkaz „soběstačný“ (všechny proměnné dotazu jsou vyplněny, příkaz nevrací data), stačí použít jen EXECUTE IMMEDEATE. Pokud dotaz vrací nějaké výsledky, využijeme klauzuli INTO a seznam proměnných, do kterých bude výsledek uložen. Pokud textový dotaz obsahuje zástupné symboly (placeholders) pro umístění proměnných, je nutné použít klauzuli USING (viz dále). IDAS2 - Přednáška VIII

Bind proměnné Výhody bind proměnných: :x,:y reprezentují bind proměnné (vázanou proměnnou). Název bind proměnné je nedůležitý, důležitá je pouze : (dvojtečka) Ve chvíli spuštění dynamického SQL jsou za bind proměnné dosazeny skutečné hodnoty z proměnných definovaných v klauzuli USING. Dosazení probíhá dle pořadí proměnných. Výhody bind proměnných: Přehlednější zápis (žádné zřetězování či escapování) Vyšší výkon Bezpečnější (prevence před SQL Injection) IDAS2 - Přednáška VIII

Bind proměnné Klauzule USING: Nelze zde specifikovat hodnotu NULL jako literál. Workaround: Neinicializovaná proměnná. U jednotlivých proměnných lze definovat to zdali je proměnná IN (Výchozí), OUT nebo IN OUT Užitečné ve chvíli volaní procedur s OUT a IN OUT parametry. Nutné je „provázat“ všechny proměnné v dotazu. Počet vázaných proměnných = počet proměnných v klauzuli USING. Jinak: ORA-01006: vázaná proměnná neexistuje, nebo ORA-01008: všechny proměnné nejsou vázány Pozor na stejné názvy vázaných proměnných. Viz: http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/dynamic.htm#autoId4 IDAS2 - Přednáška VIII

OPEN FOR, FETCH a CLOSE Pokud dynamický dotaz reprezentuje příkaz SELECT, kromě BULL COLLECT ho můžeme zpracovat obdobně jako při využití explicitního kurzoru. Můžeme ho zpracovat po jednotlivých řádcích. Definice typu kurzor, definice záznamu pro jednotlivé řádky. Otevření kurzoru pro dynamická dotaz a nastavení vázané proměnné. Dále lze pracovat s kurzorem naprosto totožně, jako s klasickým statickým explicitním kurzorem. IDAS2 - Přednáška VIII

USING - IN & OUT bind IDAS2 - Přednáška VIII

Balíček DBMS_SQL Balíček DBMS_SQL poskytuje rozhraní pro využívaní dynamického SQL. Objevili se již ve verzi Oracle 7. Původní způsob spouštění dynamického SQL. Ve většině případů je výhodnější použít nativní dynamické SQL (je jednouší a výkonnější), nicméně, nativní dynamické SQL má následující omezení: Počet vstupů (bind proměnných) a výstupů (výstupních sloupců) musí být předem znám. DBMS_SQL navíc přidává řadu procedur a funkci rozšiřující možnosti využití dynamického SQL. IDAS2 - Přednáška VIII

Balíček DMBS_SQL Nutná explicitně přidělená oprávnění. Oprávnění EXECUTE pro balík DBMS_SQL. Bezpečnostní problém balíčku DBMS_SQL. Některá privilegia musíte přidělit přímo, a nikoliv pomocí rolí. IDAS2 - Přednáška VIII

DBMS_SQL - zpracovaní dynamického SQL OPEN_CURSOR PARSE BIND_VARIABLE nebo BIND_ARRAY DEFINE_COLUMN/DEFINE_ARRAY EXECUTE FETCH_ROWS nebo EXECUTE_AND_FETCH VARIABLE_VALUE nebo COLUMN_VALUE CLOSE_CURSOR IDAS2 - Přednáška VIII

DBMS_SQL - OPEN_CURSOR Funkce vracející ID, které reprezentuje daný kurzor v rámci databázového systému Oracle. Je nutné zavolat vždy před zpracování konkrétního SQL příkazu. Tento kurzor se liší od klasických kurzoru -> není možné je přímo mezi sebou zaměňovat. IDAS2 - Přednáška VIII

DBMS_SQL - PARSE PARSE Každý příkaz je nutno analyzovat. Funkce PARSE provede analýzu dotazu z pohledu syntaxe a asociuje příkaz z ID kurzoru. Můžete analyzovat jak DML tak DDL. DDL je okamžitě i zpracováno -> implicitní commit. Umožňuje spustit dotaz tak, aby se choval jako ve verzích 6 a 7. Standardně se ale nastavuje na DBMS_SQL.native (chovaní aktuální verze). IDAS2 - Přednáška VIII

DBMS_SQL - BIND_VARIABLE BIND_VARIABLE, BIND_ARRAY Před samotným spuštěním dotazu je nutné nahradit všechny zástupné symboly v dotazu (:x,:y). DBMS_SQL může spustit DML příkaz i vícekrát na jednou - pokaždé s jinou hodnotou bind proměnné. BIND_ARRAY procedura umožní přiřadit ke každé bind proměnné kolekci skalárních hodnot, kdy každá jednotlivá hodnota kolekce bude použita pro jednotlivé běhy příkazu. IDAS2 - Přednáška VIII

DBMS_SQL - BIND_VARIABLE IDAS2 - Přednáška VIII

DBMS_SQL - DEFINE_COLUMN DEFINE_COLUMN, DEFINE_ARRAY Každý sloupec příkazu SELECT je identifikován relativní pozicí, tak jak se objeví v SELECT příkazu. V případě SELECT příkazu je tak nutné specifikovat proměnné, do kterých bude uložen výstup jednotlivých sloupců (obdoba INTO). V případě, že chceme načíst najednou více řádků, použije se DEFINE_ARRAY. IDAS2 - Přednáška VIII

DBMS_SQL - DEFINE_COLUMN IDAS2 - Přednáška VIII

DBMS_SQL - EXECUTE EXECUTE Spustí daný příkaz SQL reprezentovaný ID kurzoru. Funkce vrací celé číslo, které reprezentuje počet zpracovaných řádku. V případě SELECT příkazu můžeme ignorovat. IDAS2 - Přednáška VIII

DBMS_SQL - FETCH_ROWS FETCH_ROWS Funkce vrátí řádky, jenž vyhověly zadanému dotazu. Každé úspěšné načtení vrátí novou sadu dat reprezentující jeden řádek. FETCH končí ve chvíli, kdy již neexistují další řádky. Funkce vrací celé číslo, které reprezentuje počet již zpracovaných řádků. Pokud je vrácena 0, neexistují žádné další řádky ke zpracování. IDAS2 - Přednáška VIII

DBMS_SQL - EXECUTE_AND_FETCH Funguje stejně jako kombinace EXECUTE a FETCH_ROWS. Redukce síťového provozu. V případě nastavení parametru exact na true, vyvolá příkaz výjimku v případě, že počet vrácených řádku je větší než jedna. IDAS2 - Přednáška VIII

DBMS_SQL - COLUMN_VALUE Vrátí hodnotu ve specifikovaném kurzoru na specifikované pozici. Pro zpřístupnění řádku (následujícího) se používá funkce FETCH_ROWS. IDAS2 - Přednáška VIII

DBMS_SQL - COLUMN_VALUE IDAS2 - Přednáška VIII

DBMS_SQL - VARIABLE_VALUE Vrátí hodnotu pojmenované proměnné z kurzoru. Využívá se k získání hodnot bind proměnných uvnitř bloku PL/SQL nebo DML příkazů s klauzulí RETURNING. IDAS2 - Přednáška VIII

DBMS_SQL - CLOSE_CURSOR Uzavře specifikovaný kurzor. IDAS2 - Přednáška VIII

DBMS_SQL Motivační příklady: http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_sql.htm#i996963 IDAS2 - Přednáška VIII

DBMS_SQL - užitečné funkce DESCRIBE_COLUMNS Umožňuje detailně popsat jednotlivé sloupce dynamického SELECT dotazu. c .. ID kurzoru col_cnt .. počet sloupců v SELECTu desc_t .. vnořená tabulka typu DBMS_SQL.desc_tab IDAS2 - Přednáška VIII

DBMS_SQL - užitečné funkce TYP DBMS_SQL.desc_tab IDAS2 - Přednáška VIII

DBMS_SQL - užitečné funkce DESCRIBE_COLUMNS - použití IDAS2 - Přednáška VIII

DBMS_SQL - užitečné funkce DBMS_SQL.IS_OPEN Funkce testuje, zdali je kurzor otevřen. IDAS2 - Přednáška VIII

REF CURSOR „Kurzorová proměnná“, kterou lze předat jako parametr funkce či procedury. Na REF CURSORY nelze pohlížet jak na kolekce s daty. Jakmile je REF CURSOR otevřen, lze si o představit jako ukazatel na otevřený dotaz, ze kterého lze získat data. Dva typy: Slabě typový REF CUROSR - předefinovaný typ sys_refcurosr. Silně typový REF CUROSR - daný kurzor může vracet jen přesně definovaný typ (omezení vlivu run-time chyb) IDAS2 - Přednáška VIII

REF CURSOR IDAS2 - Přednáška VIII

DBMS_SQL.TO_CURSOR_NUMBER Převede REF CURSOR na číslo (kurzor ID), se kterým pak lze pracovat v balíčku DBMS_SQL. REF CURSOR by měl být otevřen, před zavoláním funkce. Po převodu není REF CURSOR přístupný „klasickou“ cestou. IDAS2 - Přednáška VIII

DBMS_SQL.TO_REFCURSOR Funkce přijímá otevřený (OPEN), analyzovaný (PARSE) a vykonaný (EXECUTE) kurzor a převádí jej na REF CURSOR. Jakmile je kurzor převeden, již nelze využívat funkcí a procedur balíčku DBMS_SQL. IDAS2 - Přednáška VIII

REF CURSOR a DBMS_SQL Cursor Motivace k převodu REF CURSOR na DBMS_SQL cursor: Získaní metadat dotazu (DESCRIBE_COLUMNS). Procházení výstupu dotazu bez nutnosti definovat přesný typ pro uložení výsledků. IDAS2 - Přednáška VIII