Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

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.

Hasonló előadás


Az előadások a következő témára: "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."— Előadás másolata:

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


Letölteni ppt "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."

Hasonló előadás


Google Hirdetések