Embedded SQL v C/C++ úvod
Transkript
Embedded SQL v C/C++ úvod Administrace Oracle Kateřina Opočenská Motivace potřeba začlenit komunikaci s databází do aplikace v nějakém vyšším programovacím jazyce řešení (na Oracle): a) b) OCI (Oracle Call Interface) – přímý přístup k funkcím, rychlejší, ale programátorsky náročnější Embedded SQL – přehlednější, uživatel odstaven od znalostí API daného SQL serveru Embedded SQL Tento referát je o Embedded SQL pro C/C++ SQL lze ale na Oracle začlenovat i do jiných jazyků (např. Cobol, Fortran) Jak to funguje Do zdrojového kódu v C/C++ píšeme speciálně uvozené SQL příkazy soubor.pc Prekompilátor Pro*C/C++ (proc) tyto dotazy nahradí voláním funkcí standardní run-time knihovny (SQLLIB) a převede soubor.ps do čistého C/C++. soubor.c Dále se už kód překládá jako „obyčejný“ céčkový zdroják. Na konci se k němu přilinkuje SQLLIB soubor.obj, spustitelný program Syntaxe Pro*C Základní pravidla pro psaní SQL příkazů do C-kódu: 1) všechny SQL příkazy jsou uvozeny direktivou EXEC SQL a končí středníkem „;“ 2) při použití proměnných v SQL příkazech musí být tyto proměnné uvozeny dvojtečkou „:“ (odlišení od databázových polí), v C-kódu se píší normálně Příklad: základní syntaxe Pro*C SELECT … INTO … FROM EXEC SQL BEGIN DECLARE SECTION; int plat_sefa; EXEC SQL END DECLARE SECTION; /* ... */ EXEC SQL SELECT plat INTO :plat_sefa FROM Zamestnanci WHERE id_zam = 123; /* ... */ printf("Sefuv plat: %d\n", plat_sefa); /* ... */ Příklad: základní syntaxe Pro*C INSERT INTO … VALUES typedef struct { int id; char name[20]; }rec; EXEC SQL BEGIN DECLARE SECTION; Myrec rec; EXEC SQL END DECLARE SECTION; Myrec.id=5; strcpy(Myrec.name,"User5"); EXEC SQL INSERT INTO Lide VALUES (:Myrec); Deklarativní část všechny deklarace mezi EXEC SQL BEGIN DECLARE SECTION; a EXEC SQL END DECLARE SECTION; určují, jaké proměnné se budou používat pro komunikaci mezi programem a databází (načítání dat i zápis, indikátory) těmto proměnným se také říká hostitelské proměnné (host variables) Typy hostitelských proměnných char, int, short, long, float, double + pointery na ně, pole VARCHAR[n] „pseudotyp“ pro stringy rozpoznávaný přímo prekompilátorem Pro*C/C++ v podstatě céčkový struct se 2 položkami: arr – pole charů len – délka pole Implicitní konverze datových typů SQL Pro*C/C++ VARCHAR VARCHAR[n], char DATE VARCHAR[n], char[] INTEGER int NUMBER(P,S) char, short, int, long, float, double, char[n], VARCHAR[n] CHAR(X) char[n],VARCHAR[n],int,short,long,float,doule Příklad: spojení s databází EXEC SQL BEGIN DECLARE SECTION; char username[20]; char password[20]; EXEC SQL END DECLARE SECTION; strcpy(username, "uzivatel"); strcpy(password, "heslo"); EXEC SQL CONNECT :username IDENTIFIED BY :password; /* práce s databází */ EXEC SQL COMMIT WORK RELEASE; /* potvrzení změn, odpojení */ Spojení s databází - doplnění: Pouze ukončení transakce: EXEC SQL COMMIT; Storno změn: EXEC SQL ROLLBACK; Storno změn + odpojení: EXEC SQL ROLLBACK WORK RELEASE; Připojení k databázi podrobněji Kompletní syntaxe CONNECTu: EXEC SQL CONNECT { :user IDENTIFIED BY :oldpswd | :usr_psw } [[ AT { dbname | :host_variable }] USING :connect_string ] [ {ALTER AUTHORIZATION :newpswd | IN { SYSDBA | SYSOPER } MODE} ] ; Připojení k databázi Dvě ekvivalentní možnosti zápisu: EXEC SQL CONNECT :username IDENTIFIED BY :password; • username a password jsou typu char[n],char* nebo VARCHAR[n] EXEC SQL CONNECT :usr_psw; • usr_psw = "username/password "; Připojení k jiné databázi: EXEC SQL CONNECT … USING db; • db = „semora“; Login a heslo nelze uvádět přímo! NE: EXEC SQL CONNECT "scott" IDENTIFIED BY "tiger"; Indikátorové proměnné #1 motivace: co uložit do proměnné, když SELECT vrátí NULL? řešení: indikátor, který ukáže, zda (a jak) je hostitelská proměnná korektně naplněna Indikátorové proměnné #2 proměnné typu short deklarovány v deklarační sekci stejně jako hostitelské proměnné svázané vždy s jednou konkrétní hostitelskou proměnnou indikují, co je v hostitelské proměnné obsaženo za hodnotu (NULL flags, ořezání řetězce) v rámci SQL příkazů také uvozeny „:“ následují vždy bezprostředně za příslušnou hostitelskou proměnnou (pro přehlednost lze oddělit klíčovým slovem INDICATOR) Příklad: indikátorové proměnné EXEC SQL SELECT plat INTO :plat_sefa :plat_sefa_id FROM Zamestnanci WHERE id_zam = 123; /* ... */ if (plat_sefa_id == 0){ printf("Sefuv plat: %d\n", plat_sefa); } Návratové hodnoty identifikátorů v SELECT … INTO indikátor -1 0 hostitelská proměnná nedefinovaná hodnota (NULL v databázi) korektní naplnění -2 vkládaná hodnota je větší než proměnná a není možné určit skutečnou velikost >0 vkládaná hodnota je větší než proměnná, skutečná velikost je hodnota indikátoru Návratové hodnoty identifikátorů v INSERT/UPDATE indikátor databáze -1 uložena hodnota NULL >=0 uložena korektní hodnota Základní ošetření chyb #1 EXEC SQL WHENEVER <cond> <action>; Kdykoliv je splněna podmínka <cond>, automaticky se vyvolá akce <action> příkazy se vzájemně překrývají #include <sqlca.h> Možné podmínky (a kdy jsou splněny): NOT FOUND kritériům SELECT/FETCH neodovídá žádná položka SQLERROR nějaký příkaz SQL EXEC skončil chybou SQLWARNING nějaký příkaz SQL EXEC skončil s varováním Základní ošetření chyb #2 Možné akce: CONTINUE pokud lze, pokusí se program pokračovat dalším příkazem DO <stmt> vykoná se příkaz <stmt>, typicky volání fce / exit GOTO <label> skok na daný label STOP volání exit(), ukončení programu, nepotvrzené akce jsou stornovány (rollback) Příklad: ošetření chyb při připojování k databázi: EXEC SQL WHENEVER SQLERROR DO sql_error(„Nelze se pripojit“); SELECTy v cyklu (pomocí kurzoru): EXEC SQL WHENEVER NOT FOUND DO break; Více o Oracle Pro*C/C++ Pro*C/C++ Programmer's Guide http://mates.ms.mff.cuni.cz/intra/oracle/doc/ora804nt/appdev.804 /a58233/toc.htm Introduction to Pro*C Embedded SQL http://www-db.stanford.edu/~ullman/fcdb/oracle/or-proc.html Embedded SQL FAQ https://www1.columbia.edu/sec/acis/dba/oracle/faq-esql.html Oracle Precompiler FAQ http://www.orafaq.com/faqpro.htm
Podobné dokumenty
Publikované práce - Ústav informatiky AV ČR
Iizuka : Fuzzy Logic Systems Institute, 1992, s. 181-184. ISBN 4-938717-01-8.
[IIZUKA '92. Iizuka (JP), 17.07.1992-22.07.1992]
Pokročilé programování na platformě Java, letní semestr 2012
průchod přes XML dokument element po elementu
na každém elementu něco provést
rychlé, nenáročné na paměť
složitější na použití
Automatic Storage Management (ASM)
stačí už jen vytvořit nový tabulkový
prostor, přiřadit jej uživatelům a pracovat s
databází jako obvykle
CREATE TABLESPACE tspace1;
Do
zoznamenie.sk
Jednoducho, kto mal dostatok alebo prebytok energie, tak ju dodal do centrálneho distribuãného systému. Cieºom je
urobiÈ v˘poãtové systémy verejnou sluÏRie‰enie vyuÏívaním spojenej v˘poãtovej kapac...
sql včera a dnes
|ABSOLUTE|ACTION|ADD|ALL|ALLOCATE|ALTER|AND|ANY|ARE|AS|ASC|ASSERTION|AT|AUTHORIZATION|AVG
|BEGIN|BETWEEN|BIT|BIT_LENGTH|BOTH|BY
|CASCADE|CASCADED|CASE|CAST|CATALOG|CHAR|CHARACTER|CHAR_LENGTH|CHARAC...
Pulsní multifunkční svářečka pro přesné navařování
Navařené místo je považováno za správně provedené tehdy, je-li návar pouze z jedné strany kalené
ocelové planžety (viz pohled na planžetu o tloušťce 1,00mm shora). Současně nesmí být na začátku a
k...
Entitní typ
narozdíl od hierarchického umožňuje více předků pro záznam
(tj. svazové uspořádání), opět lze nahradit XML a objektovými DB
1. datové sklady - metody uskladnění 1) MOLAP
Rozdíl mezi architekturou klient‐server a distribuovanou DB, výhody a nevýhody
Klient‐server – výhody: centralizovaný, menší HW nároky na klienta, jednodušší na
vývoj; nevýhody: delší odezvy od c...
Open Source Programování - Introduction GNU - Real
(např DSP, kde char/int/long/float/double = 32bit)
stdint.h: int32_t, uint32_t, obecně intN_t, uintN_t, (u)int_leastN_t,
(u)int_fastN_t, (u)intmax_t, size_t, ssize_t
Nikdy nepřetypovat ukazatel...
Databázové servery pro nejvy‰‰í nároky a pro zpracování jak
po paralelní architektury. Díky objektov˘m rysÛm je moÏné jádro IDS 9 roz‰ífiit
o dal‰í
funkce a o zpracování
libovoln˘ch dat. V praxi se vyuÏívá
roz‰ífiení o programové moduly
Datablade, které umoÏn...