adatbázisok használata 1. (9. gyakorlat)

22
Adatbázisok használata 1. (9. gyakorlat) 2012. tavaszi félév Vitéz Gergely

Upload: uyen

Post on 23-Feb-2016

33 views

Category:

Documents


0 download

DESCRIPTION

Adatbázisok használata 1. (9. gyakorlat). 2012. tavaszi félév Vitéz Gergely. A diasor ismerete nem helyettesíti a tankönyvet, és a példatárat. A diasor ismerete szükséges, de nem elégséges feltétele a minimum elégséges érdemjegynek!. Hivatkozási adattípusok. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Adatbázisok használata 1. (9. gyakorlat)

Adatbázisok használata 1.(9. gyakorlat)

2012. tavaszi félévVitéz Gergely

Page 2: Adatbázisok használata 1. (9. gyakorlat)

A diasor ismerete nem helyettesíti a tankönyvet, és a példatárat. A diasor ismerete szükséges, de nem elégséges feltétele a minimum elégséges érdemjegynek!

Page 3: Adatbázisok használata 1. (9. gyakorlat)

Hivatkozhatunk egy másik PL/SQL változó, tábla, mező típusára, így típus változás esetén a PL/SQL blokk deklarációját nem kell módosítani.

DECLARE v_oszloptip tabla.oszlop%TYPE; v_valttip v_oszloptip%TYPE; v_sortip tabla%ROWTYPE; BEGIN … Példa: Töltsük be a KING dolgozó fizetését egy

hivatkozott típusú változóba, majd írassuk ki a konzolra!

Hivatkozási adattípusok

Page 4: Adatbázisok használata 1. (9. gyakorlat)

SET SERVEROUTPUT ON

DECLARE fiz emp.sal%TYPE; BEGIN SELECT sal INTO fiz FROM emp WHERE upper(ename) = 'KING'; DBMS_OUTPUT.PUT_LINE('A főnök fizetése: ' || fiz || '$');

end; /

Hivatkozási adattípusok

Page 5: Adatbázisok használata 1. (9. gyakorlat)

DECLARE TYPE tipusnev IS RECORD OF (oszlop1 tipus1, oszlop2 tipus2) [NOT NULL] INDEX BY BINARY_INTEGER; valtozonev tipusnev; BEGIN … Bővítsük az előző szkriptet úgy, hogy egy rekord

típusba lekérjük a dolgozó kódját és nevét is!

Rekord adattípus

Page 6: Adatbázisok használata 1. (9. gyakorlat)

DECLARE TYPE dolgtip IS RECORD (empno NUMBER, ename VARCHAR2(200), sal NUMBER); dolgfiz dolgtip; BEGIN SELECT empno,ename,sal INTO dolgfiz FROM emp WHERE upper(ename) = 'KING'; DBMS_OUTPUT.PUT_LINE(dolgfiz.ename || '(' || dolgfiz.empno ||

') fizetése: ' || dolgfiz.sal || '$'); END; /

Rekord adattípus

Page 7: Adatbázisok használata 1. (9. gyakorlat)

DECLARE TYPE tipusnev IS TABLE OF tipus [NOT NULL] INDEX BY BINARY_INTEGER; valtozonev tipusnev; BEGIN …

Gyüjtőtábla típus

Page 8: Adatbázisok használata 1. (9. gyakorlat)

Kurzorok Soronként dolgozhatjuk fel velük egy

lekérdezés eredményét

Explicit - felhasználó által generált kurzor DECLARE CURSOR kurzor IS SELECT * FROM emp; BEGIN …

Page 9: Adatbázisok használata 1. (9. gyakorlat)

Kurzorok SET SERVEROUTPUT ON

DECLARE CURSOR kurzor IS SELECT * FROM emp; sor kurzor%ROWTYPE; BEGIN OPEN kurzor; --megnyitjuk LOOP FETCH kurzor INTO sor; --beolvasunk egy sort EXIT WHEN kurzor%NOTFOUND; --kilépünk a ciklusból dbms_output.put_line(sor.ename); END LOOP; CLOSE kurzor; --ne felejtsük el lezárni dbms_output.put_line('vége'); END; /

Page 10: Adatbázisok használata 1. (9. gyakorlat)

Kurzorok egyszerűbben FOR ciklussal egyszerűbben is feldolgozhatjuk

SET SERVEROUTPUT ON

DECLARE CURSOR kurzor IS SELECT * FROM emp; BEGIN FOR sor IN kurzor LOOP dbms_output.put_line(sor.ename); END LOOP; dbms_output.put_line('vége'); END; /

Page 11: Adatbázisok használata 1. (9. gyakorlat)

Kurzorok lusta fejlesztőknek Megadhatjuk magát a lekérdezést is, így rejtett kurzort

