Embedded SQL v C/C++ úvod

Transkript

Embedded SQL v C/C++ úvod
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

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]

Více

Pokročilé programování na platformě Java, letní semestr 2012

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í

Více

Automatic Storage Management (ASM)

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

Více

zoznamenie.sk

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

Více

sql včera a dnes

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

Více

Pulsní multifunkční svářečka pro přesné navařování

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

Více

Entitní typ

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

Více

1. datové sklady - metody uskladnění 1) MOLAP

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

Více

Open Source Programování - Introduction GNU - Real

Open Source Programování - Introduction GNU - Real (např DSP, kde char/int/long/float/double = 32­bit) 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...

Více

Databázové servery pro nejvy‰‰í nároky a pro zpracování jak

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

Více