embedded sql - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · osnova motivace embedded sql –...
TRANSCRIPT
![Page 1: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/1.jpg)
Embedded SQL
Tomáš Skalický
Říjen 2010
![Page 2: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/2.jpg)
Osnova● Motivace● Embedded SQL
– Syntaxe– Příklady jednoduchých SQL příkazy– Deklarace proměnných - hostitelské proměnné a
indikátory– Připojení k databázi– Kurzory– Zpracování chyb
● Dynamické SQL– 4 metody
![Page 3: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/3.jpg)
Motivace● SQL
– “jednoduché” příkazy manipulující s daty● PL/SQL či T-SQL
– podporují proměnné, podmínky, cykly atd.
● Co použít– chci-li aplikaci obsahující složité výpočty psanou ve
“třetím” jazyce a pracující s daty v databázi?– mám-li existující aplikaci pracující s daty, kterou chceme
nyní jednoduše připojit k databázi?
![Page 4: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/4.jpg)
Embedded SQL● Kombinace
– výpočetní síly programovacího jazyka (C/C++, Fortran...) a
– schopnosti manipulace s daty v databázi (SQL)
● Hostitelské jazyky= jazyky implementující Embedded SQL– Pro*C, Pro*Fortran, Pro*Pascal...
![Page 5: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/5.jpg)
Pro*C – jak to fungujeDo zdrojového kódu v C píšeme speciálně uvozené SQL příkazy
soubor.pc
Kompilátor Pro*C tyto příkazy nahradí voláním funkcí standardní runtime knihovny (SQLLIB) a výsledekem je zdrojový kód v čistém C
soubor.c
Dále se už kód překádá jako “obyčejný céčkový zdroják”.
soubor.obj
Na konci je přilinkována SQLLIB
spustitelný program
![Page 6: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/6.jpg)
Syntaxe Pro*C
Základní pravidla pro psaní SQL příkazů do C-kódu:
● všechny SQL příkazy uvozeny direktivou EXEC SQL a končí středníkem “;”
● při použití proměnných v SQL příkazech musí být tyto proměnné uvozeny dvojtečkou “:”, v C-kódu se píší bez dvojtečky
![Page 7: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/7.jpg)
Příklad: SELECTEXEC SQL BEGIN DECLARE SECTION; int platSefa;EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT plat INTO :platSefa FROM Zamestnanec WHERE id = 324;
printf(“Plat šéfa je %d Kč.\n”, platSefa);
![Page 8: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/8.jpg)
Příklad: INSERTEXEC SQL BEGIN DECLARE SECTION; char jmeno[20]; int plat;EXEC SQL END DECLARE SECTION;
printf(“Vlož jméno nového zaměstnance: ”);scanf(“%s”, &jmeno);printf(“Vlož plat nového zaměstnance: ”);scanf(“%d”, &plat);
EXEC SQL INSERT INTO Zamestnanec (jmeno, plat) VALUES (:jmeno, :plat);
![Page 9: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/9.jpg)
Deklarativní část
● obsahuje deklarace všech proměnných, které se budou používat pro komunikaci mezi programem a databází = hostitelské proměnné
● v kódu nejvýše jednou (kurzory a výjimky deklarovány vně této sekce)
EXEC SQL BEGIN DECLARE SECTION; /* ... */EXEC SQL END DECLARE SECTION;
![Page 10: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/10.jpg)
Hostitelské proměnné● mohou být “jednoduché” nebo struktury (struct)● mohou být použity kdekoliv v SQL, kde se může objevit
konstanta– ale nemohou reprezentovat databázové objekty, jako
jména tabulek či sloupců● musí být deklarovány v BEGIN DECLARE SECTION … END
DECLARE SECTION bloku● vstupní a výstupní
– výstupní ... INTO klauzule v SELECT a FETCH příkazech– vstupní ... ostatní, např. ve VALUES, WHERE a HAVING
klauzulích
![Page 11: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/11.jpg)
Typy hostitelských proměnných● char, char*, char[n], int, long, float
– nejběžnější
● VARCHAR[n]– “pseudotyp” pro stringy– rozpoznávaný přímo kompilátorem Pro*C– v podstatě “céčkový” struct se 2 položkami:
● arr ... pole charů● len ... délka pole
● POZOR - varchar2 není povolen
![Page 12: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/12.jpg)
Indikátory● Motivace
– Co uložit do proměnné, když SELECT vrátí NULL?
● Každá hostitelská proměnná – vstupní i výstupní – může mít svůj indikátor
● Indikátor vypovídá o stavu hodnoty v hostitelské proměnné
![Page 13: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/13.jpg)
Indikátory● jsou vždy typu short● deklarovány v BEGIN DECLARE SECTION … END DECLARE
SECTION bloku jako hostitelské proměnné● svázány vždy s jednou konkrétní hostitelskou proměnnou
Syntaxe:EXEC SQL SELECT plat INTO :platSefa:platSefaIndikator FROM Zamestnanec WHERE id = 324;
![Page 14: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/14.jpg)
Indikátorvstupní hostitelské proměnné
Hodnota Význam-1 uložena hodnota NULL>= 0 uložena hodnota hostitelské proměnné
printf(“Vlož ID šéfa nebo 0, pokud zaměstnanec nemá šéfa: “);scanf(“%d”, &sefId);
if (sefId == 0) sefIdIndikator = -1;else sefIdIndikator = 0;
EXEC SQL INSERT Zamestnanec (jmeno, plat, sefId) VALUES (:jmeno, :plat, :sefId:sefIdIndikator);
![Page 15: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/15.jpg)
Indikátorvýstupní hostitelské proměnné
Hodnota Význam-1 nedefinovaná hodnota (NULL v databázi)0 koretkní naplnění hostitelské proměnné
> 0 vkládaná hodnota je větší než proměnná => hodnota zaokrouhlena, skutečná velikost je hodnota indikátoru
-2 vkládaná hodnota je větší než proměnná a skutečná velikost nelze určit => hodnota zaokrouhlena
![Page 16: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/16.jpg)
Indikátorvýstupní hostitelské proměnné
EXEC SQL SELECT plat, odmena INTO :plat, :odmena:odmenaIndikator FROM Zamestnanec WHERE id = :zamestnanecId;
if (odmenaIndikator == -1) /* odměna je NULL, ignorujem ji */ vyplata = plat;else vyplata = plat + odmena;
● POZOR - SELECT nebo FETCH NULL hodnoty do hostitelské proměnné bez indikátoru je chyba => error
![Page 17: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/17.jpg)
Připojení k databázi● Dvě ekvivalentní možnosti zápisu:
EXEC SQL CONNECT :login IDENTIFIED BY :heslo;● login a heslo jsou typu char[n], char* nebo VARCHAR[n]
● Dvě ekvivalentní možnosti zápisu:
EXEC SQL CONNECT :prihlasovaciUdaje;● prihlasovaciUdaje = “login/heslo”
● POZOR – Login a heslo nelze uvádět přímo!
EXEC SQL CONNECT “Pepa” IDENTIFIED BY “PepovoHeslo”;
![Page 18: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/18.jpg)
Commit a Rollback změn
EXEC SQL COMMIT;
● Pouze ukončení transakce:
EXEC SQL ROLLBACK;
● Storno změn:
● Storno změn + odpojení:
EXEC SQL ROLLBACK WORK RELEASE;
![Page 19: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/19.jpg)
Spojení s databází – příkladEXEC SQL BEGIN DECLARE SECTION; char * login = “Pepa”; char * heslo = “PepovoHeslo”; int platSefa;EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT :login IDENTIFIED BY :heslo;
EXEC SQL SELECT plat INTO :platSefa FROM Zamestnanec WHERE jmeno = “Krutas”;
printf(“Plat šéfa je %d Kč.\n”, platSefa);
EXEC SQL COMMIT WORK RELEASE;
● Co když má Pepa víc šéfů jménujících se Kruťas?
![Page 20: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/20.jpg)
Kurzory● Použití: v dotazech, které mohou vracet více řádků
– Použijeme-li “běžný” SELECT bez kurzoru a dotaz vrátí 1 řádek, ale může více, výsledek není definován.
● Vlastnosti kurzorů:– iterativní průchod přes vybrané řádky– znalost aktuálního řádku
![Page 21: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/21.jpg)
Syntaxe kurzorů● DECLARE CURSOR
– pojmenování kurzoru a přiřazení dotazu● OPEN
– vyhodnocení dotazu a určení všech řádků, které splňují podmínku dotazu
● FETCH– postupné procházení vybraných řádků, jednoho po
druhém (není-li použito hostitelské pole)● CLOSE
– zavření kurzoru a zneplatnění vybraných řádků
![Page 22: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/22.jpg)
Kurzory – DECLARE CURSOR● Pojmenování kurzoru a přiřazení dotazu
– Jméno kurzoru● je identifikátor pro kompilátor● není hostitelská proměnná, identifikátor ani “céčková”
proměnná– Dotaz
● nesmí obsahovat INTO klauzuli (INTO klauzule je součástí FETCH příkazu)
EXEC SQL DECLARE zamestnanecKurzor CURSOR FOR SELECT jmeno, plat FROM Zamestnanec WHERE sefId = :sefId;
![Page 23: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/23.jpg)
Kurzory – OPEN● Vyhodnocení dotazu a určení všech řádků, které splňují
podmínku dotazu– Kurzor před prvním vybraným řádkem (je potřeba
provést jeden FETCH příkaz)– Pro opětovné vyhodnocení hostitelských proměnných je
třeba provést znovu OPEN● obyčejně je potřeba provést CLOSE před dalším OPEN,
ale záleží na nastavení● bez nutnosti CLOSE příkazu lepší výkon
EXEC SQL OPEN zamestnanecKurzor;
![Page 24: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/24.jpg)
Kurzory – FETCH● Postupné procházení vybraných řádků a nastavování
výstupních hostitelských proměnných– Pro připomenutí:
● SELECT v dotazu neobsahuje INTO klauzuli● první FETCH nastaví kurzor na první vybraný řádek
– Pouze dopředný pohyb kurzoru v rámci vybraných řádků– Pro návrat na předcházející řádek třeba nejprve použít
OPEN příkaz a iterovat od začátku
while (1) { EXEC SQL FETCH zamestnanecKurzor INTO :jmeno, :plat;}
![Page 25: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/25.jpg)
Kurzory – CLOSE● Zavření kurzoru a zneplatnění vybraných řádků
– Uvolnění zámků● závisí na nastavení
– Pro čtení ze zavřeného kurzoru je třeba nejprve použít OPEN příkaz
EXEC SQL CLOSE zamestnanecKurzor;
![Page 26: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/26.jpg)
Kurzory – příklad
EXEC SQL DECLARE zamestnanecKurzor CURSOR FOR SELECT jmeno, plat FROM Zamestnanec WHERE sefId = :sefId;
EXEC SQL OPEN zamestnanecKurzor;
EXEC SQL WHENEVER NOT FOUND DO break;while (1) { EXEC SQL FETCH zamestnanecKurzor INTO :jmeno, :plat; printf(“Zaměstnanec %s bere %d Kč.\n”, jmeno, plat);}
EXEC SQL CLOSE zamestnanecKurzor;
● Co dělá WHENEVER ...?
![Page 27: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/27.jpg)
Scrollovatelné kurzory● “Běžné” kurzory
– možný průchod pouze od začátku do konce– není možný změnit směr iterace– pro načtení nějaké předchozí hodnoty (či stávající
hodnoty ještě jednou) je třeba znovu otevřít kurzor a procházet od začátku
● Scrollovatelné kurzory– mohu procházet tam i zpět– FETCH FIRST, FETCH PRIOR, FETCH RELATIVE n...
EXEC SQL DECLARE zamestnanecKurzor SCROLL CURSOR FOR SELECT jmeno, plat FROM Zamestnanec
![Page 28: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/28.jpg)
Zpracování chyb
● Dva možné způsoby:– Explicitní kontrola příslušných položek struktury SQLCA,
nebo– Automatická kontrola a zpracování chyb pomocí
WHENEVER příkazu
![Page 29: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/29.jpg)
WHENEVER
● Kdykoliv je splněna daná podmínka, provede se příslušná akce.
– Kontrola příslušných položek struktury SQLCA pro danou podmínku
● Příkazy se mohou vzájemně překrývat● #include <sqlca.h>
EXEC SQL WHENEVER <podmínka> <akce>;
![Page 30: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/30.jpg)
WHENEVER – podmínka● Možné podmínky (a kdy jsou splněny):
– SQLERROR● Nějaký SQL EXEC příkaz skončil chybou● Transakce by měla být explicitně stornována
– SQLWARNING● Nějaký SQL EXEC příkaz skončil varováním
– NOT FOUND● Žádný řádek nesplňuje WHERE podmínku nebo● SELECT INTO / FETCH příkazy nevrátily žádný řádek
![Page 31: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/31.jpg)
WHENEVER – akce● Možné akce:
– STOP● volání exit(), program ukončen, nepotvrzené akce
stornovány (rollback)– CONTINUE
● pokud lze, pokusí se program pokračovat dalším příkazem
– DO <příkaz>● Vykonání daného příkazu, typicky volání funkce, break
– GOTO <návěstí>● Skok na dané návěstí
![Page 32: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/32.jpg)
WHENEVER – příklady
EXEC SQL WHENEVER SQLERROR DO sqlError(“Nelze se připojit”);
● Při připojování k databázi:
● SELECTy v cyklu (pomocí kurzoru):
● sqlError je mnou definovaná funkce na zpracováí chyby
EXEC SQL WHENEVER NOT FOUND DO break;
![Page 33: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/33.jpg)
Dynamické SQL● Většina DB aplikací zpracovává přesně specifikovanou
úlohu.– SQL příkazy jsou již ve zdrojovém kódu a jsou neměnné
● ALE některé aplikace dopředu neví, jaký příkaz budou posílat na server.
– Např.: Jak napsat jeden příkaz, který dle vstupu vloží nového člověka buď do tabulky Zamestnanec, či do tabulky Externista?
![Page 34: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/34.jpg)
Dynamické SQL
= dynamické Embedded SQL● umožňuje za běhu vytvářet a vyhodnocovat SQL příkazy.
Typické použití:● Nejsou-li známy v době kompilace programu některé z
následujících položek:– Text SQL příkazu (např. klauzule)– Počet nebo datové typy hostitelských proměnných– Názvy databázových objektů, např. sloupce, indexy,
tabulky, pohledy...
![Page 35: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/35.jpg)
Dynamické SQL: +/-● Výhody:
– univerzálnější programy– dynamické sestavení SQL příkazu 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
=> použití pouze tam, kde je to nezbytně nutné
![Page 36: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/36.jpg)
Dynamické SQL:
Požadavky na příkazy (1)
● Textový řetězec reprezentující příkaz– musí být platný SQL příkaz– nesmí obsahovat:
● EXEC SQL klauzuli● ukončovač příkazu “;”● ALLOCATE, CLOSE, DECLARE, DESCRIBE, EXECUTE,
FETCH, FREE, GET, INCLUDE, OPEN, PREPARE, SET, WHENEVER
![Page 37: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/37.jpg)
Dynamické SQL:
Požadavky na příkazy (2)
● Textový řetězec reprezentující příkaz– může obsahovat placeholdery
● fiktivní proměnné sloužící k rezervaci místa pro skutečné hostitelské proměnné
● nedeklarují se● libovolné jméno (v následujících dvou řetězcích není
rozdíl)
'DELETE FROM Zamestnanec WHERE sefId = :sefId AND job = :job'
'DELETE FROM Zamestnanec WHERE sefId = :s AND job = :j'
![Page 38: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/38.jpg)
Dynamické SQL:
Zpracování příkazu
1. Program si vyžádá zadání textu SQL příkazu od uživatele a hodnoty hostitelských proměnných.
2. Parsování příkazu => potvrzení validity3. Nahrazení placeholdrů hostitelskými proměnnými
– již máme adresy proměnných => můžeme s nimi pracovat
4. Vykonání příkazu
![Page 39: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/39.jpg)
Dynamické SQL:
4 metody použití● Seřazeny vzestupně dle obecnosti (flexibility) => dle
náročnosti
(1) Bez návratových hodnot a hostitelských proměnných(2) Bez návratových hodnot ale se známým počtem vstupních
hostitelských proměnných(3) Se známým počtem vrácených sloupců a vstupních
hostitelských proměnných(4) S neznámým počtem vrácených sloupců a vstupních
hostitelských proměnných
![Page 40: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/40.jpg)
Dynamické SQL:
1. metoda● Omezení:
– Příkaz nesmí být typu SELECT a nesmí obsahovat žádný placeholder pro vstupní hostitelské proměnné
'DELETE FROM Zamestnanec WHERE oddeleniId = 20'
● Syntaxe:
EXEC SQL EXECUTE IMMEDIATELY { :řetězcováProměnná | řetězcovýLiterál }
● Příkaz je parsován vždy, když je vykonáván => pomalé
![Page 41: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/41.jpg)
Dynamické SQL:
1. metoda – příklad
char dynamickyPrikaz[100];...while (1) { printf(“Vlož SQL příkaz: “); gets(dynamickyPrikaz); if (*dynamickyPrikaz == '\0') break;
/* dynamickyPrikaz nyní obsahuje textovou reprezentaci celého SQL příkaz */ EXEC SQL EXECUTE IMMEDIATELY :dynamickyPrikaz;}
![Page 42: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/42.jpg)
Dynamické SQL:
2. metoda
● Omezení:– Příkaz nesmí být typu SELECT.– Počet placeholderů pro vstupní hostitelské proměnné a
jejich datové typy musí být známy v době kompilace.
'INSERT INTO Zamestnanec (jmeno, plat) VALUES (:jmeno, :plat)'
![Page 43: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/43.jpg)
Dynamické SQL:
2. metoda – syntaxe
● Syntaxe:EXEC SQL PREPARE nazevPrikazu FROM { :retezcovaPromenna, retezcovyLiteral };
EXEC SQL EXECUTE nazevPrikazu [USING seznamHostitelskychPromennych];
:promenna1[:indikator1] [, promenna2[:indikator2], ...]
seznamHostitelskychPromennych ve tvaru:
![Page 44: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/44.jpg)
Dynamické SQL:
2. metoda – příkladint idZamestnance;char textPrikazu[100], podminka[40], id[10];...strcpy(textPrikazu, “DELETE FROM Zamestnanec WHERE id = :n AND “);printf(“Doplňte vyhledávací podmínku následujícího příkazu\n”);printf(“%s\n”, textPrikazu);gets(podminka);strcat(textPrikazu, podminka);
EXEC SQL PREPARE prikaz FROM :textPrikazu;while (1) { printf(“Vlož ID zaměstnance: “); gets(id); idZamestnance = atoi(id); EXEC SQL EXECUTE prikaz USING :idZamestnance;}
![Page 45: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/45.jpg)
Dynamické SQL:
2. metoda – PREPARE, EXECUTE● PREPARE
– rozparsuje a pojmenuje příkaz● jméno je identifikátor pro kompilátor, není hostitelská
proměnná, identifikátor či “céčková” proměnná => nedeklaruje se
– stejné jako pojmenování kurzoru
● EXECUTE– všechny placeholdery nahradí hostitelské proměnné z
klauzule USING● musí být zachováno pořadí proměnných
● PREPARE pouze jednou, EXECUTE může být vícekrát s různými hostitelskými proměnnými v části USING
![Page 46: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/46.jpg)
Dynamické SQL:
3. metoda
● Omezení:– Počet navratových sloupců SELECTu, počet placeholderů
pro vstupní hostitelské proměnné a jejich datové typy musí být známy v době kompilace.
– Oproti 2. metodě navíc pouze návratové sloupce
'SELECT sefId, MIN(plat), MAX(plat) FROM Zamestnanec GROUP BY sefId WHERE pozice = :pozice'
![Page 47: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/47.jpg)
Dynamické SQL:
3. metoda – syntaxe kroků
● Syntaxe:EXEC SQL PREPARE nazevPrikazu FROM { :retezcovaPromenna, retezcovyLiteral };
EXEC SQL DECLARE jmenoKurzoru CURSOR FOR nazevPrikazu;EXEC SQL OPEN jmenoKurzoru [USING seznamHostitelskychPromennych];EXEC SQL FETCH jmenoKurzoru INTO seznamHostitelskychPromennych;EXEC SQL CLOSE jmenoKurzoru;
Dále použit kurzor:
![Page 48: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/48.jpg)
Dynamické SQL:
3. metoda – příkladchar textDotazu[100] = “SELECT jmeno, pozice, plat FROM Zamestnanec WHERE plat < :pl”;EXEC SQL PREPARE dotaz FROM :textDotazu;
EXEC SQL DECLARE kurzorZamestnancu CURSOR FOR dotaz;
EXEC SQL OPEN kurzorZamestnancu USING :platovyLimit;
EXEC SQL FETCH kurzorZamestnancu INTO :jmeno, :pozice, :plat;EXEC SQL CLOSE kurzorZamestnancu;
DECLARE asociuje kurzor s dotazem.
OPEN nahradí placeholdery v dotazu vstupními hostitelskými proměnnými, vyhodnotí dotaz a vybere patřičné řádky.
![Page 49: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/49.jpg)
Dynamické SQL:
4. metoda● Umožňuje použít předem neznámý počet návratových
sloupců a placeholderů pro vstupní hostitelské proměnné.– SELECT bez specifikace sloupců v době kompilace– EXECUTE … USING bez uvedeného listu hostitelských
proměnných v době kompilace● Pomocí deskriptorů
– DESCRIBE SELECT LIST– DESCRIBE BIND VARIABLES
● Každý aktivní SQL příkaz musí mít své vlastní SQLDA.
![Page 50: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/50.jpg)
Dynamické SQL:
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é (bind) proměnné ve vstupních proměnných, v SQLDA jsou jejich adresy, čímž jsou zpřístupněny Oraclu
● Výstupní hodnoty jsou získány FETCHem a vstupní jsou zadány programem.
![Page 51: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/51.jpg)
Dynamické SQL:
4. metoda – průběh 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. Nastavení počtu míst pro proměnné na počet nalazený pomocí DESCRIBE 10. Získání hodnoty a alokace 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. Nastavení počtu select položek na počet nalezený pomocí DESCRIBE 14. Nastavení délky a datového typu každé select položky 15. FETCH řádky z databáze INTO alokovaný buffer, na který ukazuje select descriptor 16. Zpracování vybrané hodnoty 17. Uvolnění naalokované paměti 18. CLOSE kurzor
![Page 52: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/52.jpg)
Dynamické SQL:
4. metoda – syntaxe krokůEXEC SQL PREPARE nazevPrikazu FROM { :retezcovaPromenna, retezcovyLiteral };
EXEC SQL DECLARE jmenoKurzoru CURSOR FOR nazevPrikazu;
EXEC SQL DESCRIBE BIND VARIABLES FOR nazevPrikazu INTO nazevBindDeskriptoru;
EXEC SQL OPEN jmenoKurzoru [USING DESCRIPTOR nazevBindDeskriptoru];
EXEC SQL DESCRIBE [SELECT LIST FOR] nazevPrikazu INTO nazevSelectDeskriptoru;
EXEC SQL FETCH jmenoKurzoru USING DESCRIPTOR nazevSelectDeskriptoru;EXEC SQL CLOSE jmenoKurzoru;
![Page 53: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/53.jpg)
Dynamické SQL:
4. metoda – zjednodušení
● 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 3. metody:
EXEC SQL OPEN jmenoKurzoru [USING seznamHostitelskychPromennych];
● Pokud je znám počet select položek, pak je možné příkaz DESCRIBE SELECT LIST vynechat a nahradit ho příkazem FETCH z 3. metody:
EXEC SQL FETCH jmenoKurzoru INTO seznamHostitelskychPromennych;
![Page 54: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/54.jpg)
Dynamické SQL:
Jakou metodu použít?
![Page 55: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/55.jpg)
Zdroje[1] Pro*C/C++ Precompiler Programmer's Guide, Release 9.2Oracle Corporation, ©1996-2002, použité kapitoly:
– Kapitola 1, Introduction http://download.oracle.com/docs/cd/B10500_01/appdev.920/a97269/pc_01int.htm
– Kapitola 6, Embedded SQL http://download.oracle.com/docs/cd/B10500_01/appdev.920/a97269/pc_06sql.htm
– Kapitola 13, Oracle Dynamic SQL http://download.oracle.com/docs/cd/B10500_01/appdev.920/a97269/pc_13dyn.htm
[2] Semináře RNDr. Michala Kopeckého, Ph. D.: Administrace Oracle
[3] Wikipedia, http://www.wikipedia.org/
![Page 56: Embedded SQL - ksi.mff.cuni.czpokorny/dj/prezentace/3_37.pdf · Osnova Motivace Embedded SQL – Syntaxe – Příklady jednoduchých SQL příkazy – Deklarace proměnných - hostitelské](https://reader036.vdocuments.site/reader036/viewer/2022062317/5a7823a67f8b9aa3688e7ad2/html5/thumbnails/56.jpg)
Dotazy