Embedded SQL. Tomáš Skalický. Říjen 2010

Podobné dokumenty
Embedded SQL v C/C++ úvod. Administrace Oracle Kateřina Opočenská

Embedded SQL Dotazovací Jazyky I. Bc. CHOMUT Miroslav Bc. VODOLÁN Miroslav

Embedded SQL v C/C++ III - pole, struktury. Jindřich Vodrážka

Embedded C výjimky, kurzory. Šárka Hlušičková

Text úlohy. Systémový katalog (DICTIONARY):

Databáze I. Přednáška 9

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Distanční opora předmětu: Databázové systémy Tématický blok č. 8: Transact SQL Autor: RNDr. Jan Lánský, Ph.D.

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Databáze 2011/2012 T-SQL - kurzory, funkce. RNDr.David Hoksza, Ph.D.

Jazyk PL/SQL Úvod, blok

Informační systémy 2008/2009. Radim Farana. Obsah. Jazyk SQL

PRŮBĚHOVÝ TEST Z PŘEDNÁŠEK

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

10. Architektura klient/server a třívrstvá architektura

10. Architektura klient/server a třívrstvá architektura

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

5. POČÍTAČOVÉ CVIČENÍ

Operátory ROLLUP a CUBE

7. Integrita a bezpečnost dat v DBS

7. Integrita a bezpečnost dat v DBS

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Stored Procedures & Database Triggers, Tiskové sestavy v Oracle Reports

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Informační systémy 2008/2009. Radim Farana. Obsah. Skripty a dávky. Nastavení aktuální databáze. USE DatabaseName

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

Jazyk SQL databáze SQLite. připravil ing. petr polách

Kritéria hodnocení praktické maturitní zkoušky z databázových systémů

4. lekce Přístup k databázi z vyššího programovacího jazyka

Stručný obsah. část III Aktualizace dat Kapitola 10: Aktualizace databáze 257 Kapitola 11: Integrita dat 275 Kapitola 12: Zpracování transakcí 307

Databáze I. 5. přednáška. Helena Palovská

Databáze I. Přednáška 4

DJ2 rekurze v SQL. slajdy k přednášce NDBI001. Jaroslav Pokorný

Spojová implementace lineárních datových struktur

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

KIV/ZIS cvičení 6. Tomáš Potužák

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Kapitola 4: SQL. Základní struktura

6. Příkazy a řídící struktury v Javě

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Databázové systémy Cvičení 5.2

Algoritmizace a programování

Programování v C++ 1, 1. cvičení

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

KIV/ZIS cvičení 5. Tomáš Potužák

6 Příkazy řízení toku

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

Zápisování dat do databáze

Úvod do databázových systémů

Struktura pamětí a procesů v DB Oracle. Radek Strnad

2 Datové typy v jazyce C

Zápis programu v jazyce C#

Úvod do databázových systémů

MySQLi (objektově) Příklad vytvoření instance třídy včetně parametrů pro připojení: $mysqli = new mysqli('localhost', 'login', 'heslo', 'databaze');

Kritéria hodnocení praktické maturitní zkoušky z databázových systémů

Programovací jazyk Pascal

Práce se soubory. Základy programování 2 Tomáš Kühr

Základní přehled SQL příkazů

Pointery II. Jan Hnilica Počítačové modelování 17

Popis souboru pro generování reportů *.report

IBM DB2 Universal Database. Přehled zpráv, díl 2. verze 7 GC

Oracle Call Interface (OCI)

Cykly. Základy programování 1 Martin Kauer (Tomáš Kühr)

Virtual Private Database (VPD) Jaroslav Kotrč

Struktura programu v době běhu

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Úvod do programování - Java. Cvičení č.4

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Internetová filmová databáze IFDB

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Programování v jazyce C a C++

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

DATABÁZOVÉ A INFORMAČNÍ SYSTÉMY

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

KIV/ZIS - SQL dotazy. stáhnout soubor ZIS- 04_TestovaciDatabaze accdb. SQL dotazy. budeme probírat pouze SELECT

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Úvod do databázových systémů

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

8 Třídy, objekty, metody, předávání argumentů metod

VISUAL BASIC. Práce se soubory

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

Programování 2 (NMIN102) Soubory. RNDr. Michal Žemlička, Ph.D.

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

Administrace Oracle. Práva a role, audit

Fakulta elektrotechniky a informatiky Databázové systémy 2. Leden 2010 souhrn. Červené dobře (nejspíš), modré možná

Databáze II. 2. přednáška. Helena Palovská

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Transkript:

Embedded SQL Tomáš Skalický Říjen 2010

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

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?

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...

Pro*C jak to funguje Do 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

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

Příklad: SELECT EXEC 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);

