Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Databázové systémy II Přednáška č. VIII Ing. Tomáš Váňa, Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky

Podobné prezentace


Prezentace na téma: "Databázové systémy II Přednáška č. VIII Ing. Tomáš Váňa, Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky"— Transkript prezentace:

1 Databázové systémy II Přednáška č. VIII Ing. Tomáš Váňa, Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky

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

3 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

4 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

5 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

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

7 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

8 Bind proměnné :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

9 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: IDAS2 - Přednáška VIII

10 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. IDAS2 - Přednáška VIII 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.

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

12 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

13 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

14 DBMS_SQL - zpracovaní dynamického SQL 1.OPEN_CURSOR 2.PARSE 3.BIND_VARIABLE nebo BIND_ARRAY 4.DEFINE_COLUMN/DEFINE_ARRAY 5.EXECUTE 6.FETCH_ROWS nebo EXECUTE_AND_FETCH 7.VARIABLE_VALUE nebo COLUMN_VALUE 8.CLOSE_CURSOR IDAS2 - Přednáška VIII

15 DBMS_SQL - OPEN_CURSOR 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

16 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. IDAS2 - Přednáška VIII 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).

17 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

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

19 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

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

21 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

22 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

23 DBMS_SQL - EXECUTE_AND_FETCH 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

24 DBMS_SQL - COLUMN_VALUE 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

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

26 DBMS_SQL - VARIABLE_VALUE 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

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

28 DBMS_SQL Motivační příklady: – #i #i IDAS2 - Přednáška VIII

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

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

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

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

33 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

34 REF CURSOR IDAS2 - Přednáška VIII

35 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

36 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

37 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


Stáhnout ppt "Databázové systémy II Přednáška č. VIII Ing. Tomáš Váňa, Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky"

Podobné prezentace


Reklamy Google