330 likes | 561 Views
Baze podataka i razvoj aplikacija. Prof. dr MILORAD K. BANJANIN Univerzitet u Istočnom Sarajevu Tehnološki fakultet Zvornik. Na srednjem sloju se nalaze i softverske komponente izgrađene korišćenjem EJB (J2EE), BC4J (Oracle), COM (DNA Microsoft) ili .NET (Microsoft).
E N D
Baze podataka i razvoj aplikacija Prof. dr MILORAD K. BANJANIN Univerzitet u Istočnom Sarajevu Tehnološki fakultet Zvornik
Na srednjem sloju se nalaze i softverske komponente izgrađene korišćenjem EJB (J2EE), BC4J (Oracle), COM (DNA Microsoft) ili .NET (Microsoft) Instalirane su specijalne komponente (moduli) koji omogućavaju izvršavanje programskog koda pisanog u nekom script jeziku ili čak izvršnih programa Omogućavaju da deo poslovne logike bude smešten u bazi podataka Potpuno se odvaja poslovna od prezentacione logike Troslojna arhitektura - korišćenje Web tehnologija – Web brauzer (“tanki” klijent) i Web server komuniciraju putem HTTP-a Dvoslojna arhitektura – prezentacioni i sloj poslovne logike objedinjeni u desktop aplikaciji – “debeli” klijent Klijentska aplikacija korišćenjem SOAP protokola poziva vidljive operacije Web servisa i predaje parametre u XML formatu – pozvana metoda Web servisa poziva fnkcije za pristup bazi podataka i inicira izvršenje zahtevane SQL naredbe 4 varijanta 3 varijanta 2 varijanta 1 varijanta Arhitektura softverskog sistema koji koristi bazu podataka Desktop aplikacija HTML klijent Neophodno je omogućiti razvoj složenih programskih sistema koji koriste bazu podataka HTTP relacioni sistem za upravljanje bazom podataka interpretira SQL upit i daje odgovarajući tabelarni rezultat Web server ASP JSP Servlet Web servis HTML/DHTML/XML RMI-IIOP DCOM Aplikacioni server EJB .NET BC4J COM Baza podataka Procedure baze podataka
U njoj su implementirane određene poslovne funkcije, a svaka aplikacija koja koristi bazu podataka sadrži specificirane sekvence operacijanad bazom podataka korišćenjem SQL-a Dva osnovna načina preko kojih se korišćenjem SQL upita ili pozivom procedure baze podataka može pristupiti bazi podataka Prihvata SQL naredbe i određuje gde će te naredbe biti obrađene, izprocesirane Služu za komunikaciju sa aplikacijom korišćenjem interfejsa koji prihvata SQL Prihvata i obrađuje SQL naredbe i izvršava (fizički) operacije nad perzistentnim podacima Opšti način komunikacije programskih sistema sa bazom podataka Aplikacija SQL ili poziv procedure SQL ili poziv procedure SQL-klijent Embedded SQL Call Level Interface SUBP interfejsi SUBP interfejsi SQL-klijent servisi Lokalni pristup Udaljeni pristup SQL-server Procesor baze podataka Baza podataka SUBP
Kombinovanjem naredbi jezika treće generacije i SQL-a omogućava, sa jedne strane korišćenje proceduralnih karakteristika jezika treće generacije (sekvenca, selekcija, iteracija, procedura, podprograma), a sa druge strane pristup podacima u bazi podataka pomoću SQL-a SQL unutar klasičnih i objektnih programskih jezika (Embedded SQL) SQL je homogeno relacioni jezik, jezik koji se može koristiti i za interaktivnu komunikaciju korisnika sa BP i unutar klasičnih i objektnih programskih jezika (C, Fortran, Pascal, Java, ...), za razvoj aplikativnih programa naredbe programskog jezika koje se koriste, “jezika domaćina”, i SQL naredbe su “pomešane” Osnovni koncepti će biti objašnjeni na programskom jeziku C, ali se u potpunosti sve odnosi i na ostale konvencionalne i objektne jezike Primeri će biti ilustrovani na relacionom modelu: Racun (BrojRacuna, Datum, NazivKupca, Napomena, Ukupan iznos) StavkaRacuna (BrojRacuna, RbStavke, SifraProizvoda, Kolicina, JedinicnaCena, ProcenatPoreza, IznosPoreza) Proizvod (SifraProizvoda, NazivProizvoda, JedinicaMere, ProdajnaCena)
Vrši i proveru sintakse za SQL naredbe, proveru tipova u odnosu na bazu da bi se osigurala kompatibilnost podataka koji se razmenjuju između jezika domaćina i SQL-a Kao rezultat se dobija kod u izvornom programskom jeziku koji se kompajlira i linkuje sa SQL bibliotekom sadrži implementaciju pozvanih funkcija Iz aplikacionog programa “izvlači” SQL naredbe i prevodi u pozive funkcija Istovremenu obradu podataka u bazi podataka i podataka u datotekama operativnog sistema Korišćenje rekurzivnih podprograma, najčešće za obradu hijerarhijskih ili mrežnih struktura podataka Korišćenje dinamičkog SQL-a – SQL naredbe se definišu u vreme izvršavanja programa, a ne u vreme prevođenja Korišćenje DDL naredbi za kreiranje i izmenu objekata baze podataka x x x x Programi pisani pomoću ugrađenog SQL-a omogućavaju: Procesiranje aplikacionog programa sa SQL-om unutar programskih jezika Jezik domaćin + SQL naredbe Pretprocesor Jezik domaćin + Poziv funkcija Prevodilac jezika domaćina Izvršni program (aplikacija) Sintaksna i semantička provera SQL biblioteka funkcija Baza podataka
U SQL naredbama indikator promenljiva se koristi tako što se odmah iza naziva HOST promenljive navodi : i naziv indikator promenljive Definišu se sve HOST promenljive koje se koriste u programu preko naredbi jezika domaćina, čime se obezbeđuje komunikacija aplikacionog programa sa bazom podataka Sadrži deklaraciju specijalonih sistemskih promenljivih (SQL Communicaton Area) preko kojih se u program prenose statusi izvršenja pojedinih SQL naredbi nad BP U okviru jezika domaćina ove promenljive se koriste na standardan način, dok se u SQL naredbama koriste sa prefiksom : (dvotačka). Svaka HOST promenljiva koja može da dobije nula vrednost mora imati svoju indikator promenljivu SQLnaredbe se koriste u Deklarativnom delu programa Proceduralnom delu programa Deklaracija HOST promenljivih vrši se u sekciji deklaracije: EXEC SQL BEGIN DECLARE SECTION; int hBroj, hRb, hSifra, hIndikator; VARCHAR hNaziv[50]; float hKol, hStopa; float hIznPor, hIzn, hCena; EXEC SQL END DECLARE SECTION; U slučajevima kada je rezultat upita SELECT ... FROM ... WHERE ... samo jedna n-torka, naredba SELECT se proširuje sa klauzulom INTOkoja omogućava smeštanje rezultata upita u HOST promenljive EXEC SQL SELECT ProdajnaCenaINTO :hCena FROM Proizvod WHERE sifraProizvoda = :hSifra; Ukoliko program treba da radi sa nula vrednostima mora se koristiti “indikator” promenljive hIndikator = -1; EXEC SQL UPDATE Racun SET ukupanIznos = :hIzn:hIndikator WHERE sifraProizvoda = :hSifra;
Neophodno je definisati jedan specijalni “bafer” koji se naziva kursor, u koga se smeštaju rezultati takvog upita i iz koga je moguće preuzimati n-torku po n-torku, kako to jezik domaćin zahteva zatvara kursor koji se kasnije može opet otvoriti, radi izvršavanja istog upita sa novim tekućim vrednostima programskih promenljivih pomera kursor koji je “otvoren” za jedno mesto unapred i pridružuje vrednost atributa promenljivim programa kursor ima i ulogu pokazivača i posle OPEN naredbe pokazuje na položaj ispred prve n-torke u “baferu” “aktivira” kursor – izvršava upit preko koga je kursor definisan i smešta rezultat u odgovarajući “bafer” Osnovni problem u usaglašavanju jezika domaćina sa SQL-om je u tome što SQL operiše nad tabelama, a jezik domaćin nad rekordima (vrstama tabela) SQLnaredbe se koriste u Deklarativnom delu programa Proceduralnom delu programa EXEC SQL DECLARE <ime-kursora>CURSOR FOR<selectNaredba> PRIMER EXEC SQL DECLARE cSt CURSOR FOR SELECT RbStavke, Kolicina, ProcenatPoreza, IznosPoreza FROM StavkaRacun WHERE brojRacuna = :hBroj; Deklaracija kursora nije izvršna naredba, mada se pojavljuje u proceduralnom delu programa. Izvršne operacije nad kursorom su: EXEC SQL OPEN<ime-kursora> EXEC SQL FETCH <ime-kursora> INTO <ime-programske-prom> EXEC SQL CLOSE <ime-kursora>
daje sledeću ili prethodnu n-torku u odnosu na tekuću poziciju kursora pozicioniranje na prvu odnosno poslednju n-torku iz kursora iza njega sledi ceo broj, pomera za dati broj poziciju u kursoru iza njega sledi ceo broj koji definiše redni broj n-torke u kursoru da li se podacima može pristupati samo od prvog ka poslednjem ili i na drugi način (scrollable cursor) da li se isti kursor mora zatvoriti pre nego što se ponovo otvori (reopenable cursor) x x PRIMER EXEC SQL OPENcSt; while (1) ( EXEC SQL FETCH c INTO :hRb, : hKol, : hStopa, :hIznPor; if (SQLCODE == 100) { // nema više vrednosti u kursoru break; } ) EXEC SQL CLOSE cst; U različitim implementacijama SQL-a kursori se razlikuju po sledećim osobinama Ukoliko se kursordefiniše sa opcijom SCROLL pre ključne reči CURSOR onda se omogućava i nekoliko opcija za pristup željenon n-torki: NEXT ili PRIOR, FIRST ili LAST, RELATIVE i ABSOLUTE
U slučaju ažuriranja neophodno je dasve HOST promenljive koje učestvuju u SQL naredbama imaju definisanu vrednost pre izvršenja SQL naredbe U SUBP Oracle je neophodno proširiti definiciju kursora sa dodatnom klauzulom [FOR UPDATE OF] koja omogućava ažuriranje redova tabele koji odgovaraju tekućem redu kursora Ispitivanje vrednosti promenljive SQLCODE (u SQL:1999 = SQLSTATE) koje je neophodno posle svake SQL naredbe – omogućava korišćenje standardnih modula za obradu greške koji obezbeđuju i prekid i nastavak rada Korišćenje klauzule WHENEVER – deklarativna naredba koja je nedovoljno strukturirana zbog izbora akcija nakon ispunjenja nekog uslova 1 2 Ažuriranje baze podataka Standardne SQL naredbe INSERT UPDATE INSERT Kursor Mora biti definisan nad jednom baznom tabelom ili jednim pogledom hBroj = 10; strcopy (hNaziv, “Milorad”); EXEC SQL INSERT INTO RACUN (BrojRacuna, Datum, NazivKupca) VALUES (:hBroj, CURRENT_DATE, :hNaziv); Pojava greške pri izvršavanju SQL naredbi ne dovodi do prekida izvršavanja programa Neophodno je u svakom programu na odgovarajući naćin obrađivati greške, a postoje dva načina za to Akcije su: CONTINUE, STOP ili GOTO
Omogućava potpuno uopštavanje, odnosno razvoj programa kao što je modul za interaktivno korišćenje SQL naredbi – u praksi retko potrebno, a pisanje veoma složeno Tekst SQL naredbe se smešta u promenljivu, a zatim se korišćenjem SQL naredbe PREPARE prvo parsira, pa EXECUTE traži izvršenje Tekst SQL naredbe se smešta u promenljivu, a zatim se korišćenjem SQL naredbe EXECUTE IMMEDIATE (naredba se prvo parsira pa izvršava) traži izvršenje naredbe Koristi se za SELECT naredbe sa fiksnim brojem parametara. Tekst SQL naredbe se smešta u promenljivu, a zatim se korišćenjem SQL naredbe PREPARE parsira SQL naredba, pa se koriste naredbe za deklarisanje i manipulaciju kursorom Bilo koja SQL naredba koja omogućava korišćenje promenljivog i broja i tipova HOST promenljivih SQL naredba je SELECT naredba i uključuje fiksan broj i poznate tipove HOST promenljivih SQL naredba nije SELECT naredba i uključuje fiksan broj i poznate tipove HOST promenljivih SQL naredba nije SELECT naredba i ne uključuje HOST promenljive 1 3 4 2 Dinamički SQL omogućava pisanje programa u kome SQL naredba nije poznata sve do vremena izvršavanja programa Umesto da se SQL naredba napiše eksplicitno u programu, tekst SQL naredbe se pamti kao vrednost neke promenljive, a zatim se traži izvršavanje naredbe koja je sadržana u promenljivoj Proces formiranja i izvršavanja dinamičkih SQL naredbi se sastoji od: formiranja teksta SQL naredbe na osnovu ulaznih podataka pripremanja naredbe za izvršavanje, odnosno vrši se procesiranje naredbe povezivanja HOST promenljive sa parametrima SQL naredbe izvršavanja SQL naredbe Postoje četiri različita načina za izvršavanje dinamičke SQL naredbe:
SQLJ predstavlja deo SQL:1999 standarda koji definiše način umetanja SQL naredbi u okviru objektnog programskog jezika Java I u ovom slučaju su SQL naredbe podeljene na deklarativne i izvršne, s tim što SQL naredbe počinju sa #sql Ne postoji posebna deklaracija promenljivih koje će se koristiti u SQL naredbi što znači da se može koristiti bilo koja Java promenljiva Promenljive se takođe koriste sa : (dvotačkom) ispred njihovog imena PRIMER #sql {SELECT prodajnaCena, nazivProizvoda INTO :hCena, :hNaziv FROM Proizvod WHERE sifraProizvoda = :hSifra }; Prilikom rada sa HOST promenljivim treba uzeti u obzir da osnovni Java tipovi (int, double, float, ...) ne mogu imati nula vrednost – prilikom prihvatanja podataka iz baze SQL nula vrednosti bivaju konvertovane u Java nula vrednosti
Prihvata rezultate upita i omogućuje mehanizam navigacije kroz dobijene n-torke Koncept sličan kursoru Imenovani iterator – za njega se specificira ime i tip kolone Pozicioni iterator – za njega se specificira samo tip kolone 1 2 Objekat klase ITERATOR Koristi se ukoliko SELECT naredba vraća veći broj n-torki // deklaracija imenovanog iteratora #sql iterator StavkaIter { int rb, float kolicina, int proizvod}; // deklaracija pozicionog iteratora #sql iterator StavkaIter { int, float, int }; Za navigaciju kroz iterator se koristi metoda next()koja vraća FALSE ako je kraj iteratora, a za zatvaranje iteratora se koristi metoda close(), dok imenovani iteratori imaju metode za pristup podacima koje se zovu kao i kolone Kod pozicionih iteratora podaci se moraju direktno smeštati u Java host promenljive pomoću FETCH...INTO naredbe, a host promenljive moraju biti u odgovarajućem broju i redosledu tipa deklarisanog u pozicionom kursoru
API za pristup različitim, heterogenim bazama podataka bez izmene izvornog programskog koda Daje biblioteku funkcija preko kojih se klijent povezuje sa bazom podataka i pristupa podacima sa SQL upitom Standardi za komunikaciju programskih jezika i baze podataka SQL Call-Level Interface je aplikacioni programski interfejs (API) za SQL pristup bazama podataka iz programskih jezika Pristup bazama podataka preko poziva funkcija Do sadasubaze podataka bile korišćene iz programskih jezika “međanjem” naredbi programskog jezika i upitnog jezika Druga mogućnost je korišćenje funkcija preko kojih se SUBP-u prosleđuje tekst upita koji on izvršava i vraća programu odgovarajući rezultat SQL/CLI ODBC, JDBC, ADO, ADO.NET ODBC - Open DataBase Connectivity Biblioteka standardizovanih funkcija (imaju ime, ulazne i izlazne argumente) koje su na raspolaganju programeru da iz programskog koda pristupa bazama podataka
ODBC arhitektura Aplikacija ODBC interfejs ODBC Driver Manager SQL Server ODBC Driver ORACLE ODBC Driver ... ODBC Driver Osnovne funkcije ODBC biblioteke biće objašnjene korišćenjem programskog jezika C na sledećim relacionim modelom< SQL Server ORACLE ... Racun (BrojRacuna, Datum, NazivKupca, Napomena, Ukupan iznos) StavkaRacuna (BrojRacuna, RbStavke, SifraProizvoda, Kolicina, JedinicnaCena, ProcenatPoreza, IznosPoreza) Proizvod (SifraProizvoda, NazivProizvoda, JedinicaMere, ProdajnaCena) Da bi se funkcije ODBC biblioteke mogle koristiti u programu, na početku je potrebno priključiti neophodne header datotekeu kojima se nalaze definicije funkcija, tipova podataka, struktura i konstanti
Environment (okruženje) – struktura koja čuva globalne informacije o ODBC okruženju, npr. lista otvorenih konekcija i trenutno aktivna konekcija Connection (konekcija) – struktura koja sadrži podatke o konekciji, npr. naziv baze podataka, korisničko ime, status transakcije, ... N-torke i parametri – strukture čuvaju informacije bilo o parametrima upita bilo o n-torkama rezultata Statement (naredba) – struktura koja sadrži jednu SQL naredbu 3 1 2 4 #include <sql.h> #include <sqlext.h> #include <sqltypes.h> #include <odbcss.h> Priključivanje tih header datoteka obezbeđuje kreiranje i manipulaciju sa sledećim vrstama rekorda (struktura u C-u) U programu su te strukture reprezentovanepreko pokazivača na njih, koji se zovu handle SQLHENV henv = SQL_NULL_HENV; SQLHDBC CON = SQL_NULL_HDBP; SQLHSTMT stmt = SQL_NULL_HSTMT;
Inicijalizacija pokazivača na strukturu koja predstavlja ODBC okruženje je uvek prvi korak u aplikaciji Bez tog alociranja memorijskog prostora nije moguće koristiti ni jednu funkciju ODBC biblioteke, međutim trebalo bi alocirati jedan i samo jedan handlena ODBC okruženje Alociranje memorijskog prostora vrši se pozivom funkcije SQLAllocHandle(), čiji je argument vrsta pokazivača – ona vraća vrednost tipa SQLRETURN (integer) Funkcija SQLSetEnvAttr() se koristi za postavljanje vrednosti nekih atributa u strukturi ODBC okruženja Za konektovanje na bazu podataka se koristi funkcija SQLConnect() Da bi se pozvala funkcija za izvršenje neke SQL naredbe neophodno je prvo inicijalizovati pokazivač na strukturu koja predstavlja SQL naredbu i time rezervisati potreban memorijski prostor za podatke o naredbi • // alociranje memorijskog prostora za naredbu • retcode = SQLAllocHandle (SQL_HANDLE_STMT, con, &stmt)
Poziv funkcije SQLPrepare() gde se kao argument prosleđuje SQL naredba – po pravilu SQL naredba sadrži markere za parametre označene sa ? Poziv funkcije SQLBindParameter() kojom se postavljaju vrednosti parametara ukoliko naredba sadrži markere parametara – argumenti su handle na naredbu, pozicija parametra u naredbi, tip parametra, tip podatka parametra u pregramu, tip podatka polja u tabeli i vrednost parametra Poziv funkcije SQLExecute() za izvršenje SQL naredbe Poziv funkcije SQLBindParameter() kojom se postavljaju vrednosti parametara ukoliko naredba sadrži markere parametara Poziv funkcije SQLExecDirect() gde se kao argument prosleđuje SQL naredba 3 1 2 1 2 Načini specificiranja i izvršenja SQL naredbe Pripremljeno izvršenje (prepared execution) Direktno izvršenje (direct execution) U slučajevima kada se koristi SELECT naredba kao rezultat izvršenja se dobija kolekcija n-torki koje zadovoljavaju zadati uslov pretraživanja, a ta kolekcija se smešta u poseban memorijski prostor (bafer)
ODBC omogućava i standardni način za pozivanje procedura baza podataka – preko funkcije SQLExecDirect(), gde se ? Koristi kao marker parametra procedure Sintaksa za poziv procedure je: • {[ ? = ] call procedure_name [ (?, ?, ...) ]} Za izlazne parametre mora se postaviti marker parametra u pozivu procedure, a pozivom funkcije SQLBindParameter() vezati programska promenljiva za izlazni parametar procedure baze podataka PRIMER Poziv procedure baze podataka koja vraća generisan broj računa posle ubacivanja nove n-torke u tabelu Racun • retcode = SQLBindParameter (stmt, 1, SQL_PARAM_OUTPUT, SQL_C_LONG, SQL_LONG, 0, 0, brojRacuna, 0, NULL); • retcode = SQLExecDirect (stmt, “ { ?=call DodajRacun (?, ’08.12.2008.’, ‘Milorad’, 347.80 ) } ”, SQL_NTS);
Ažuriranje tabele baze podatakamoguće je izvršiti korišćenjem podataka iz “tekućeg” reda imenovanog kursora definisanog nad tabelom koja se ažurira Tekući kursor definiše n-torku koja se izbacuje ili menja iskazom CURRENT OF u WHERE klauzuli – naziv kursora može se postaviti iz same aplikacije pozivom funkcije SQLSetCursorName(), a može i da ga ODBC driver automatski dodeli i tada se iščitava korišćenjem funkcije SQLGetCursorName() Sintaksa SQL naredbe za izmenu vrednosti u n-torci je: • UPDATE naziv-tabele • SET identifikator-kolone = { izraz | NULL } • [, identifikator-kolone = { izraz | NULL }] ... • WHERE CURRENT OF naziv-kursora Sintaksa SQL naredbe za izbacivanje n-torke je: • DELETE FROM naziv-tabele WHERE CURRENT OF naziv-kursora
Zaupravljanje transakcijamaje odgovoran programer Ako se pozove funkcija za izvršenje SQL naredbe a ne postoji otvorena transakcija, ODBC driver automatski započinje novu transakciju Transakcija ostaje otvorena sve dok se ne potvrdi ili poništi eksplicitnim pozivom ODBC funkcije SQLTransact(), gde je vrednost njenog parametra COMMIT ili ROLLBACK Na kraju svakog programa koji koristi ODBC biblioteku funkcija trebalo bi osloboditi sve memorijske resurse alocirane za ODBC okruženje i konekcije – funkcije SQLDisconnect() i SQLFreeHandle() • // Oslobadjane zauzetog prostora • SQLDisconnect(con); • SQLFreeHandle(SQL_HANDLE_DBC, con); • SQLFreeHandle(SQL_HANDLE_ENV, henv);
Prevodi JDBC pozive u specifične pozive funkcija definisane od proizvođača SUBP-a kao što su SQL Server, Oracle ili Sysbase – na svakoj klijentskoj mašini mora se učitati biblioteka funkcija specifičnog SUBP-a, a ne može da se koristi za Web aplikacije Omogućava Java aplikacijama, apletima i servletima pristup bazama podataka kao i drugim tabelarnim izvorima podataka Konvertuje JDBC pozive u specifičan SUBP protokol tako da klijentska aplikacija može da komunicira direktno sa bazom podataka – nije potreban specifičan softver (dinamička instalacija) Prevodi sve JDBC pozive u ODBC pozive i prosleđuje ih ODBC drajveru – ODBC drajver je najčešće prisutan na klijentskoj strani pa je pristup bazi na strani klijenta Omogućava troslojnu arhitekturu sistema jer JDBC pozive prosleđuje na srednji sloj – server na srednjem sloju prevodi zahteve klijenata u pozive funkcija baze podataka Posrednik između Java programa i drajvera (uslužni programi između Java programa i konkretnih SUBP-ova) Definiše standardni pritup Java programa bazi podataka JDBC – Java DataBase Connectivity Standardni Java interfejs za povezivanje Jave sa relacionim bazama podataka definisan od strane Sun Microsystems JDBC arhitektura Java aplikacija JDBC API JDBC Driver Manager JDBC-Net driver JDBC-ODBC Bridge driver Nativ-API driver (party-Java) Nativ-protocol driver Alternative implementacije JDBC drajvera ODBC drivers JDBC Middleware Protocol Odgovarajući SUBP protokoli
Metodom executeQuery(Q), gde se kao argument zahteva tekst naredbe Q, se “traži” izvršenje SQL naredbe Metoda executeUpdate(Q), kao argument se zahteva tekst naredbe Q, ne vraća rezultat Koncepti koji se koriste u Java programima za pristup bazi podataka su slični ODBC-u, s tom razlikom što je JDBC objektno orijentisan Neophodan je korak učitavanja drajvera za bazu podataka koja se koristi, koji može biti instalaciono i implementaciono zavisan Na taj način se kreira objekat DriverManager, što je analogno kreiranju okruženja u prvom koraku korišćenja ODBC-a Metoda getConnection() klase DriverManager se koristi za uspostavljanje konekcija sa bazom podataka i zahteva kao argument URL kojom se identifikuje baza podataka, korisničko ime i lozinka – kreira se objekat tipa Connection što je analogno ODBC konekciji Za kreiranje SQL naredbe se koristi metoda createStatement()objekta tipa Connection – kreira se objekat tipa Statement SQL naredbe koje se koriste u programima se mogu podeliti na upite i naredbe ažuriranja
i – rednibroj pojavljivanja parametra u naredbi v – vrednost parametra koji po tipu odgovara pozvanoj metodi Za kreiranje parametrizovane naredbese koristi metoda preparedStatement(Q) koja kao argument ima tekst naredbe Q Parametri se definišu u tekstu SQL naredbe preko znaka pitanja koji čuvaju mesto za odgovarajuće argumente u trenutku izvršavanja naredbe Nakon kreiranja odgovarajućeg objekta a pre izvršenja naredbe potrebno je dodeliti vrednosti odgovarajućim parametrima pomoću metode set<SQLTIP>(i,v) Izvršavanje naredbe je omogućeno preko metoda executeUpdate() i executeQuery() JDBC omogućava i standardni način za pozivanje procedura baza podataka Korišćenjem objekta tipa CallableStatement, čije je kreiranje omogućeno preko metode prepareCall Znak pitanja se koristi kao oznaka za parametre procedure, a ukoliko procedura vraća vrednosti tada ih je neophodno registrovati pre poziva korišćenjem metode registerOutParameter
Potrebno je prilikom kreiranja naredbe postaviti odgovarajuće vrednosti parametara, tj. omogućiti navigaciju kroz rezultujući set i njegovo ažuriranje Da bi se izmene prenele u bazu podataka za postojeće n-torke u rezultujućem setu koriste se metode updateRow() i deleteRow() Za izmenu polja tekuće n-torke u rezultujućem setu koriste se metode update<SQLTip>(i,v) Moraju se eksplicitno definisati naredbe za kontrolu transakcija commit i rollback Objekat tipa ResultSet je moguće koristiti i za ažuriranje tabele baze podataka Moguće je dodati novi red ili obrisati postojeći, izmeniti polja u nekoj n-torki Za kreiranje nove n-torke u rezultujućem setu potrebno je izvršiti pozicioniranje na novu n-torku a nakon popunjavanja polja preneti podatke u bazu podataka pozivom metode insertRow() Upravljanje transakcijama– za transakciju je odgovoran korisnik U opštem slučaju Connection objekat ima postavljenu auto-commit opciju kojom se svaka SQL naredba definiše kao transakcija, a uključuje implicitan commit i rollback Menjanje difolt karakteristika, tj. uključivanje transakcija se vrši nad Connection objektom i to preko metodasetTransactionIsolation i setAutoCommit
Specifičan servis nižeg nivoa za pristup konkretnom sistemu za upravljanje bazom podataka ili nekom drugom izvoru podataka Osobine: lakoća korišćenja, velika brzina pristupa, malo zauzeće memorije. Connection – jedinstvena sesija ka izvoru podataka, nad njim se može pozvati metoda Execute() koja direktno izvršava SQL naredbu Command – služi za pripremanje i izvršavanje SQL naredbe koja može biti parametrizovana, poseduje kolekciju Parameterskoja sadrži jedan ili više parametara koji su objekti klase Parameter Recordset – sadrži rezultate SELECT upita nad bazom podataka i omogućava manipulaciju sa podacima redova iz rezultata x x x ADO – (Microsoft) ActiveX Data Objects Omogućava klijentskim aplikacijama pristup i manipulaciju sa podacima iz baza podataka preko odgovarajućeg OLEDB provider-a Osnovni objekti ADO komponente:
Vrši i dodavanje, izmenu i brisanje n-torki u bazi podataka – na osnovu atributa InsertCommand, UpdateCommand i DeleteCommand Omogućuje pristup izvorima podataka za klijentsku aplikaciju u .NET okruženju Pristup određenom izvoru podataka, prosleđivanje upita do baze podataka i prebacivanje rezultata upita u DataSet – korišćenjem atributa SelectCommand Uspostavljanje i održavanje veza između DataTable Serijalizovanje, transformisanje u XML format DataSet-a – omogućva se prikaz u bilo kom brauzeru i prenos preko Interneta korišćenjem HTTP-a Rezultat nekog upita Dizajniran za korišćenje u intranet i Internet aplikacijama, dok se ADO koristi u Windows aplikacijama koje komuniciraju preko DCOM Radikalno izmenjena tehnologija pristupa bazama podataka u poređenju sa ADO ADO.NET Javlja se sa pojavom novog razvojnog okruženja .NET, kao njegov sastavni deo ADO.NET arhitektura Connection Data relations XML Dokument Command Data tables Data tables Data tables DataAdapter .NET Provider DataSet DMBS Client .NET Managed Code
Mogu ali ne moraju imati parametre, gde vrsta parametra može biti IN, OUT i INOUT, a tip parametra može biti neki od definisanih SQL tipova: INTEGER, REAL, ... Funkcije imaju RETURNS klauzulu i svi parametri funkcije moraju biti IN parametri – ne mogu da se koriste ostale oznake vrste parametra INOUT parametri – parametri koji se prenose kao ulazni, a procedura ih vraća kao izlazne, tj. prilikom poziva imaju definisanu vrednost i dobijaju vrednost u telu procedure OUT parametri – parametri koje procedura vraća kao izlazne, tj. prilikom poziva nemaju definisanu vrednost i dobijaju je u telu procedure IN parametri – parametri koji se prenose kao ulazni, tj. prilikom poziva imaju definisanu vrednost i ne mogu se menjati u telu procedure Osnovnu strukturu PSM rutina (i funkcija i procedura) čine deklaracije SQL promenljivih i izvršni deo koji čini blok naredbi definisan između BEGIN i END Termin kojim se jednim imenom objedinjuju procedure, funkcije i metode Procedure baze podataka – Persistent stored module (PSM) SQL/PSM definiše sintaksu i semantiku jezika za rad sa bazom podataka koji se odnosi na deklarisanje i manipulisanje perzistentnim rutinama u SQL-server modulima PSM procedure i funkcije predstavljaju samostalne programske celine koje se u šemi baze podataka identifikuju preko svog imena Metode se definišu u kontekstu korisnički-definisanih tipova SQL/PSM moduli se definišu kao kolekcije procedura i funkcija Procedure Funkcije CREATE PROCEDURE <naziv> ([<vrstaParamnazivParamtipParam>, …]) lokalne_deklaracije BEGIN izvrsne_naredbe END; CREATE FUNCTION <naziv> ([<nazivParamtipParam>, …]) RETURNS <SQLtip> lokalne_deklaracije BEGIN izvrsne_naredbe END; Sve promenljive koje se koriste u izvršnom delu PSM rutina moraju biti deklarisane • DECLARE lBroj INTEGER; • DECLARE lKol REAL = 0; • DECLARE lDatum DATE = NULL;
PSM promenljive se u SQL naredbama koriste bez ikakvog prefiksa, samo navođenjem naziva promenljive– treba izbegavati nazive koji su isti kao i nazivi objekata u šemi baza podataka Osnovne naredbe koje se koriste u PSM rutinama su SQL naredbe, a one se pišu u izvršnom delu programa • CREATE PROCEDURE kreirajRacun (IN pKupac VARCHAR[80]) • DECLARE pBroj INTEGER; • DECLARE pDatum DATE; • BEGIN • SET pBroj = 10; • SET pDatum = CURRENT_DATE; • INSERT INTO Racun (brojRacuna, datum, nazivKupca) • VALUES (pBroj, pDatum, pKupac); • END; Kao i u SQL-u i u PSM rutinama se koriste relacioni operatori (=, !=, <, <=, >, >=), aritmetički operatori (+, -, *, /) i logički operatori (AND, OR i NOT), kao i SQL funkcije osim grupnih funkcija –AVG, SUM, MIN, MAX, COUNT U izrazima koji se pišu van SQL naredbi mogu učestvovati samo promenljive deklarisane u PSM rutini PSM moduli sadrže naredbe za upravljanje tokom izvršavanjaprograma: selekcije (IF THEN ELSE i CASE), iteracije (LOOP, WHILE i REPEAT) i promene toka (LEAVE i ITERATE)
NO SQL – ne sadrži SQL naredbe CONTAINS SQL – sadrži samo SQL naredbe READS SQL DATA – sadrži samo SQL naredbe koje čitaju podatke MODIFIES SQL DATA – sadrži naredbe koje menjaju podatke u bazi podatala Procedure baze podataka se mogu pozivati sa strane klijenta – pa se može definisati kontrola pristupa i sigurnost BP jer se korisnicima daje pravo da pozovu proceduru ali im se onemogućava direktan pristup tabelama Manipulacija kursorom je omogućena preko naredbi OPEN, FETCH i CLOSE Definisan je i drugi način korišćenja kursora preko for konstrukcije– omogućava navigaciju kroz kursor bez eksplicitnog otvaranja i zatvaranja kursora Koristi se naredba SIGNAL iza koje se piše naziv izuzetka Potrebno je deklarisati hendler kojim se definiše akcija obrade (CONTINUE, EXIT ili UNDO) Zato sve rutine imaju dva naziva – drugi je identifikator rutine u šemi baze podataka Za SQL upite koji vraćaju tačno jednu n-torku može se koristiti naredba SELECT INTO kojom serezultat upita smešta u promenljive deklarisane u PSM rutini Ukoliko SQL naredba vraća više n-torki koristi se kursor koji omogućava pristup n-torkama rezultata zapis po zapis Za obradu grešaka se koristi poseban koncept koji se zove izuzetak (EXCEPTION) Ovaj mehanizam se može podeliti u dva dela: pokretanje izuzetka (najčešće obavlja SUBP, a ponekad i programer) i obrada izuzetka (isključivo zadatak programera) PSM procedure i funkcijepredstavljaju objekte šeme baze podataka – omogućeno je njihovo kreiranje – CREATE, izmena – ALTER i izbacivanje - DROP SQL dozvoljava postojanje više rutima sa istim nazivom - polimorfizam Osim imena rutine za njenu manipulaciju se mogu definisati i druge klauzule, kao što je indikacija pristupa SQL
HVALA NA PAŽNJI Prof. dr Milorad Banjanin