Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaÁbel Papp Megváltozta több, mint 10 éve
1
2012. tavaszi félév Vitéz Gergely
2
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!
3
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!
4
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; /
5
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!
6
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; /
7
DECLARE TYPE tipusnev IS TABLE OF tipus [NOT NULL] INDEX BY BINARY_INTEGER; valtozonev tipusnev; BEGIN …
8
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 …
9
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; /
10
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; /
11
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; /
12
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
13
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;
14
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));
15
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
16
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)
17
set serveroutput on; set verify on; drop table dolgozo; create table dolgozo as select * from emp; alter table dolgozo rename column mgr to partner;
18
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; /
19
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;
20
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 loop; close kurzorb; end if; end loop; close kurzora; commit; end; /
21
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
22
Köszönöm a figyelmet! Pénteken délután 17:00-tól konzultáció Igény szerint ma délután is http://www.orakulum.com http://jerry.gorextar.hu/ab1 vitez.gergely@spectronet.hu
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.