Adatbá Adatbázis rendszerek I mySQL SQL program API
MEME- GEIAL
Dr. Ková Kovács
Lá László szló
Üzleti logika elhelyezé elhelyezése adatbá adatbázis
Kliens üzleti logika
Nagy há hálózati forgalom Decentralizá Decentralizált karbantartá karbantartás Lassabb vé végrehajtá grehajtás
Kliens Adatbá Adatbázis üzleti logika Kis há hálózati forgalom Centralizá Centralizált karbantartá karbantartás Gyorsabb vé végrehajtá grehajtás
GEIAL Kovács László
Kliens oldali SQL-API SQL EXEC SQL UPDATE tabla SET .. E-SQL if (res < 0) {… CLI
re = SQLEXECUTE(cs, ”SELECT
”)
O-CLI re = CON.executeQuery(”SELECT”) 4GL
DEFINE CLASS sracs AS GRID sracs.RECORDSOURCE=”SELECT …
OPA
Sessman.save(dolgozo)
SQL
DBMS
Beá Beágyazott SQL SQL parancsok kiadása programból: : - gazda nyelvi környezetbe beépített SQL parancsok - beágyazott SQL : interaktív SQL szintaktikát követ - CLI: függvényeket definiál az adatkapcsolathoz
3GL program
DBMS
scanf(”%d”,&lv); … INSERT INTO ARU VALUES(C.NEXTVAL,:lv); if (sqlca.errcode==0) { printf(“Sikeres beszuras\n”); }
Beágyazott SQL rendszerek struktúrája
Forrás állomány = gazdanyelv + SQL Előfordító Gazdanyelvi forrás Fordító Object gépi kód Linker
DBMS
EXE állomány
DBMS Library
KL
Beágyazott SQL rendszerek struktúrája Adatok fogadása - egy rekord jön át: SELECT m-lista INTO v-lista FROM …; EXEC SQL BEGIN DECLARE SECTION; int lv; EXEC SQL END DECLARE SECTION; main() { printf (“Kerem a tipust:”); scanf(”%s”,&tip); EXEC SQL SELECT COUNT(*), MIN(ar)INTO:db,:mar FROM AUTO WHERE tipus = :tip; printf (“Db = %d Max ar = %d\n”, db, mar); }
Kurzor mechanizmus
DBMS kurzor
Alkalmazás
EXEC SQL DECLARE CURSOR k1 FOR SELECT rsz, ar FROM auto FOR UPDATE OF ar; … OPEN k1; while () { EXEC SQL FETCH k1 INTO :r1, :a1; EXEC SQL UPDATE auto SET ar=:ua WHERE CURRENT OF k1; } EXEC SQL CLOSE k1;
ODBC CLI Open Database Connectivity
(MS, ~1993)
Célja egységes API elérési felület biztosítása a különböző relációs jellegű adatforrások felé (a heterogenitási problémák leküzdése)
ODBC
Oracle SQLServer Informix DB2 Sybase VFP Access Excel Txt
ODBC CLI Elvégzendő funkciók ODBC parancs INSERT konverzió adat DATETIME konverzió SQLCONNECT ISOLATION LEVEL kapcsolat felvétel SELCET funkció SQLTABLES bővítés SQLCONNECT(1) hibakezelés SQLCONNECT(2) információ nyújtás párhuzamosság
APPEND DATE CONNECT … UPDATE ERROR() SELECT
ODBC CLI SQLAllocEnv(&henv); //session létesítés SQLAllocConnect(henv,&hdbc); //kapcsolat leíró foglalás SQLConnect(hdbc, (unsigned char*) ”HELLO”,SQL_NTS,NULL,0, NULL,0); SQLAllocStmt(hdbc,&hstmt); //parancs leíró foglalás SQLExecDirect(nstmt,(unsigned char*) “SELECT * FROM Minta “, SQL_NTS)//parancs végrehajtás for (rc=SQLFetch(hstmt);rc==SQL_SUCCESS; rc=SQLFetch(hstmt)){ //rekordok lekérdezése SQLGetData(hstmt,1,SQL_C_CHAR,SzData, Siyeof(sydata),&cbData); //mező lekérdezése MessageBox(NULL,syData,”ODBC”,MB_OK); //az eredmény } SQLFreeStmt(hstmt,SQL_DROP); //parancs leírás SQLDisconnect(hdbe); //lekapcsolódás SQLFreeConnet(hdbe); //leíró felszabadítás SQLFreeEno(henv) //session leíró
JDBC Kapcsolati típusok ODBC D 1 JDBC Java
D 1
JDBC-ODBC DBMS JDBC-DBAPI J-Net Net JDBC
tiszta JDBC
JDBC – API Logikailag olyan objektum szerkezet mint az ADO-nál gazdagabb metódus és tulajdonságkészlet
Class. forName(”.. driver…”) c = DriverManager.getConnection(elérés) s = c.createStatement() r = s.executeQuery(parancs) r.next() r.getStrting(mezo) r.getInt(mezo) try {…} catch (SQLException e) { }
JDBC – API public static void main(String[] args) { String url = "jdbc:odbc:hinfodbc"; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection(url, "scott","tiger"); rs = stmt.executeQuery("SELECT * FROM dolgozo"); while (rs.next()) { int i = rs.getInt("kod"); String s = rs.getString("nev"); System.out.println(i + " : " + s + " : " + j); } rs.close(); stmt.close(); con.close(); } catch (SQLException ex) { System.out.println("SQL hiba:" + ex.getSQLState()); } }
Hibernate ORM struktúra
RDBMS SDM(EER) modell
Mapping definíció
SQL Relációs séma
adat Java osztály IO Interface kód Java osztály GEIAL Kovács László
Hibernate API
Hibernate Engine
JDBC
Java Peristence API @Entity public class Company { @Id @GeneratedValue int id; private String name; @Embedded private Address address; address; @OneToMany private Collection
employees; public Company() { } public Company (final String name, final Address address, address, final Collection employees) { setName(name); setName(name); setAddress(address); setAddress(address); setEmployees(employees); setEmployees(employees); } GEIAL Kovács László
Java Peristence API A perzisztens egyedeket az EntityManager objektumon keresztül lehet feldolgozni EntityManager em; // set up a new entity instance Employee emp = new Employee(10); emp.setName("Miller"); // egyed lementése em.persist(emp); // egyed keresése emp = em.find(Employee.class, Integer.valueOf(10)); // egyed törlése em.remove(emp);
GEIAL Kovács László
Tárolt eljá eljárások ké készí szítése Tárolt eljá eljárás: a rutin kó kódja az adatbá adatbázisban tá tárolt Elő Előnyei:
Elő Előfeldolgozott formá formában tá tárolt Gyorsabb futá futás Hozzá Hozzáférés vé védelem Könnyebb adminisztrá adminisztrálás CREATE PROCEDURE pnmev (plista) plista) BEGIN törzs END;
Paramé Paraméterlista: IN né név tí típus | OUT né név tí típus | IN OUT né név tí típus GEIAL Kovács László
Tárolt eljá eljárások ké készí szítése Tárolt fü függvé ggvény: a rutin kó kódja az adatbá adatbázisban tá tárolt és van visszaté visszatérési érté rtéke
CREATE FUNCTION fnmev (plista) plista) RETURNS tí típus BEGIN törzs END;
A rutinok tö törzse kiegé kiegészí szített SQL parancsokat tartalmaz Rutinok tö törlé rlése:
Rutinok meghí meghívása:
GEIAL Kovács László
DROP PROCEDURE nev; nev; DROP FUNCTION nev; nev;
CALL pnev (érté rtéklista); SELECT fné fnév(érté rtéklista);
Tárolt eljá eljárások ké készí szítése Változó ltozók kezelé kezelése Változó ltozó létrehozá trehozása: DECLARE vné vnév típus DEFAULT érté rték; Érté rtékadá kadás mű műveletei: SET vné vnév = kifejezé kifejezés; SELECT kifejezé kifejezés INTO vné vnév FROM …; CREATE PROCEDURE sp1 (x VARCHAR(5)) BEGIN DECLARE xname VARCHAR(5) DEFAULT 'bob'; DECLARE xid INT; SELECT name,id INTO xname,xid FROM table1 WHERE name = x; SELECT xname; END; GEIAL Kovács László
Tárolt eljá eljárások ké készí szítése Adatok kezelé kezelése Az adatkezelő adatkezelő SQL parancsok kö közvetlenü zvetlenül vé végrehajtható grehajthatók IF elem:
LOOP elem:
GEIAL Kovács László
IF feltétel THEN válasz ELSE válasz2 END IF; LOOP ciklusmag END LOOP;
Kilépés a ciklusból:
LEAVE címke;
Ciklusmag ismétlése:
ITERATE címke;
Tárolt eljá eljárások ké készí szítése Kurzor kezelé kezelése A kurzorral rekordonként olvasható be egy SELECT eredménye BEGIN DECLARE CURSOR cnev( cnev(param) param) IS SELECT ..; … OPEN cnev( cnev(aparam); aparam); LOOP FETCH cnev INTO vlista; vlista; … END LOOP; CLOSE cnev; cnev;
DBMS GEIAL Kovács László
deklará deklaráció ció nyitá nyitás kilé kilépés a ciklusbó ciklusból lezá lezárás
PL/SQL blokk kurzor
Tárolt eljá eljárások ké készí szítése Hiba kezelé kezelése A fellépő hibákhoz eseménykezelőt lehet írni A hiba figyelmen kívül hagyása: DECLARE CONTINUE HANDLER FOR hiba válasz SQLSTATE n NOT FOUND SQLEXCEPTION SQLWARNING
GEIAL Kovács László
Tárolt eljá eljárások ké készí szítése
drop procedure proc1; delimiter // create procedure proc1 (in xnev char(20), in xvar char(10)) begin declare xkod int; select max(kod) into xkod from emberek; insert into emberek values (xkod+1,xnev, xvar,2000); end; // delimiter ;
utasítás lezáró
lokális változó lekérdezés változóba
call proc1 ('a','b'); soronkövetkező kulcsérték generálása GEIAL Kovács László
eljárás definíció vége meghívás
Tárolt eljá eljárások ké készí szítése drop function szrev; delimiter // create function szrev (xszov char(20)) returns char(20) begin declare xi int; declare xe char(20); set xe = ''; set xszov = rtrim(xszov); set xi = length(xszov); while xi > 0 do set xe = concat(rtrim(xe), substring(xszov,xi,1)); set xi = xi -1; end while; return xe; end; // delimiter ; select szrev(‘alom’); GEIAL Kovács László
szó tükröző függvény készítése
DROP PROCEDURE proc2; delimiter // CREATE PROCEDURE Proc2 () BEGIN DECLARE m_kod INT; DECLARE m_fiz INT; DECLARE done INT DEFAULT 0; DECLARE C1 CURSOR FOR SELECT kod, fiz FROM dolgozo; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN C1; LOOP FETCH C1 INTO m_kod,m_fiz; IF done THEN LEAVE END IF; CASE WHEN m_fiz < 100 THEN SET m_ado = 0; ELSE SET m_ado = 40; END CASE; UPDATE dolgozo SET ado = m_ado, xx = func1(nev) WHERE kod = m_kod; END LOOP ; CLOSE C1; END; // GEIAL Kovács László delimiter ;