Příklad: INSERT EXEC 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);

Deklarativní část EXEC SQL BEGIN DECLARE SECTION; /*... */ EXEC SQL END DECLARE SECTION; 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)

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

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

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é

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;

Indikátor vstupní 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);

Indikátor výstupní hostitelské proměnné Hodnota Význam -1 nedefinovaná hodnota (NULL v databázi) 0 koretkní naplnění hostitelské proměnné > 0-2 vkládaná hodnota je větší než proměnná => hodnota zaokrouhlena, skutečná velikost je hodnota indikátoru vkládaná hodnota je větší než proměnná a skutečná velikost nelze určit => hodnota zaokrouhlena

Indikátor vý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

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] EXEC SQL CONNECT :prihlasovaciudaje; prihlasovaciudaje = login/heslo POZOR Login a heslo nelze uvádět přímo! EXEC SQL CONNECT Pepa IDENTIFIED BY PepovoHeslo ;

Commit a Rollback změn Pouze ukončení transakce: EXEC SQL COMMIT; Storno změn: EXEC SQL ROLLBACK; Storno změn + odpojení: EXEC SQL ROLLBACK WORK RELEASE;

Spojení s databází příklad EXEC 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?

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

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ů

Kurzory DECLARE CURSOR Pojmenování kurzoru a přiřazení dotazu Jméno kurzoru Dotaz je identifikátor pro kompilátor není hostitelská proměnná, identifikátor ani céčková proměnná 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;

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;

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; }

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;

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...?

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

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

WHENEVER EXEC SQL WHENEVER <podmínka> <akce>; 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>

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 NOT FOUND Nějaký SQL EXEC příkaz skončil varováním Žádný řádek nesplňuje WHERE podmínku nebo SELECT INTO / FETCH příkazy nevrátily žádný řádek

WHENEVER akce Možné akce: STOP CONTINUE DO <příkaz> volání exit(), program ukončen, nepotvrzené akce stornovány (rollback) pokud lze, pokusí se program pokračovat dalším příkazem Vykonání daného příkazu, typicky volání funkce, break GOTO <návěstí> Skok na dané návěstí

WHENEVER příklady Při připojování k databázi: EXEC SQL WHENEVER SQLERROR DO sqlerror( Nelze se připojit ); sqlerror je mnou definovaná funkce na zpracováí chyby SELECTy v cyklu (pomocí kurzoru): EXEC SQL WHENEVER NOT FOUND DO break;

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?

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...

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é

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

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'

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í validity 3. Nahrazení placeholdrů hostitelskými proměnnými již máme adresy proměnných => můžeme s nimi pracovat 4. Vykonání příkazu

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

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é

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;

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)'

Dynamické SQL: 2. metoda syntaxe Syntaxe: EXEC SQL PREPARE nazevprikazu FROM { :retezcovapromenna, retezcovyliteral }; EXEC SQL EXECUTE nazevprikazu [USING seznamhostitelskychpromennych]; seznamhostitelskychpromennych ve tvaru: :promenna1[:indikator1] [, promenna2[:indikator2],...]

Dynamické SQL: 2. metoda příklad int 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; }

Dynamické SQL: 2. metoda PREPARE, EXECUTE PREPARE EXECUTE 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 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

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'

Dynamické SQL: 3. metoda syntaxe kroků Syntaxe: EXEC SQL PREPARE nazevprikazu FROM { :retezcovapromenna, retezcovyliteral }; Dále použit kurzor: EXEC SQL DECLARE jmenokurzoru CURSOR FOR nazevprikazu; EXEC SQL OPEN jmenokurzoru [USING seznamhostitelskychpromennych]; EXEC SQL FETCH jmenokurzoru INTO seznamhostitelskychpromennych; EXEC SQL CLOSE jmenokurzoru;

Dynamické SQL: 3. metoda příklad char textdotazu[100] = SELECT jmeno, pozice, plat FROM Zamestnanec WHERE plat < :pl ; EXEC SQL PREPARE dotaz FROM :textdotazu; EXEC SQL DECLARE kurzorzamestnancu CURSOR FOR dotaz; DECLARE asociuje kurzor s dotazem. EXEC SQL OPEN kurzorzamestnancu USING :platovylimit; OPEN nahradí placeholdery v dotazu vstupními hostitelskými proměnnými, vyhodnotí dotaz a vybere patřičné řádky. EXEC SQL FETCH kurzorzamestnancu INTO :jmeno, :pozice, :plat; EXEC SQL CLOSE kurzorzamestnancu;

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.

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.

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

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;

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;

Dynamické SQL: Jakou metodu použít?

Zdroje [1] Pro*C/C++ Precompiler Programmer's Guide, Release 9.2 Oracle 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/

Dotazy