tudunk használni

SET SERVEROUTPUT ON

BEGIN FOR sor IN (SELECT * FROM emp) LOOP dbms_output.put_line(sor.ename); END LOOP; dbms_output.put_line('vége'); END; /

Page 12: Adatbázisok használata 1. (9. gyakorlat)

ROWID 18 karakter hosszú Az adatbázisban minden tábla minden

rekordjának van egy ilyen EGYEDI azonosítója

Egyértelműen tudunk hivatkozni vele egy tábla egy bizonyos sorára

(akkor is ha értékek alapján duplikátum lenne, pl. egy elsődleges kulcs nélküli emp táblában 2x szerepelne a KING)

Csináljunk egy duplikált táblát

Page 13: Adatbázisok használata 1. (9. gyakorlat)

Duplikátum törlése ROWID-val create table dolg as select * from emp;

insert into dolg select * from emp;

select rowid, dolg.* from dolg;

select empno, min(rowid) minid from dolg group by empno having count(*)> 1;

Page 14: Adatbázisok használata 1. (9. gyakorlat)

select minid from (select empno, min(rowid) minid from dolg group by empno having count(*)> 1);

delete from dolg where rowid in (select minid from (select empno, min(rowid) minid from dolg group by empno having count(*)> 1));

Duplikátum törlése ROWID-val

Page 15: Adatbázisok használata 1. (9. gyakorlat)

FOR UPDATE záradék Zárolja a lekérdezés eredményében

található sorokat, így azokat szabadon módosíthatjuk, törölhetjük

CURRENT OF feltétel A kurzor aktuális sorára hivatkozhatunk a

segítségével

Kurzorok…

Page 16: Adatbázisok használata 1. (9. gyakorlat)

Hozzon létre egy dolgozó nevű táblát az emp táblának a felhasználó által megadott telephelyű dolgozóiból, változtassa meg az mgr oszlop nevét partner névre, törölje a tartalmát, és töltse fel az alábbi módon értékkel:

Két dolgozó partnere lehet egymásnak, ha még egyiküknek sincs partnere, és a felhasználó által megadott értéknél nem több a fizetésük különbsége. A partnerek azonosítói szerepeljenek egymás partner oszlopában. (Senki önmagának nem lehet partnere, és a partnerség szimmetrikus tulajdonság, azaz ha A partnere B, akkor B partnere A)

Komplex példa(ZH!)

Page 17: Adatbázisok használata 1. (9. gyakorlat)

set serveroutput on; set verify on; drop table dolgozo; create table dolgozo as select * from emp; alter table dolgozo rename column mgr to partner;

Komplex példa 2/6

Page 18: Adatbázisok használata 1. (9. gyakorlat)

Minta current of-ra

declare cursor kurzor1 is select * from dolgozo for update; begin for rekord1 in kurzor1 loop update dolgozo set partner = 0 where current of kurzor1; end loop; end; /

Komplex példa 3/6

Page 19: Adatbázisok használata 1. (9. gyakorlat)

accept kulonbseg prompt 'A legnagyobb fizetés különbség: '; declare cursor kurzora is select * from dolgozo for update; cursor kurzorb is select * from dolgozo for update; rekorda kurzora%rowtype; rekordb kurzorb%rowtype; kul number; begin open kurzora; loop fetch kurzora into rekorda; exit when kurzora%notfound; if rekorda.partner=0 then open kurzorb; loop fetch kurzorb into rekordb; exit when kurzorb%notfound;

Komplex példa 4/6

Page 20: Adatbázisok használata 1. (9. gyakorlat)

if rekordb.partner=0 and rekorda.empno<>rekordb.empno then kul:= abs( (rekorda.sal+nvl(rekorda.comm,0))- (rekordb.sal+nvl(rekordb.comm,0))); if (kul<&kulonbseg) then update dolgozo set partner=rekorda.empno where current of kurzorb; update dolgozo set partner=rekordb.empno where current of kurzora; close kurzorb; open kurzorb; close kurzora; open kurzora; exit; end if; end if; end loop; close kurzorb; end if; end loop; close kurzora; commit; end; /

Komplex példa 5/6

Page 21: Adatbázisok használata 1. (9. gyakorlat)

Ellenőrzés:

select empno, ename, partner, sal+ nvl(comm,0) as jov from dolgozo order by ename;

ZH-ban új sorokat is kell beszúrni a teszteléshez.

Csak vége lett

Komplex példa 6/6

Page 22: Adatbázisok használata 1. (9. gyakorlat)

Köszönöm a figyelmet!

Pénteken délután 17:00-tól konzultációIgény szerint ma délután ishttp://www.orakulum.com http://jerry.gorextar.hu/ab1

[email protected]