Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilMonika Šimková
1
Dynamic SQL P. Částek
2
Dynamic SQL Embedded SQL je překládaný preprocesorem => za běhu nelze nechat uživatele rozhodovat o vzhledu samotných SQL příkazů Dynamic SQL je rozšíření jazyka Embedded SQL o dynamický (online) přístup Kde je možno Dynamic SQL využít? SQL klient a aplikace využívající tohoto principu
3
Princip … … Dynamic SQL 1.Získá řetězec reprezentující SQL příkaz a připraví ho k dynamickému spuštění 2.Spustí připravený příkaz 3.Získá výsledek a vrátí jej uživateli … SQL klienta 1.Přijme a provede analýzu příkazu z terminálu 2.Vykoná příslušný SQL příkaz 3.Vrátí uživateli výsledek
4
Princip … 1.char * retezec = “DELETE FROM zbozi WHERE name=‘hruska’ ”; EXEC SQL DECLARE prikaz STATEMENT; EXEC SQL PREPARE prikaz FROM :retezec; 2.EXEC SQL EXECUTE prikaz; 3.printf(“%s”,(SQLCODE == 0 ? “Success” ; “Error” )); … Dynamic SQL 1.Získá řetězec reprezentující SQL příkaz a připraví ho k dynamickému spuštění 2.Spustí připravený příkaz 3.Získá výsledek a vrátí jej uživateli
5
Příklad EXEC SQL BEGIN DECLARE SECTION ; char * retezec = “DELETE FROM zbozi WHERE name=‘hruska’ ”; EXEC SQL END DECLARE SECTION ; EXEC SQL DECLARE prikaz STATEMENT; EXEC SQL PREPARE prikaz FROM :retezec; EXEC SQL EXECUTE prikaz; retezec je proměnná jazyka C, proto je v Embedded SQL používána s dvojtečkou prikaz je proměnná jazyka SQL, proto není v Embedded SQL používána s dvojtečkou
6
PREPARE Syntax: EXEC SQL PREPARE statement FROM string ; Jaké příkazy můžeme „připravit“ pro dynamické spuštění? –DDL CREATE, ALTER, DROP –DML INSERT, UPDATE*, DELETE*, SELECT** –DCL GRANT, REVOKE –Transakční zpracování COMMIT, ROLLBACK, LOCK –Další COMMENT, LABEL, EXPLAIN *)UPDATE a DELETE smí být zadány i ve formě CURRENT **)SELECT nesmí být zadán ve formě INTO
7
PREPARE Jaké příkazy nemůžeme „připravit“? –příkazy Embedded SQL pro řízení: EXEC SQL, INCLUDE, WHENEVER –příkazy Embedded SQL pro práci s kurzory: DECLARE CURSOR, OPEN, FETCH, CLOSE –příkazy Dynamic SQL: DECLARE STATEMENT, PREPARE, EXECUTE, DESCRIBE –připravovaný příkaz dále nesmí obsahovat středník ani hostitelskou proměnnou: retezec = “DELETE FROM zbozi WHERE name=:jmeno ; “; sprintf(retezec, “DELETE FROM zbozi WHERE name=‘%s’ ”, jmeno);
8
EXECUTE Syntax: EXEC SQL EXECUTE prikaz [ USING parametry ] ; Příklad EXECUTE USING: jmeno = “hruska” ; retezec = “DELETE FROM zbozi WHERE name=? ”; EXEC SQL PREPARE prikaz FROM :retezec ; EXEC SQL EXECUTE prikaz USING :jmeno ; –ekvivalentní: jmeno = “hruska” ; sprintf(retezec, “DELETE FROM zbozi WHERE name=‘%s’ ”, jmeno); EXEC SQL PREPARE prikaz FROM :retezec ; EXEC SQL EXECUTE prikaz ;
9
EXECUTE IMMEDIATE Syntax: EXEC SQL EXECUTE IMMEDIATE { :hostitelská_proměnná | řetězcová_proměnná }; EXECUTE IMMEDIATE je podporován jen v některých implementacích. Nesmí nic vracet ani mít nějaké parametry. Umožňuje vynechat sekce DECLARE STATEMENT a PREPARE: EXEC SQL EXECUTE IMMEDIATE :retezec ; nebo EXEC SQL EXECUTE IMMEDIATE ‘DELETE FROM zbozi’;
10
SELECT EXEC SQL BEGIN DECLARE SECTION ; char * retezec = “SELECT name, stuff_count FROM zbozi “; char name_[20]; int count_; EXEC SQL END DECLARE SECTION ; EXEC SQL DECLARE prikaz STATEMENT ; EXEC SQL PREPARE prikaz FROM :retezec ; EXEC SQL DECLARE kurzor CURSOR FOR prikaz ; EXEC SQL OPEN kurzor ; EXEC SQL WHENEVER NOT FOUND DO break; for (;;) { EXEC SQL FETCH kurzor INTO :name_, :count_ ; printf(“Name: %s, Count: %d \n”, name_, count_); }
11
SELECT EXEC SQL BEGIN DECLARE SECTION ; char * retezec = “SELECT name, stuff_count FROM zbozi WHERE name=? “; char name_[20]; int count_; EXEC SQL END DECLARE SECTION ; EXEC SQL DECLARE prikaz STATEMENT ; EXEC SQL PREPARE prikaz FROM :retezec ; EXEC SQL DECLARE kurzor CURSOR FOR prikaz ; EXEC SQL OPEN kurzor USING :jmeno; EXEC SQL WHENEVER NOT FOUND DO break; for (;;) { EXEC SQL FETCH kurzor INTO :name_, :count_ ; printf(“Name: %s, Count: %d \n”, name_, count_); }
12
SELECT EXEC SQL BEGIN DECLARE SECTION ; char * retezec = “SELECT name, stuff_count FROM zbozi WHERE name=? “; char name_[20]; int count_; EXEC SQL END DECLARE SECTION ; EXEC SQL DECLARE prikaz STATEMENT ; EXEC SQL PREPARE prikaz FROM :retezec ; EXEC SQL DECLARE kurzor CURSOR FOR prikaz ; EXEC SQL OPEN kurzor USING :jmeno; EXEC SQL WHENEVER NOT FOUND DO break; for (;;) { EXEC SQL FETCH kurzor INTO :name_, :count_ ; printf(“Name: %s, Count: %d \n”, name_, count_); } Co když dopředu nevíme, jak bude vypadat výstup dotazu SELECT?!
13
DESCRIBE Dynamicky popíše výstup (a vstup) příkazu SELECT Syntax: –DB/2 EXEC SQL DESCRIBE prikaz INTO sqlda ; –Pro*C/C++ EXEC SQL DESCRIBE BIND VARIABLES FOR prikaz INTO bind_deskriptor ; EXEC SQL DESCRIBE SELECT LIST FOR prikaz INTO select_deskriptor ; SQLDA = SQL Descriptor Area = struktura popisující formát výstupu (v ProC i vstupu) SELECTu Bind a select deskriptory jsou v jazyku ProC dva druhy SQLDA –Bind deskriptor popisuje vstupní parametry příkazu SELECT. –Select deskriptor popisuje výstupní sloupečky příkazu SELECT.
14
#include... /* alokace select deskriptoru */ char * retezec = “SELECT name, stuff_count FROM zbozi “; EXEC SQL DECLARE prikaz STATEMENT ; EXEC SQL PREPARE prikaz FROM :retezec ; EXEC SQL DESCRIBE SELECT LIST FOR prikaz INTO select_descriptor ; … /* Programátor nyní musí za pomoci dat ve struktuře select_descriptor naalokovat prostor pro uschování výsledků ze SELECTu. Odkaz na tento prostor musí uschovat také v select deskriptoru. */ EXEC SQL DECLARE kurzor CURSOR FOR prikaz ; EXEC SQL OPEN kurzor ; EXEC SQL WHENEVER NOT FOUND DO break; for (;;) { EXEC SQL FETCH kurzor INTO select_descriptor ; … /* Výpis výsledku */ } DESCRIBE
15
#include... /* alokace select deskriptoru */ /* alokace bind deskriptoru */ char * retezec = “SELECT name, stuff_count FROM zbozi WHERE name=?”; EXEC SQL DECLARE prikaz STATEMENT ; EXEC SQL PREPARE prikaz FROM :retezec ; EXEC SQL DESCRIBE SELECT LIST FOR prikaz INTO select_descriptor ; … /* alokace prostoru pro výstupní proměnné */ EXEC SQL DESCRIBE BIND VARIABLES FOR prikaz INTO bind_deskriptor ; … /* alokace prostoru pro vstupní proměnné */ EXEC SQL DECLARE kurzor CURSOR FOR prikaz ; EXEC SQL OPEN kurzor USING bind_descriptor ; EXEC SQL WHENEVER NOT FOUND DO break; for (;;) { EXEC SQL FETCH kurzor INTO select_descriptor ; … /* Výpis výsledku */ } DESCRIBE
16
Literatura Pro*C/C++ Precompiler Programmer’s Guide (na www.oracle.com) –Chapter 13: Oracle Dynamic SQL (principy, příkazy, příklady) http://download-west.oracle.com/docs/cd/B14117_01/appdev.101/a97269/pc_13dyn.htm –Chapter 15: Oracle Dynamic SQL: Method 4 (SQLDA, deskriptory, funkční příklad) http://download-west.oracle.com/docs/cd/B14117_01/appdev.101/a97269/pc_15ody.htm
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.