Adatbázis rendszerek I mysql SQL program API ME- GEIAL Dr. Kovács Lászl szló
Üzleti logika elhelyezése adatbázis Kliens üzleti logika Nagy hálózati forgalom Decentralizált lt karbantartás Lassabb végrehajt grehajtás Adatbázis üzleti logika Kliens Kis hálózati forgalom Centralizált lt karbantartás Gyorsabb végrehajt grehajtás GEIAL Kovács László
Kliens oldali SQL-API E-SQL CLI O-CLI 4GL OPA EXEC SQL UPDATE tabla SET.. if (res < 0) { re = SQLEXECUTE(cs, SELECT ) re = CON.executeQuery( SELECT ) DEFINE CLASS sracs AS GRID sracs.recordsource= SELECT Sessman.save(dolgozo) SQL DBMS
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ó Fordító Gazdanyelvi forrás Object gépi kód Linker EXE állomány DBMS Library DBMS 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 INSERT DATETIME SQLCONNECT ISOLATION LEVEL SELCET SQLTABLES SQLCONNECT(1) SQLCONNECT(2) parancs konverzió adat konverzió kapcsolat felvétel funkció bővítés hibakezelés 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 D 1 JDBC D 1 Java ODBC DBMS J-Net JDBC-ODBC JDBC-DBAPI 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 JDBC kód Java osztály adat Java osztály IO Interface Hibernate API Hibernate Engine GEIAL Kovács László
GEIAL Kovács László Java Peristence API @Entity public class Company { @Id @GeneratedValue int id; private String name; @Embedded private Address address; @OneToMany private Collection<Person> employees; public Company() { } public Company (final String name, final Address address, final Collection<Person> employees) { setname(name); setaddress(address); setemployees(employees); }
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árások kész szítése se Tárolt eljárás: a rutin kódja az adatbázisban tárolt Előnyei: Előfeldolgozott formában tárolt Gyorsabb futás Hozzáférés védelem Könnyebb adminisztrálás CREATE PROCEDURE pnmev (plista plista) BEGIN törzs END; Paraméterlista: IN név típus OUT név típus IN OUT név típus GEIAL Kovács László
Tárolt eljárások kész szítése se Tárolt függv ggvény: a rutin kódja az adatbázisban tárolt és van visszatérési si ért rtéke CREATE FUNCTION fnmev (plista plista) RETURNS típus BEGIN törzs END; A rutinok törzse kiegész szített SQL parancsokat tartalmaz Rutinok törl rlése: DROP PROCEDURE nev; DROP FUNCTION nev; Rutinok meghívása: CALL pnev (ért rtéklista); SELECT fnév(ért rtéklista); GEIAL Kovács László
Tárolt eljárások kész szítése se Változ ltozók kezelése Változ ltozó létrehoz trehozása: DECLARE vnév típus DEFAULT ért rték; Ért rtékad kadás műveletei: SET vnév = kifejezés; SELECT kifejezés INTO 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árások kész szítése se Adatok kezelése Az adatkezelő SQL parancsok közvetlen zvetlenül l végrehajthat grehajthatók IF elem: LOOP elem: IF feltétel THEN válasz ELSE válasz2 END IF; LOOP ciklusmag END LOOP; Kilépés a ciklusból: Ciklusmag ismétlése: LEAVE címke; ITERATE címke; GEIAL Kovács László
Tárolt eljárások kész szítése se Kurzor kezelése A kurzorral rekordonként olvasható be egy SELECT eredménye BEGIN DECLARE CURSOR cnev(param param) IS SELECT..; OPEN cnev(aparam aparam); LOOP FETCH cnev INTO vlista; END LOOP; CLOSE cnev; deklaráci ció nyitás kilépés a ciklusból lezárás DBMS kurzor PL/SQL blokk GEIAL Kovács László
Tárolt eljárások kész szítése se Hiba 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árások kész szítése 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 ; call proc1 ('a','b'); utasítás lezáró lokális változó lekérdezés változóba eljárás definíció vége meghívás soronkövetkező kulcsérték generálása GEIAL Kovács László
Tárolt eljárások kész szítése 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 ;