Jan Bilak 1
P ehled referátu Úvod Co to je OCI? Výhody a nevýhody Princip a trocha teorie Základy Informace pot ebné pro pochopení nejjednoduššího p íkladu Rozbor jednoduchého p íkladu 2
Úvod 3
Co to je? (dále jen OCI) je aplika ní rozhranní (API), které umož uje vytvá et aplikace v jazycích t etí generace, které komunikují se servery Oracle pomocí volání nativních procedur a funkcí a umož uje ídit všechny fáze provád ní SQL p íkaz. OCI podporuje datové typy, volací konvence, syntaxi i sémantiku mnoha jazyk nap. C, C++, COBOL, Fortran, PHP, Java,... 4
OCI poskytuje Zlepšený výkon a rozši itelnost aplikací, protože efektivn využívá systémovou pam a sí ovou konektivitu Konzistentní rozhranní pro dynamické relace a správu transakcí ve dvouvrstvé (klinet-server) i vícevrstvé architektu e N-vrstvou autentizaci (ov ení) Komplexní podporu vývoje aplikací, které používají objekty Oracle P ístup do externích databází Aplikace mohou obsloužit více uživatel a zpracovat více požadavk bez zvýšených nárok na HW 5
Princip OCI umož uje manipulovat s daty a schematy v Oracle databázi pomocí hostitelského programovacího jazyka (nap. C). OCI je knihovna, která umož uje p ístup do databáze, provád ní standardních operací v DB a získávání informací z DB. OCI se dodává ve form dynamické knihovny, která m že být linkována k aplikaci za chodu. Proto není nutné v aplikacích používat embed SQL i PL/SQL. 6
Princip Zdrojové soubory (nap. v C++) Kompilátor daného jazyka používají se b žné vývojové nástroje, není t eba žádný preprocesing podpora mnoha kompilátor Objektové soubory Knihovny OCI Linker Aplikace Oracle server 7
Výhody V tší možnosti optimalizace a detailn jšího návrhu aplikací Mnoho poskytovaných funkcí Umož ují rozd lit jeden krok v jiných prost edcích do ady díl ích na sebe navazujících Vysoký stupe kontroly b hu aplikace Kostra programu je v programovacím jazyce (nap. C++) a do ní jsou zasazeny volání funkcí OCI Pohodlí pro programátora Pracuje v prost edí, na které je zvyklý Lze užít standardní vývojové a ladící nástroje P ístup k metadat m Oracle serveru Podpora dynamického SQL 8
Výhody Podpora širokého spektra platforem knihovny jsou závislé na platform, ale tém nezávislé na programovacím jazyce Asynchonní zpracování (neblokující) ízení je vráceno z OCI funkce zp t, p i emž dále probíhá zpracování p íkazu je možné se dotázat, zda se p íkaz ješt provádí významné u dlouhotrvajících operací aplikace nevytuhne, ale dále informuje uživatele o stavu provád ní a reaguje na požadavky Podpora LOB a objektových datových typ na serveru Oracle 9
Nevýhody V tší nároky na znalosti programátora Mén p ehledný zdrojový kód Kód je závislý na Oraclu (není jej možné použít s jinými DB servery) 10
Princip P esný postup linkování knihoven OCI záleží na konkrétním systému. Na n kterých platformách je t eba p ilinkovat ješt další knihovny pro úsp šné slinkování aplikace. Podrobné informace k linkování na dané platform lze nalézt v dokumentaci Oracle. 11
ásti OCI OCI lze rozd lit na tyto ásti: API pro tvorbu rozši itelných vícevláknových aplikací, které umožní obsluhovat mnoho uživatel SQL funkce pro p ístup k DB, zpracování SQL p íkaz a manipulaci s objekty získanými z DB serveru Oracle Mapování datových typ a funkce pro manipulaci s atributy datových typ Oracle Funkce pro pln ní databáze daty (bez použití SQL) Funkce pro podporu externích procedur, umož ující zp tná volání z PL/SQL (do C) 12
(Ne)procedurálnost OCI kombinuje procedurální programování v jazycích jako nap. C++ s neprocedurálními ástmi v SQL Tato kombinace je velmi silná Umož uje jednoduchý p ístup k databázi Oracle zprost edí strukturovaného programovacího jazyka OCI podporuje všechny p íkazy SQL pro definici dat (DDL), manipulaci s daty (), dotazy, správu transakcí, které poskytuje server Oracle Je možné využít PL/SQL (procedurálního rozší ení SQL Oraclu) 13
Objekty OCI má nástroje pro práci s objektovými datovými typy a objekty. Objekt má podobu známou z jiných jazyk uživatelský datový typ abstrakce objektu reálného sv ta atributy metody Do OCI byla za azeny (mimo jiné) i: Podpora vykonávání SQL p íkaz pro manipulaci s objekty a schematy Možnost využití odkaz na objekty a instancí objekt jako vstupních prom nných SQL p íkaz i jako návratových hodnot SQL p íkaz Podpora popisu procedur a funkcí PL/SQL, které využívají objekty jako vstupní i návratové hodnoty 14
SQL p íkazy Jedním z hlavních úkol aplikací OCI je vykonávat p íkazy SQL. P íkazy SQL m žeme rozd lit do n kolika skupin, p i emž p íkazy z r zných skupin vyžadují r zný postup zpracování pomocí OCI. DDL (Data Definition Language) Kontrolní p íkazy (Control Statements) Správa transakcí (Transaction Control) Správa relací (Session Control) Správa systému (System Control) DML (Data Manipulation Language) Dotazy (mají odlišné zpracování od DML p íkaz ) PL/SQL Embedded SQL 15
P íkazy DDL DDL p íkazy spravují strukturu databáze Slouží nap. pro vytvá ení tabulek (CREATE TABLE) odstra ování tabulek (DROP TABLE) tvorbu objekt (CREATE TYPE) atd. 16
DML DML (Data Manipulation Language) mají na starost zm nu dat v tabulkách DB, nap. p idání nové ádky do tabulky zm na hodnoty atributu v existující ádce tabulky smazání ádky tabulky zam ení tabulky databáze zjišt ní plánu vykonání SQL p íkazu... DML p íkazy mohou vyžadovat p edání dat pomocí uživatelských (bind) prom nných: INSERT INTO person_tab(name) VALUES (:name) 17
Dotazy P estože vlastn pat í do DML p íkaz, vyžadují jiný postup zpracování v OCI. Všechny p íkazy za ínají slovem SELECT. Dotazy mohou vyžadovat p edání dat pomocí uživatelských (bind) prom nných: SELECT name FROM employees WHERE empno = :empnumber 18
PL/SQL PL/SQL je procedurální rozší ení SQL Oraclu. Zpracovávané úlohy mohou být složit jší, než u jednoduchých dotaz SQL i manipulace s daty pomocí SQL DML p íkaz. Umož uje slou it n kolik konstrukcí, které se pak vykonají jako jeden celek. Mezi tyto konstrukce pat í: Jeden i více SQL p íkaz Deklarace prom nných P i azovací p íkazy Procedurální ídící p íkazy (IF...THEN...ELSE, cykly) Zpracování výjimek 19
PL/SQL Bloky PL/SQL lze užít na: volání uložených procedur a funkcí zkombinování procedurálních ídících p íkaz s n kolika SQL p íkazy tak, že se to vše vykoná jako jeden p íkaz P ístup ke zvláštním možnostem PL/SQL jako nap. záznamy, tabulky, kurzorové cykly FOR, zpracování výjimek použití kurzorových prom nných p ístup a manipulaci s objekty na DB serveru Oracle 20
Embedded SQL OCI zachází s p íkazy SQL jako s textovými et zci, které p edává DB serveru ke zpracování. Oraclovské prekompilery umož ují p ímo za azovat SQL p íkazy do zdrojového kódu. V tom p ípad je ovšem prekompilace nezbytná. Je ovšem možné míchat použití OCI s použitím embedded SQL v jednom zdrojovém kódu, který je nutné potom provést prekompilaci. 21
Handly Všechny datové struktury používané OCI jsou zapouzd eny ve form nepr hledných interfac, kterým íkáme handly. Ukazatel na ást pam ti, která je alokovaná a spravovaná knihovnami OCI Využívají se p i volání v tšiny OCI funkcí jako parametry Uchovávají informace o spojení, session, transakcích, vzniklých chybových stavech apod. 22
Handly Klient si vyvá í (alokuje) handly voláním funkce OCIHandleAlloc(). P istupovat k dat m handlu lze pouze p es speciální funkce OCI, nikoli p ímo. Existuje mnoho typ handl a jsou hierarchicky uspo ádány. Výhody Použití handl umož uje m nit struktury OCI, aniž by bylo nutné m nit kód aplikace. Usnad ují programování starají se o n OCI knihovny. Redukují množství stavových informací na stran serveru ímž se snižuje pam ová náro nost serveru. 23
Autentifikace uživatel OCI poskytuje zjednodušené ov ování uživatel a správu hesel: Umož uje jedné OCI aplikaci ov ovat více uživatel. Umož uje aplikaci zm nit heslo uživatele, což se m že hodit nap. po obdržení zprávy o vypršení platnosti hesla p i pokusu o ov ení uživatele. OCI podporuje dva typy p ihlašovacích relací: Zjednodušenép ihlášení: je p ihlášen jeden uživatel použitím loginu a hesla. Nastavení, kdy je pro jednu aplikaci vytvo eno více login relací a je tedy možné aby aplikace podporovala více sou asn p ihlášených uživatel. 24
Základy použití 25
Základní struktura použití 1. Inicializace programového prost edí a proces OCI 2. Alokace pot ebných handl a datových struktur, navázání spojení se serverem a zahájení uživatelské relace (session) 3. Spušt ní SQL p íkaz (posílání SQL p íkaz serveru a p ípadné zpracování dat) 4. Op tovné spušt ní p ipravených p íkaz nebo p íprava nových a jejich spušt ní 5. Ukon ení uživatelské relace a uzav ení spojení se serverem 6. Uvoln ní nepot ebných handl 26
Paralelní zpracování Vytvo ení prost edí Vytvo ení prost edí Alokace handl a datových struktur P ipojení k serveru a za átek relace Spušt ní SQL p íkaz Alokace handl a datových struktur P ipojení k serveru a za átek relace Spušt ní SQL p íkaz Odpojení Uvoln ní handl a datových struktur Odpojení Uvoln ní handl a datových struktur 27
Hierarchie handl Session handle Direct Path Context Handle Thread Handle COR Handle Subscription Handle Environment handle Describe Handle Statement Handle Service Context Handle Error Handle Server Handle Connection Pool Handle 28
Environment Handle Definuje kontext, ve kterém jsou provád ny všechny ostatní OCI funkce Obsahuje vyrovnávací pam t (cache) Pokud více vláken sdílí jeden Environment handle, p ístupy k vyrovnávací pam ti jsou serializovány ( azeny za sebou). Vlána také mohou blokovat p ístup k vyrovnávací pam ti. Ostatní handly jsou potomci Environment handlu. 29
Error Handle Obsahuje informaci o vzniklých chybách Je parametrem mnoha OCI funkcí Alokace tohoto handlu je jeden z prvních krok aplikace Na vzniklé chyby je možné se dotázat funkcí OCIErrorGet() 30
Service Context Handle Service Context Handly definují atributy, které ur ují pracovní kontext OCI volání serveru. Obsahuje t i handly jako své atributy. Server Handle definuje spojení k databázi. User Session Handle definuje roli uživatele (práva) a pracovní kontext. Trasactional Handle definuje transakci, ve které jsou provád ny SQL p íkazy. Obsahuje stavové informace uživatelské relace. Service Context Handle atributy Server Handle User Session Handle Transaction Handle 31
Service Context Handle P ed použitím Service Context Handlu jej musím inicializovat funkcemi OCIHandleAlloc() nebo OCILogon(). OCILogon() provede jak alokaci, tak inicializaci. OCIHandleAlloc() provede pouze alokaci, inicializaci musíme provést spolu s Server Handlem, User Session Handlem a Transaction Handlem funkcí OCIAttrSet(). Jednoduchá aplikace, která má vždy v jednom okamžiku pouze pouze jednu uživatelskou relaci pro každé databázové spojení, bude typicky používat funkci OCILogon(). 32
Statement Handle Reprezentuje SQL nebo PL/SQL p íkaz a jeho p idružené vlastnosti Informace o vstupech a výstupech jsou uloženy v Bind Handlu OCI knihovna alokuje Bind Handle pro každou vstupní prom nnou definovanou funkcemi OCIBindByName() or OCIBindByPos(), proto uživatel Bind Handle nemusí alokovat. Statement Handle Define Handle Bind Handle 33
Statement Handle Data vrácená p íkazem SELECT jsou zkonvertována podle požadavk v Define Handlu. OCI alokuje Define Handle pro každou výstupní prom nnou definovanou funkcí OCIDefineByPos(). Uživatel se tedy op t nemusí o alokaci Define Handl starat. Bind i Define Handle jsou uvoln né, pokud je uvoln ný Statement Handle nebo je p ipraven nový p íkaz na dané, Statement Handlu 34
Ukázkový p íklad (OCI 8) 35
Knihovny /* standardní C knihovny */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* OCI knihovna */ #include <oci.h> /* umíst ní knihovny */ #pragma comment(lib, "d:\\orant\\oci80\\lib\\msvc\\ora803.lib" ) 36
Deklarace handl /* deklarace jednotlivých handl */ static OCIEnv *p_env; /* Environment */ static OCIError *p_err; /* Error */ static OCISvcCtx *p_svc; /* Service Context */ static OCIStmt *p_sql; /* Statement */ static OCIDefine *p_dfn /* Define */ = (OCIDefine *) 0; static OCIBind *p_bnd /* Bind */ = (OCIBind *) 0; 37
main() a prom nné void main() { /* deklarace prom nných */ int p_bvi; /* hodnota parametru */ char p_sli[20]; /* buffer pro výstupní hodnotu dotazu*/ int rc; /* návratový kód */ char errbuf[100]; /* buffer pro text chyby*/ int errcode; /* íslo chyby */ 38
Ïnicializace OCI /* Inicializace OCI */ rc = OCIInitialize( (ub4) OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *)) 0 ); /* Parametry lze ovlivnit r zné nastavení, nap. zajistit schopnost pracovat korektn ve více vláknech, zajistit používání vlastních funkcí pro správu pam ti,...*/ 39
Inicializace prost edí /* Inicializace prost edí */ rc = OCIEnvInit( (OCIEnv **) &p_env, OCI_DEFAULT, (size_t) 0, (dvoid **) 0 ); 40
Error Handle /* Inicializace Error Handlu */ rc = OCIHandleAlloc( (dvoid *) p_env, /* Env. Handle */ (dvoid **) &p_err, /* alokovaný handle (OUT) */ OCI_HTYPE_ERROR, /* typ alokovaného handlu */ (size_t) 0, (dvoid **) 0); 41
Service Context Handle /* Inicializace Service Context Handlu */ rc = OCIHandleAlloc( (dvoid *) p_env, /* Env. Handle */ (dvoid **) &p_svc, /* alokovaný handle (OUT) */ OCI_HTYPE_SVCCTX, /* typ alokovaného handlu */ (size_t) 0, (dvoid **) 0); 42
P ihlášení /* P ipojení k serveru inicializace Service Context Handlu*/ rc = OCILogon( p_env, /* Environment Handle */ p_err, /* Error Handle */ &p_svc, /* Server Context Handle */ "scott", /* Login name */ 5, /* a jeho délka */ "tiger", /* Heslo */ 5, /* a jeho délka */ "d458_nat", /* Jméno databáze */ 8); /* a jeho délka */ 43
Ošet ení chyb /* Ošet ení chyb */ if (rc!= 0) { OCIErrorGet( (dvoid *)p_err, /* Error Handle */ (ub4) 1, /* íslo zánzamu s chybou */ (text *) NULL, /* již nepodporováno */ &errcode, /* vrácené íslo chyby */ errbuf, /* buffer pro text chyby */ (ub4) sizeof(errbuf), /* a jeho velikost */ OCI_HTYPE_ERROR); /* typ handlu (také m že být OCI_HTYPE_ENV) */ printf("error - %.*s\n", 512, errbuf); exit(8); } 44
Statement Handle /* Alokace Statement Handlu */ rc = OCIHandleAlloc( (dvoid *) p_env, /* Env. Handle */ (dvoid **) &p_sql, /* alokovaný handle (OUT) */ OCI_HTYPE_STMT, /* typ alokovaného handlu */ (size_t) 0, (dvoid **) 0); 45
P íprava SQL dotazu /* P íprava SQL p íkazu (Statement Handlu) */ rc = OCIStmtPrepare( p_sql, /* Statement Handle */ p_err, /* Error Handle */ "select ename from emp where deptno=:x", /* SQL p íkaz */ (ub4) 37, /* a jeho délka */ (ub4) OCI_NTV_SYNTAX, /* verzi syntaxe dle verze serveru */ (ub4) OCI_DEFAULT); /* možnost sdíleného módu nebo defaultního */ 46
Vstupní prom nné dotazu /* Svázání hodnot s p íslušnými Bind prom nnými */ p_bvi = 10; /* DEPTNO = 10 */ rc = OCIBindByName( p_sql, /* Statement Handle */ &p_bnd, /* Bind Handle (OUT) */ p_err, /* Error Handle */ (text *) ":x", /* jméno prom nné */ -1, /* délka jména prom nné */ (dvoid *) &p_bvi, /* pointer na prom nnou s hodnotou */ sizeof(int), /* velikost hodnoty prom nné */ SQLT_INT, /* typ hodnoty prom nné */ (dvoid *) 0, (ub2 *) 0, (pro práci s poli) (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT); /* p ebere nastavení od Statement Handlu (nap. kódování) */ 47
Výstupní prom nné dotazu /* Definování výstupní prom nné (ename) */ rc = OCIDefineByPos( p_sql, /* Statement Handle */ &p_dfn, /* Define Handle */ p_err, /* Error Handle */ 1, /* pozice výstupní prom nné v SQL p íkazu */ (dvoid *) &p_sli, /* výstupní buffer */ (sword) 20, /* a jeho velikost */ SQLT_STR, /* typ výstupní prom nné */ (dvoid *) 0, (ub2 *)0, (pro práci s poli) (ub2 *)0, OCI_DEFAULT); /* mód (lze i dynamicky alokovat p i provád ní fetch */ 48
Vykonání p íkazu /* Vykonání p íkazu */ rc = OCIStmtExecute( p_svc, /* Service Context Handle */ p_sql, /* Statement Handle */ p_err, /* Error Handle */ (ub4) 1, /* pro neselect p íkazy po et opakování */ (ub4) 0, /* (pro práci s poli) */ (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT); /* mód (OCI_COMMIT_ON_ SUCCESS, OCI_PARSE_ONLY */ 49
P enesení dat (fetch) /* P enesení zbývajících dat (fetch) */ while (rc!= OCI_NO_DATA) { /* podmínka */ printf("%s\n", p_sli); /* zobrazení */ rc = OCIStmtFetch( /* fetch */ p_sql, /* Statement Handle */ p_err, /* Error Handle */ 1, /* po et ádek k na tení */ 0, 0); } 50
Odpojení a úklid /* Odpojení a úklid */ rc = OCILogoff(p_svc, p_err); } rc = OCIHandleFree( (dvoid *) p_sql, OCI_HTYPE_STMT); rc = OCIHandleFree( (dvoid *) p_svc, OCI_HTYPE_SVCCTX); rc = OCIHandleFree( (dvoid *) p_err, OCI_HTYPE_ERROR); return; 51
The End 52