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

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

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

Podobné prezentace


Prezentace na téma: "Ing. Tomáš Váňa, Ing. Jiří Zechmeister"— Transkript prezentace:

1 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

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

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é 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

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

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

15 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

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

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
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
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
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
Uzavře specifikovaný kurzor. IDAS2 - Přednáška VIII

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

29 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

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 "Ing. Tomáš Váňa, Ing. Jiří Zechmeister"

Podobné prezentace


Reklamy Google