Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Dynamické SQL (dynamic SQL) Dotazovací jazyky Šárka Hlušičková
2
Zdrojové materiály: [1] Pro*C/C++ Precompiler Programmer's Guide. Release 9.2. Oracle Corporation, c Kapitola 13, Oracle Dynamic SQL. Dostupné na: < [2] -. Kapitola 15, Oracle Dynamic SQL: Method 4. Dostupné na: [3] DATE, C. J.; WHITE, Colin J. A Guide to DB2. Chapter 15, Application Programming III: Dynamic SQL, s [4] ODBC in Webopedia. Dostupné na: <
3
Ú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
4
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.
5
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
6
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
7
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é
8
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;
9
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], ...]
10
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;
11
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.
12
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;
13
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;
14
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...
15
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
16
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
17
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;
18
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];
19
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čí.
20
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.
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.