Dynamické SQL (dynamic SQL)‏ Dotazovací jazyky Šárka Hlušičková.

Slides:



Advertisements
Podobné prezentace
ŘÍDÍCÍ STRUKTURY - PODMÍNKY
Advertisements

Počítače a programování 1 Přednáška 13 Jiří Šebesta.
Základy jazyka SQL Jan Tichava
Zpracování SQL Lubomír Andrle 5. přednáška
SQL: DDL v ORACLE CREATE TABLE jméno_tabulky (atribut datový_typ [DEFAULT][attribut_constraint] [, atribut datový_typ [DEFAULT] [attribut_constraint]],...
Aplikační a programové vybavení
Jazyk SQL Ing. Zdena DOBEŠOVÁ. SQL Structured Query Language 1974 SEQUEL (Structured English Query Language) neprocedurální relační dotazovací jazyk norma.
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é.
 Informací se data a vztahy mezi nimi stávají vhodnou interpretací pro uživatele, která odhaluje uspořádání, vztahy, tendence a trendy  Existuje celá.
Fakulta elektrotechniky a informatiky
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Informační systémy Realizace uložených procedur a spouští, jejich praktické využití.
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
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í č. 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 II Přednáška č. 5 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
1 BUMI Úvod do medicínské informatiky Počítačové cvičení č. 3 Ing. Vratislav Čmiel.
PROGRAMOVACÍ JAZYKY (c) Tralvex Yeap. All Rights Reserved.
Temporální databáze a TSQL
SQL Lukáš Masopust Historie  Předchůdcem databází byly papírové kartotéky  děrný štítek  1959 konference  1960 – vytvořen jazyk COBOL.
SQL Lukáš Masopust Historie  Předchůdcem databází byly papírové kartotéky  děrný štítek  1959 konference  1960 – vytvořen jazyk COBOL.
Materiály k přednášce Úvod do programování Ondřej Čepek.
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.
MySQL - Vytvoření nové tabulky  create table jméno_tabulky (jméno_položky typ_položky,... ) Přehled nejběžnějších datových typů Přehled nejběžnějších.
Caché Security. Jak vypadá zabezpečení dnes Jak bude vypadat a co by Caché měla umět v budoucnu Včera, dnes a zítra.
Databáze Úvod.
Databázové systémy II Přednáška č. 8 – Pohledy (Views)
Školení správců II. Petr Pinkas RNDr. Vít Ochozka.
Procedurální rozšíření Transact SQL Michal Kopecký Výběr ze slajdů k 3. přednášce předmětu Databázové Aplikace (DBI026) na MFF UK.
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.
Informatika pro ekonomy II přednáška 10
Databázové systémy I Cvičení č. 6 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Databázové systémy Přednáška č. 6.
SQL PVA Jan Hora. SQL „graficky“ Grafický vs. pravý SQL SELECT ORDED BY WHERE.
Databázové systémy 2 Cvičení č. 6 Ing. Tomáš Váňa Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Ing. Tomáš Váňa, Ing. Jiří Zechmeister
Ing. Tomáš Váňa, Ing. Jiří Zechmeister
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
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 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 I Cvičení č. 10 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Databázové systémy I Cvičení č. 7 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
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í
Obchodní akademie, Ostrava-Poruba, příspěvková organizace Vzdělávací materiál/DUM VY_32_INOVACE_01B13 Autor Ing. Jiří Kalousek Období vytvoření březen.
Databázové systémy 2 Cvičení č. 5 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Základní obeznámení s jazykem SQL Databázové systémy.
Databázové systémy SQL Výběr dat.
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
Vnořené SQL (embedded SQL) Dotazovací jazyky I
Administrace Oracle Paralelní zpracování.
Zanořené SQL a dynamické SQL
Databázové systémy I Cvičení č. 8 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2015.
Perzistence XML dat Kamil Toman
Roman Danel Institut ekonomiky a systémů řízení 2016
Databázové systémy I Přednáška 11 Databázové systémy 1 – KIT/IDAS1
Vzorové řešení zápočtového testu
Informatika pro ekonomy přednáška 8
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:

Dynamické SQL (dynamic SQL)‏ Dotazovací jazyky Šárka Hlušičková

Zdrojové materiály: [1] Pro*C/C++ Precompiler Programmer's Guide. Release 9.2. Oracle Corporation, c1994-2002. Kapitola 13, Oracle Dynamic SQL. Dostupné na: <http://download.oracle.com/docs/cd/B10501_01/appdev.920/a97269/pc_13dyn.htm>. [2] -. Kapitola 15, Oracle Dynamic SQL: Method 4. Dostupné na: http://download.oracle.com/docs/cd/B10501_01/appdev.920/a97269/pc_15ody.htm#5167 [3] DATE, C. J.; WHITE, Colin J. A Guide to DB2. Chapter 15, Application Programming III: Dynamic SQL, s. 267-275. [4] ODBC in Webopedia. Dostupné na: <http://www.webopedia.com/TERM/O/ODBC.html>.

Úvod Dynamické SQL je programovací technika, která umožňuje za běhu aplikace vytvářet a vyhodnocovat SQL příkazy. Typické použití: Pokud v době, kdy je program kompilován, nejsou známy některé z následujících položek SQL příkazu použité příkazy a klauzule počet hostitelských proměnných datové typy hostitelských proměnných názvy databázových objektů jako jsou sloupce, indexy, sekvence, tabulky, uživatelská jména a pohledy

Výhody univerzálnější programy dynamické sestavení SQL na základě vstupu od uživatele nebo vstupního souboru Nevýhody větší časové nároky na zpracování složitější kód aplikace Poznámka: příklady uvedené v následujících sekcích jsou převzaty z [1] a [2], tj. je použit Oracle a jazyk C.

Zpracování dynamického SQL Po zpracování se vrací pouze návratová hodnota s informací o průběhu příkazu (SQLCA): převedení znakového řetězce reprezentující SQL příkaz na SQL příkaz, včetně kontroly syntaxe EXEC SQL PREPARE příkaz FROM řetězec ; vyhodnocení příkazu EXEC SQL EXECUTE příkaz [ USING argument(y) ]; Po zpracování příkazu se vrací navíc data: nutná alokace místa pro data před vyhodnocením příkazu

Příkazy povolené pro PREPARE UPDATE (včetně CURRENT)‏, DELETE (včetně CURRENT), INSERT, SELECT (bez INTO)‏ CREATE, DROP, ALTER COMMENT, LABEL GRANT, REVOKE COMMIT, ROLLBACK, LOCK

4 metody použití dynamického SQL seřazeny vzestupně dle obecnosti (flexibility) a programovací náročnosti převzato z příkladů pro Oracle, na jiných SŘBD nemusí být úplně stejné

1.metoda Omezení: příkazy nesmějí být typu SELECT a nesmí obsahovat místo pro vstupní hostitelské proměnné 'DELETE FROM zaměstnanci WHERE id_oddeleni = 20' Příkaz: EXEC SQL EXECUTE IMMEDIATE { :řetězcová_proměnná | řetězcový_literál }; Příkaz je parsován, kdykoli je vykonáván. např.: char retezec[10]; strncpy(retezec, "COMMIT ", 10); EXEC SQL EXECUTE IMMEDIATE :retezec;

2.metoda Omezení: příkazy nesmějí být typu SELECT, počet vstupních hostitelských proměnných je znám včetně jejich datových typů už při kompilaci např.: 'INSERT INTO zaměstnanci (jméno, pozice) VALUES (:zam_jméno, :zam_pozice)' Příkazy: EXEC SQL PREPARE název_příkazu FROM { :řetezcová_proměnná | řetězcový_literál }; EXEC SQL EXECUTE název_příkazu [USING seznam_hostitelských_promenných]; seznam hostitelských proměnných má tvar: :proměnná1[:indikátor1] [, proměnná2[:indikátor2], ...]

2.metoda (pokračování)‏ ... int id_zam, id; char retezec[120], vyhledavaci_podm[40]; strcpy(retezec, "DELETE FROM zam WHERE id_zam = :n AND "); gets(vyhledavaci_podm); strcat(retezec, vyhledavaci_podm); EXEC SQL PREPARE dotaz FROM :retezec; gets(id); id_zam = atoi(id); EXEC SQL EXECUTE dotaz USING :id_zam;

2.metoda (pokračování 2)‏ PREPARE rozparsuje příkaz pojmenuje příkaz, jméno je identifikátor pro kompilátor a nikoli proměnná hostitelského programu (nedeklaruje se)‏ EXECUTE vyhrazená místa pro hostitelské proměnné v příkazu svázána s proměnnými uvedenými v části USING (vyhrazená místa musí korespondovat s proměnými počtem a datovým typem)‏ Příkaz je připraven pouze jednou, vykonán může být mnohokrát s různými hostitelskými proměnnými v části USING.

3. metoda Omezení: Sloupce uvedené v dotazu SELECT a počet hostitelských proměnných v příkazu jsou známy před kompilací. např.: 'SELECT jmeno, id FROM zamestnanci WHERE oddeleni = :id_oddeleni' Příkazy: PREPARE příkaz FROM { :řetězcová_proměnná | řetězcový _literál }; DECLARE kurzor CURSOR FOR dotaz; OPEN kurzor [USING seznam_host_proměnných]; FETCH kurzor INTO seznam_host_proměnných; CLOSE kurzor;

3. metoda (pokračování)‏ char retezec[132] = "SELECT od_data, pozice FROM zam WHERE plat < :z_plat"; EXEC SQL PREPARE dotaz FROM :retezec; EXEC SQL DECLARE kurzor CURSOR FOR dotaz; DECLARE asociuje kurzor s dotazem OPEN vytvoří kurzor a asociuje ho se vstupními hostitelskými proměnnými, vyhodnotí dotaz a naplní se aktivními řádky EXEC SQL OPEN kurzor USING :plat; EXEC SQL FETCH kurzor INTO :od_datum, :pozice_nazev; EXEC SQL CLOSE kurzor;

4. metoda Umožňuje vykonávat dynamické příkazy jako SELECT bez specifikace sloupců v době kompilace EXECUTE ... USING bez uvedeného listu hostitelských proměnných v době kompilace pomocí příkazů DESCRIBE SELECT LIST DESCRIBE BIND VARIABLES Každý aktivní SQL příkaz musí mít své vlastní SQLDA. Vyhodnocení příkazu pak probíhá: PREPARE DESCRIBE → alokace OPEN, FETCH, CLOSE...

SQLDA (SQL Descriptor Area)‏ datová struktura, kde program a Oracle udržují kompletní popis proměnných v dynamických SQL příkazech obsahuje počet položek a údaje o datovém typu každé položky položky ze SELECTu uloženy ve výstupních proměnných, vázané proměnné ve vstupních proměnných, v SQLDA jsou jejich adresy, čímž jsou zpřístupněny Oraclu výstupní hodnoty jsou vyzvednuty pomocí FETCH a vstupní jsou dány programem

4. metoda (pokračování)‏ 1. deklarace hostitelského řetězce pro zápis dotazu 2. deklarace select a bind SQLDA. 3. alokace paměti pro select a bind deskriptor 4. nastavení maximálního počtu položek v deskriptorech 5. naplnění hostitelského řetezce 6. PREPARE příkaz FROM řetězec 7. DECLARE a kurzor FOR příkaz 8. DESCRIBE vázané proměnné INTO bind deskriptor 9. Nastav počet míst pro proměnné na počet nalazený pomocí DESCRIBE. 10. Získej hodnoty a naalokuj místo pro vázané proměnné nalezené pomocí DESCRIBE. 11. OPEN kurzor USING bind descriptor 12. DESCRIBE seznam select položek INTO select descriptor 13. Nastav počet select položek na počet nalezený pomocí DESCRIBE 14. Nastav délku a datový typ každé select položce 15. FETCH řádky z databáze INTO alokovaný buffer, na který ukazuje select descriptor 16. Zpracuj vybrané hodnoty 17.Odalokuj naalokovanou paměť 18. CLOSE kurzor

4. metoda (pokračování 2)‏ EXEC SQL PREPARE název_příkazu FROM { :host_řetězcová_prom | řetěz_literál }; EXEC SQL DECLARE název_kurzoru CURSOR FOR název_příkazu; EXEC SQL DESCRIBE BIND VARIABLES FOR název_příkazu INTO název_bind_deskriptoru; EXEC SQL OPEN název_kurzoru [USING DESCRIPTOR název_bind_deskriptoru]; EXEC SQL DESCRIBE [SELECT LIST FOR] název_příkazu INTO název_select_deskriptoru; EXEC SQL FETCH název_kurzoru USING DESCRIPTOR název_select_descriptoru EXEC SQL CLOSE název_kurzoru;

4. metoda (pokračování 3)‏ Pokud je znám počet select položek, pak je možné příkaz DESCRIBE SELECT LIST vynechat a nahradit příkazem FETCH z metody 3: EXEC SQL FETCH název_kurzoru INTO seznam_hostitelských_proměnných; Pokud je znám počet míst pro vázané proměnné, je možné příkaz DESCRIBE BIND VARIABLES nahradit příkazem OPEN z metody 3: EXEC SQL OPEN název_kurzoru [USING seznam_hostitelských_proměnných];

Shrnutí dynamického SQL Pro konkrétní DBMS nutno dohledat podporovaný jazyk (viz embedded SQL) a tedy i konkrétní syntax pro zápis příkazů dynamického SQL, dáno knihovnou. Podstata je stejná, jednotlivé implementace se liší spíše drobnostech. V praxi se doporučuje použít co nejméně obecnou metodu dynamického programování, která pro danou aplikaci postačí.

ODBC (Open DataBase Connectivity)‏ standardizovaná metoda přístupu k databázi vyvinutá SQL Access group v roce 1992 cílem je zpřístupnit jakákoli data z jakékoli aplikace bez ohledu na to, jaký SŘBD data spravuje toho se dosahuje vložením mezivrstvy nazývané databázový ovladač (database driver) mezi aplikaci a SŘBD, jež překládá dotazy aplikace na dotazy, kterým SŘBD rozumí aby toto bylo možné, musí aplikace i SŘBD být vyhovující ODBC, tzn. aplikace musí být schona vydávat ODBC příkazy a SŘBD je musí umět rozpoznávat.