Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
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
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.