oracle pl-sql Összefoglaló feladatok, megoldással (2005, 19 oldal)

29
PL/SQL ÖSSZEFOGLALÓ FELADATOK Az alábbi feladatokat megoldó programokat és azok futási eredményeit, ellenőrző listáit a főkönyvtár hallgató nevű könyvtárában az Ön nevét tartalmazó Word dokumentumba (pl. C:\hallgató\SasPál_1kurzus_A.doc) tárolja, majd ezt zip formátumba tömörítve küldje el egy e-mail-hez csatolva a [email protected] címre. A részmegoldásokat próbafuttatásokkal ellenőrizze, és ezeket is dokumentálja. Az utasításokat struktúrált módon írja. Segítségként csak az Oracle Help funkciója, és a tankönyvek használhatók. Ügyeljen arra, hogy megoldása egy összetett feladat minden követelményét kielégítse. Megjegyezzük, hogy az egyes részfeladatokat nem feltétlenül a megadásuk sorrendjében kell megoldani, ezért előbb figyelmesen olvassa végig a teljes feladatot. 1. Feladat Hozzon létre egy dolgozó nevű táblát az emp tábla dolgozóiból, és ebben növelje meg a hivatalnokok (clerk) fizetését 20%-al. Listázással ellenőrizze a megoldás helyességét. 2. Feladat Hozzon létre egy dolgozó nevű táblát az emp tábla eladóiból (salesman), és változtassa meg az mgr oszlop nevét partner névre, melyet az alábbi módon töltsön fel értékkel: Két dolgozó partnere lehet egymásnak, ha még egyiküknek sincs partnere, és 150 USD-nél nem több a fizetésük különbsége. A partnerek azonosítói szerepeljenek egymás partner oszlopában. Ellenőrizze a megoldást új dolgozó felvitelével, és a partnerkeresés megismétlésével. 3. Feladat 3.1. Hozzon létre egy dolgozó nevű táblát az emp tábla rekordjaiból. 3.2. Készítsen triggert a dolgozó táblába történő ellenőrzött adatbevitelhez, ahol az alábbi adatbeviteli feltételeket a trigger által meghívott tárolt alprogramokban vizsgálja meg: a.) Részleg feltétel: Egy új dolgozó részlegeként csak már létező részleg azonosítója adható meg. b.) Fizetési feltétel: Egy új dolgozó fizetésként a részlegében és vele azonos munkakörben dolgozók átlagfizetésének legalább a document.doc - 1 -

Upload: osanya13

Post on 19-Jan-2016

42 views

Category:

Documents


0 download

DESCRIPTION

PL/SQL ÖSSZEFOGLALÓ FELADATOK

TRANSCRIPT

Page 1: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

PL/SQL ÖSSZEFOGLALÓ FELADATOK

Az alábbi feladatokat megoldó programokat és azok futási eredményeit, ellenőrző listáit a főkönyvtár hallgató nevű könyvtárában az Ön nevét tartalmazó Word dokumentumba (pl. C:\hallgató\SasPál_1kurzus_A.doc) tárolja, majd ezt zip formátumba tömörítve küldje el egy e-mail-hez csatolva a [email protected] címre.

A részmegoldásokat próbafuttatásokkal ellenőrizze, és ezeket is dokumentálja. Az utasításokat struktúrált módon írja. Segítségként csak az Oracle Help funkciója, és a tankönyvek használhatók.

Ügyeljen arra, hogy megoldása egy összetett feladat minden követelményét kielégítse.Megjegyezzük, hogy az egyes részfeladatokat nem feltétlenül a megadásuk sorrendjében kell megoldani, ezért előbb figyelmesen olvassa végig a teljes feladatot.

1. Feladat

Hozzon létre egy dolgozó nevű táblát az emp tábla dolgozóiból, és ebben növelje meg a hivatalnokok (clerk) fizetését 20%-al. Listázással ellenőrizze a megoldás helyességét.

2. Feladat

Hozzon létre egy dolgozó nevű táblát az emp tábla eladóiból (salesman), és változtassa meg az mgr oszlop nevét partner névre, melyet az alábbi módon töltsön fel értékkel:

Két dolgozó partnere lehet egymásnak, ha még egyiküknek sincs partnere, és 150 USD-nél nem több a fizetésük különbsége. A partnerek azonosítói szerepeljenek egymás partner oszlopában.

Ellenőrizze a megoldást új dolgozó felvitelével, és a partnerkeresés megismétlésével.

3. Feladat

3.1. Hozzon létre egy dolgozó nevű táblát az emp tábla rekordjaiból.

3.2. Készítsen triggert a dolgozó táblába történő ellenőrzött adatbevitelhez, ahol az alábbi adatbeviteli feltételeket a trigger által meghívott tárolt alprogramokban vizsgálja meg:

a.) Részleg feltétel: Egy új dolgozó részlegeként csak már létező részleg azonosítója adható meg.

b.) Fizetési feltétel: Egy új dolgozó fizetésként a részlegében és vele azonos munkakörben dolgozók átlagfizetésének legalább a 3/4-ét kapja, ha a részlegében nincs vele azonos munkakörű, akkor a részlegében dolgozók átlagfizetésének 2/3-ánál legalább 300 USD-vel többet, ha pedig a részlegében ő az első dolgozó, akkor legalább 2000 USD-t.

3.3. A trigger és a tárolt eljárások ellenőrzése érdekében végezze el a szükséges adatfelviteleket.

3.4. Az elkészített megoldás a tárolandó dolgozó nevét írja vissza a képernyőre, és sikeres adatfelvitel esetén írja ki a dolgozó nevét, majd az "OK!" üzenetet, míg sikertelen adatfelvitel esetén a "HIBA:" üzenetet, és a sikertelenség okát.

3.5. Utolsó lépésként listázza a dolgozó táblát, majd állítsa vissza az eredeti táblatartalmat.

document.doc - 1 -

Page 2: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

MEGOLDÁSOK

1. Feladat

Hozzon létre egy dolgozó nevű táblát az emp tábla dolgozóiból, és ebben növelje meg a hivatalnokok (clerk) fizetését 20%-al. Listázással ellenőrizze a megoldás helyességét.

Megoldás

0. lépés (Az SQL*Plus környezet inicializálása)

-- Az emp tábla inicializálása (ezúttal elhagyjuk)-- @INIT1 -- Feltételezve, hogy az INIT1.sql a BIN könyvtárban van-- A dátum és megjelenítés inicializálásaALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';SET numwidth 5

-- Az esetlegesen létező azonos nevű objektumok törléseDROP VIEW dolgozó;DROP TABLE dolgozó;

A munkamenet módosítva.ORA-00942: a tábla vagy a nézet nem létezikORA-00942: a tábla vagy a nézet nem létezik

1. lépés

DROP TABLE dolgozó;CREATE TABLE dolgozóAS SELECT * FROM emp;SELECT * FROM dolgozó WHERE LOWER(job) = 'clerk';

ORA-00942: a tábla vagy a nézet nem létezikA tábla létrejött.

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ---------- ----- ----- ------ 7900 JAMES CLERK 7698 1981-12-03 950 30 7369 SMITH CLERK 7902 1980-12-17 800 20 7876 ADAMS CLERK 7788 1987-05-23 1100 20 7934 MILLER CLERK 7782 1982-01-23 1300 10

2. lépés

UPDATE dolgozó SET sal = 1.2*sal WHERE LOWER(job) = 'clerk';

4 sor módosítva.

SELECT * FROM dolgozó WHERE LOWER(job) = 'clerk';

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ---------- ----- ----- ------ 7900 JAMES CLERK 7698 1981-12-03 1140 30 7369 SMITH CLERK 7902 1980-12-17 960 20 7876 ADAMS CLERK 7788 1987-05-23 1320 20 7934 MILLER CLERK 7782 1982-01-23 1560 10

document.doc - 2 -

Page 3: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

2. Feladat

Hozzon létre egy dolgozó nevű táblát az emp tábla eladóiból (salesman), és változtassa meg az mgr oszlop nevét partner névre, melyet az alábbi módon töltsön fel értékkel:

Két dolgozó partnere lehet egymásnak, ha még egyiküknek sincs partnere, és 150 USD-nél nem több a fizetésük különbsége. A partnerek azonosítói szerepeljenek egymás partner oszlopában.

Ellenőrizze a megoldást új dolgozó felvitelével, és a partnerkeresés megismétlésével.

A. Megoldás (Megoldási próbálkozás SQL-ben)

0. lépés (Az SQL*Plus környezet inicializálása)

-- Az emp tábla inicializálása (ezúttal elhagyjuk)-- @INIT1 -- Feltételezve, hogy az INIT1.sql a BIN könyvtárban van-- A dátum és megjelenítés inicializálásaALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';SET numwidth 5

-- Az esetlegesen létező azonos nevű objektumok törléseDROP VIEW dolgozó;DROP TABLE dolgozó;

A munkamenet módosítva.ORA-00942: a tábla vagy a nézet nem létezikORA-00942: a tábla vagy a nézet nem létezik

1. lépés (Konzisztens adattábla létrehozása)

CREATE OR REPLACE VIEW DolgozóNézetASSELECT * FROM emp WHERE LOWER(job) = 'salesman';SELECT * FROM DolgozóNézet;

DROP TABLE dolgozó;CREATE TABLE dolgozóASSELECT empno, ename, job, CASE WHEN mgr IN (SELECT empno FROM DolgozóNézet) THEN mgr ELSE NULL END AS mgr, hiredate, sal, comm, deptno FROM DolgozóNézet;DROP VIEW DolgozóNézet;SELECT * FROM dolgozó;

A nézet létrejött.EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ---------- ----- ----- ------ 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30

A tábla létrejött.EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ---------- ----- ----- ------ 7654 MARTIN SALESMAN 1981-09-28 1250 1400 30 7499 ALLEN SALESMAN 1981-02-20 1600 300 30 7844 TURNER SALESMAN 1981-09-08 1500 0 30 7521 WARD SALESMAN 1981-02-22 1250 500 30

2. lépés (Oszlopmódosítás és adattörlés)

ALTER TABLE dolgozó RENAME COLUMN mgr TO partner;

document.doc - 3 -

Page 4: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

-- A partner mező ezúttal az alábbi törlés nélkül is üresUPDATE dolgozó SET partner = NULL;SELECT * FROM dolgozó;

A tábla módosítva.EMPNO ENAME JOB PARTNER HIREDATE SAL COMM DEPTNO----- ---------- --------- ------- ---------- ----- ----- ------ 7654 MARTIN SALESMAN 1981-09-28 1250 1400 30 7499 ALLEN SALESMAN 1981-02-20 1600 300 30 7844 TURNER SALESMAN 1981-09-08 1500 0 30 7521 WARD SALESMAN 1981-02-22 1250 500 30

3. lépés (Adatfeltöltés)

-- Partnerkereső segédnézet létrehozásaCREATE OR REPLACE VIEW PartnerKeresés(DolgozóID,DolgozóFiz, PartnerID,PartnerFiz)AS SELECT D.empno AS DolgozóID, D.sal AS DolgozóFiz, P.empno AS PartnerID, P.sal AS PartnerFiz FROM dolgozó D, dolgozó P WHERE ABS(D.sal - P.sal) <= 150 AND D.empno != P.empno;SELECT * FROM PartnerKeresés;

A nézet létrejött.DOLGOZÓID DOLGOZÓFIZ PARTNERID PARTNERFIZ--------- ---------- --------- ---------- 7654 1250 7521 1250 7499 1600 7844 1500 7844 1500 7499 1600 7521 1250 7654 1250

-- AdatmódosításUPDATE dolgozó SET partner = (SELECT PartnerID FROM PartnerKeresés WHERE DolgozóID = empno);SELECT * FROM dolgozó;

4 sor módosítva.EMPNO ENAME JOB PARTNER HIREDATE SAL COMM DEPTNO----- ---------- --------- ------- ---------- ----- ----- ------ 7654 MARTIN SALESMAN 7521 1981-09-28 1250 1400 30 7499 ALLEN SALESMAN 7844 1981-02-20 1600 300 30 7844 TURNER SALESMAN 7499 1981-09-08 1500 0 30 7521 WARD SALESMAN 7654 1981-02-22 1250 500 30

4. lépés (Ellenőrzés rekordfelvitellel)

INSERT INTO dolgozó VALUES(6666,'SIGORSZKI','SALESMAN',NULL,'2005-10-30',1250,NULL,30);

1 sor létrejött.

UPDATE dolgozó SET partner = (SELECT PartnerID FROM PartnerKeresés WHERE DolgozóID = empno);

SET partner = (SELECT PartnerID *Hiba a(z) 2. sorban:ORA-01427: egysoros allekérdezés egynél több sorral tér vissza

>> HIBÁS az adatmódosítás!>> Derítsük ki a hiba okát, és készítsünk jó adatmódosító utasítást

document.doc - 4 -

Page 5: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

SELECT * FROM PartnerKeresés;

DOLGOZÓID DOLGOZÓFIZ PARTNERID PARTNERFIZ--------- ---------- --------- ---------- 7654 1250 7521 1250 7654 1250 6666 1250 7499 1600 7844 1500 7844 1500 7499 1600 7521 1250 7654 1250 7521 1250 6666 1250 6666 1250 7654 1250 6666 1250 7521 12508 sor kijelölve.

>> A HIBA oka, hogy egy dolgozónak több partnere is lehet a fizetés feltétel szerint

SELECT MaxPartnerID FROM (SELECT DolgozóID, MAX(PartnerID) AS MaxPartnerID FROM PartnerKeresés GROUP BY DolgozóID) WHERE DolgozóID = 7654;

MAXPARTNERID------------ 7521

>> Így minden dolgozó a legnagyobb azonosítójú (a fizetésre vonatkozó feltételt teljesítő)>> dolgozót kapja partnerként. >> (Ez egy módszer arra, hogy kijelöljünk egyet a lehetséges elemek közül,>> de ilyen módszer nem mindig található!)

-- ÚJABB PRÓBÁLKOZÁS-- A partner mező inicializálásaUPDATE dolgozó SET partner = NULL;-- A partner mező beállítása (feltöltése)UPDATE dolgozó SET partner = (SELECT MaxPartnerID FROM (SELECT DolgozóID, MAX(PartnerID) AS MaxPartnerID FROM PartnerKeresés GROUP BY DolgozóID) WHERE DolgozóID = empno);SELECT * FROM dolgozó;

5 sor módosítva.EMPNO ENAME JOB PARTNER HIREDATE SAL COMM DEPTNO----- ---------- --------- ------- ---------- ----- ----- ------ 7654 MARTIN SALESMAN 7521 1981-09-28 1250 1400 30 7499 ALLEN SALESMAN 7844 1981-02-20 1600 300 30 7844 TURNER SALESMAN 7499 1981-09-08 1500 0 30 7521 WARD SALESMAN 7654 1981-02-22 1250 500 30 6666 SIGORSZKI SALESMAN 7654 2005-10-30 1250 30

>> Még mindig HIBÁS az adatmódosítás!>> A HIBA oka, hogy a legnagyobb azonosítójú dolgozót többen is tudják választani.>> Ezt úgy küszöböljük ki, hogy mielőtt egy dolgozó-azonosítót partnerkódként kiosztunk,>> megvizsgáljuk, hogy azt nem kapta-e már meg valaki.>> (Ezt algebrailag felírva: a Í B a \ B ≠ Æ, ahol a a vizsgálandó dolgozó-azonosító,>> vagyis a "(SELECT MaxPartnerID..." utasításrész, amelyik bár csak egyetlen elemet ad ki, >> azért mégis csak halmaz, hiszen lista.)

document.doc - 5 -

Page 6: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

-- ÚJABB PRÓBÁLKOZÁS 2.-- A partner mező inicializálásaUPDATE dolgozó SET partner = NULL;-- A partner mező beállítása (feltöltése)UPDATE dolgozó SET partner = (SELECT MaxPartnerID FROM (SELECT DolgozóID, MAX(PartnerID) AS MaxPartnerID FROM PartnerKeresés GROUP BY DolgozóID) WHERE DolgozóID = empno) WHERE NOT EXISTS (SELECT MaxPartnerID FROM (SELECT DolgozóID, MAX(PartnerID) AS MaxPartnerID FROM PartnerKeresés GROUP BY DolgozóID) WHERE DolgozóID = empno MINUS SELECT partner FROM dolgozó);SELECT * FROM dolgozó;

0 sor módosítva.

EMPNO ENAME JOB PARTNER HIREDATE SAL COMM DEPTNO----- ---------- --------- ------- ---------- ----- ----- ------ 7654 MARTIN SALESMAN 1981-09-28 1250 1400 30 7499 ALLEN SALESMAN 1981-02-20 1600 300 30 7844 TURNER SALESMAN 1981-09-08 1500 0 30 7521 WARD SALESMAN 1981-02-22 1250 500 30 6666 SIGORSZKI SALESMAN 2005-10-30 1250 30

>> Még mindig HIBÁS az adatmódosítás!>> Mi lehet a HIBA oka, hiszen ez az adatmódosítás már igazán mindent figyelembe vesz?>> ???? (Ötletek küldhetők az oktat123@freemail címre.)

document.doc - 6 -

Page 7: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

B. Megoldás (Megoldás PL/SQL-ben – Rejtett kurzorral és ROWID-val)

1. lépés (Konzisztens adattábla létrehozása)

ugyanaz, mint az A. Megoldásban a 0. és az 1. lépés(lásd ott a szükséges SQL-utasításokat, illetve a DataLoad_A.sql szkript programot)

2. lépés (Oszlopmódosítás, rekordhozzáadás)

ugyanaz, mint az A. Megoldásban a 2. és a 3. lépés(lásd ott a szükséges SQL-utasításokat, illetve a DataLoad_A.sql szkript programot)

3. lépés (Adatfeltöltés - ROWID használattal)

-- DataLoad_B.sql--------------------------------------------------------------- Adatfeltöltés rejtett kurzorral és ROWID használattal ---- (Értelmezését lásd a 12_KurzorHasználat.doc szkriptben) ----------------------------------------------------------------- Utolsó javítás dátuma: 2005.11.22.-------------------------------------------------------------

SET serveroutput ONDECLARE v_Egyik dolgozó.partner%TYPE; v_Másik dolgozó.partner%TYPE;BEGIN -- A dolgozó tábla inicializálása UPDATE dolgozó SET partner = NULL;

-- A fejléc kiíratása DBMS_OUTPUT.PUT_LINE('DOLGOZÓ ' || 'Fizetése ' || 'PARTNER ' || 'Fizetése'); DBMS_OUTPUT.PUT_LINE('===================================');

-- A külső ciklus (végigmegy az összes dolgozó rekordján) FOR EgyikDolgozó IN (SELECT dolgozó.*, ROWID AS RecID FROM dolgozó) LOOP -- A partner azonosító lekérdezése a külső ciklus számára: SELECT partner INTO v_Egyik FROM dolgozó WHERE ROWID = EgyikDolgozó.RecID;

-- A belső ciklus (ez is végigmegy az összes dolgozó rekordján) FOR MásikDolgozó IN (SELECT dolgozó.*, ROWID AS RecID FROM dolgozó) LOOP -- A partner azonosító lekérdezése a belső ciklus számára: SELECT partner INTO v_Másik FROM dolgozó WHERE ROWID = MásikDolgozó.RecID;

-- Ha a külső ciklus aktuális dolgozójának fizetése -- és a belső ciklus aktuális dolgozójának fizetése -- között a különbség nem több 150 USD-nél, -- és a két dolgozó nem azonos, -- és egyiknek sincs még partnere, IF ABS(EgyikDolgozó.sal - MásikDolgozó.sal) <= 150 AND EgyikDolgozó.empno != MásikDolgozó.empno AND

document.doc - 7 -

Page 8: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

v_Egyik IS NULL AND v_Másik IS NULL THEN -- akkor állítsuk be a partner-azonosítót: UPDATE dolgozó SET partner = MásikDolgozó.empno WHERE ROWID = EgyikDolgozó.RecID;

-- és a beállítást visszafelé is végezzük el: UPDATE dolgozó SET partner = EgyikDolgozó.empno WHERE ROWID = MásikDolgozó.RecID;

-- Kiíratás DBMS_OUTPUT.PUT_LINE(EgyikDolgozó.empno ||' ' || EgyikDolgozó.sal ||' '|| MásikDolgozó.empno ||' ' || MásikDolgozó.sal);

-- Kiugrás a ciklusból -- Az egyezés és módosítás után kiugrás a belső ciklusból, és -- ugrás a külső ciklus következő rekordjára EXIT; END IF; -- A belső (MásikDolgozó) ciklus bezárása END LOOP; -- A külső (EgyikDolgozó) ciklus bezárása END LOOP;END;/

SELECT * FROM dolgozó;-- End Of DataLoad_B.sql

DOLGOZÓ Fizetése PARTNER Fizetése===================================7654 1250 7521 12507499 1600 7844 1500

A PL/SQL eljárás sikeresen befejeződött.

EMPNO ENAME JOB PARTNER HIREDATE SAL COMM DEPTNO----- ---------- --------- ------- ---------- ----- ----- ------ 7654 MARTIN SALESMAN 7521 1981-09-28 1250 1400 30 7499 ALLEN SALESMAN 7844 1981-02-20 1600 300 30 7844 TURNER SALESMAN 7499 1981-09-08 1500 0 30 7521 WARD SALESMAN 7654 1981-02-22 1250 500 30 6666 SIGORSZKI SALESMAN 2005-10-30 1250 30

document.doc - 8 -

Page 9: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

C. Megoldás (Megoldás PL/SQL-ben – Rejtett kurzorral, ROWID nélkül)

1. lépés (Konzisztens adattábla létrehozása)

ugyanaz, mint az A. Megoldásban a 0. és az 1. lépés(lásd ott a szükséges SQL-utasításokat, illetve a DataLoad_A.sql szkript programot)

2. lépés (Oszlopmódosítás, rekordhozzáadás)

ugyanaz, mint az A. Megoldásban a 2. és 3. lépés(lásd ott a szükséges SQL-utasításokat, illetve a DataLoad_A.sql szkript programot)

3. lépés (Adatfeltöltés - ROWID használat nélkül)

A feladat megoldható ezúttal ROWID használata nélkül is, mivel van olyan, a rekordokat egyértelműen azonosító oszlop (empno), mely a kurzor-ciklusban nem változik meg.

-- DataLoad_C.sql--------------------------------------------------------------- Adatfeltöltés rejtett kurzorral, ROWID nélkül ---- (Értelmezését lásd a 12_KurzorHasználat.doc szkriptben) ----------------------------------------------------------------- Utolsó javítás dátuma: 2005.11.22.-------------------------------------------------------------

SET serveroutput ONDECLARE v_Egyik dolgozó.partner%TYPE; v_Másik dolgozó.partner%TYPE;BEGIN -- A dolgozó tábla inicializálása UPDATE dolgozó SET partner = NULL;

-- A fejléc kiíratása DBMS_OUTPUT.PUT_LINE('DOLGOZÓ ' || 'Fizetése ' || 'PARTNER ' || 'Fizetése'); DBMS_OUTPUT.PUT_LINE('===================================');

-- A külső ciklus (végigmegy az összes dolgozó rekordján) FOR EgyikDolgozó IN (SELECT * FROM dolgozó) LOOP -- A partner azonosító lekérdezése a külső ciklus számára: SELECT partner INTO v_Egyik FROM dolgozó WHERE empno = EgyikDolgozó.empno;

-- A belső ciklus (ez is végigmegy az összes dolgozó rekordján) FOR MásikDolgozó IN (SELECT * FROM dolgozó) LOOP -- A partner azonosító lekérdezése a belső ciklus számára: SELECT partner INTO v_Másik FROM dolgozó WHERE empno = MásikDolgozó.empno;

-- Ha a külső ciklus aktuális dolgozójának fizetése -- és a belső ciklus aktuális dolgozójának fizetése -- között a különbség nem több 150 USD-nél, -- és a két dolgozó nem azonos, -- és egyiknek sincs még partnere, IF ABS(EgyikDolgozó.sal - MásikDolgozó.sal) <= 150 AND EgyikDolgozó.empno != MásikDolgozó.empno AND v_Egyik IS NULL ANDdocument.doc - 9 -

Page 10: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

v_Másik IS NULL THEN -- akkor állítsuk be a partner-azonosítót: UPDATE dolgozó SET partner = MásikDolgozó.empno WHERE empno = EgyikDolgozó.empno;

-- és a beállítást visszafelé is végezzük el: UPDATE dolgozó SET partner = EgyikDolgozó.empno WHERE empno = MásikDolgozó.empno;

-- Kiíratás DBMS_OUTPUT.PUT_LINE(EgyikDolgozó.empno ||' ' || EgyikDolgozó.sal ||' '|| MásikDolgozó.empno ||' ' || MásikDolgozó.sal);

-- Kiugrás a ciklusból -- Az egyezés és módosítás után kiugrás a belső ciklusból, és -- ugrás a külső ciklus következő rekordjára EXIT; END IF; -- A belső (MásikDolgozó) ciklus bezárása END LOOP; -- A külső (EgyikDolgozó) ciklus bezárása END LOOP;END;/

SELECT * FROM dolgozó;-- End Of DataLoad_C.sql

DOLGOZÓ Fizetése PARTNER Fizetése===================================7654 1250 7521 12507499 1600 7844 1500

A PL/SQL eljárás sikeresen befejeződött.

EMPNO ENAME JOB PARTNER HIREDATE SAL COMM DEPTNO----- ---------- --------- ------- ---------- ----- ----- ------ 7654 MARTIN SALESMAN 7521 1981-09-28 1250 1400 30 7499 ALLEN SALESMAN 7844 1981-02-20 1600 300 30 7844 TURNER SALESMAN 7499 1981-09-08 1500 0 30 7521 WARD SALESMAN 7654 1981-02-22 1250 500 30 6666 SIGORSZKI SALESMAN 2005-10-30 1250 30

document.doc - 10 -

Page 11: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

D. Hibás Megoldás

Tekintsük az előző, C. Megoldást, ám ezúttal ne a dolgozó táblából, hanem az egyes ciklusok rejtett kurzoraiból kérdezzük le egyszerű értékadással (az adott ciklus ciklusváltozóján keresztül) az aktuális rekord partner értékét (lásd a DataLoad_D.sql szkript programot). Eredményként az alábbi táblát kapjuk:

EMPNO ENAME JOB PARTNER HIREDATE SAL COMM DEPTNO----- ---------- --------- ------- ---------- ----- ----- ------ 7654 MARTIN SALESMAN 7521 1981-09-28 1250 1400 30 7499 ALLEN SALESMAN 7844 1981-02-20 1600 300 30 7844 TURNER SALESMAN 7499 1981-09-08 1500 0 30 7521 WARD SALESMAN 6666 1981-02-22 1250 500 30 6666 SIGORSZKI SALESMAN 7521 2005-10-30 1250 30

Ez láthatóan hibás (Martinnak és Sigorszkinak ugyanaz a partner jutott). Mi a hiba oka?A magyarázat a kurzorok alaptermészetében keresendő:

A kurzorbeli lekérdezés eredménye egy zárt memóriaterületre kerül, melyet nem befolyásol azon adattábla tartalmának megváltozása, melyre a kurzorlekérdezés történt.

document.doc - 11 -

Page 12: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

3. Feladat

3.1. Hozzon létre egy dolgozó nevű táblát az emp tábla rekordjaiból.

3.2. Készítsen triggert a dolgozó táblába történő ellenőrzött adatbevitelhez, ahol az alábbi adatbeviteli feltételeket a trigger által meghívott tárolt alprogramokban vizsgálja meg:

a.) Részleg feltétel: Egy új dolgozó részlegeként csak már létező részleg azonosítója adható meg.

b.) Fizetési feltétel: Egy új dolgozó fizetésként a részlegében és vele azonos munkakörben dolgozók átlagfizetésének legalább a 3/4-ét kapja, ha a részlegében nincs vele azonos munkakörű, akkor a részlegében dolgozók átlagfizetésének 2/3-ánál legalább 300 USD-vel többet, ha pedig a részlegében ő az első dolgozó, akkor legalább 2000 USD-t.

3.3. A trigger és a tárolt eljárások ellenőrzése érdekében végezze el a szükséges adatfelviteleket.

3.4. Az elkészített megoldás a tárolandó dolgozó nevét írja vissza a képernyőre, és sikeres adatfelvitel esetén írja ki a dolgozó nevét, majd az "OK!" üzenetet, míg sikertelen adatfelvitel esetén a "HIBA:" üzenetet, és a sikertelenség okát.

3.5. Utolsó lépésként listázza a dolgozó táblát, majd állítsa vissza az eredeti táblatartalmat.

Megoldás

0. lépés (Az SQL*Plus környezet inicializálása)

-- Az emp tábla inicializálása (ezúttal elhagyjuk)-- @INIT1 -- Feltételezve, hogy az INIT1.sql a BIN könyvtárban van-- A dátum és megjelenítés inicializálásaALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';SET numwidth 5

-- Az esetlegesen létező azonos nevű objektumok törléseDROP VIEW dolgozó;DROP TABLE dolgozó;

-- A PL/SQL kiíratások engedélyezéseSET serveroutput ON;

A munkamenet módosítva.ORA-00942: a tábla vagy a nézet nem létezikORA-00942: a tábla vagy a nézet nem létezik

1. lépés feladata

3.1. Hozzon létre egy dolgozó nevű táblát az emp tábla rekordjaiból.

1. lépés feladatának megoldása

DROP TABLE dolgozó;CREATE TABLE dolgozóASSELECT * FROM emp;SELECT * FROM dolgozó;

ORA-00942: a tábla vagy a nézet nem létezikA tábla létrejött.

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----- ---------- --------- ----- ---------- ----- ----- ------ 7839 KING PRESIDENT 1981-11-17 5000 10 7698 BLAKE MANAGER 7839 1981-05-01 2850 30 7782 CLARK MANAGER 7839 1981-06-09 2450 10 7566 JONES MANAGER 7839 1981-04-02 2975 20 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 7900 JAMES CLERK 7698 1981-12-03 950 30 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 7902 FORD ANALYST 7566 1981-12-03 3000 20

document.doc - 12 -

Page 13: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

7369 SMITH CLERK 7902 1980-12-17 800 20 7788 SCOTT ANALYST 7566 1987-04-19 3000 20 7876 ADAMS CLERK 7788 1987-05-23 1100 20 7934 MILLER CLERK 7782 1982-01-23 1300 10

14 sor kijelölve.

2. lépés feladata

3.2. Készítsen triggert a dolgozó táblába történő ellenőrzött adatbevitelhez, ahol az alábbi adatbeviteli feltételeket a trigger által meghívott tárolt alprogramokban vizsgálja meg:

a.) Részleg feltétel: Egy új dolgozó részlegeként csak már létező részleg azonosítója adható meg.

b.) Fizetési feltétel: Egy új dolgozó fizetésként a részlegében és vele azonos munkakörben dolgozók átlagfizetésének legalább a 3/4-ét kapja, ha a részlegében nincs vele azonos munkakörű, akkor a részlegében dolgozók átlagfizetésének 2/3-ánál legalább 300 USD-vel többet, ha pedig a részlegében ő az első dolgozó, akkor legalább 2000 USD-t.

3.4. Az elkészített megoldás a tárolandó dolgozó nevét írja vissza a képernyőre, és sikeres adatfelvitel esetén írja ki a dolgozó nevét, majd az "OK!" üzenetet, míg sikertelen adatfelvitel esetén a "HIBA:" üzenetet, és a sikertelenség okát.

2. lépés feladatának megoldása

Megjegyzés:m1. A részlegfeltétel ellenőrzése érdekében létre kell hoznunk a részleg táblát is.m2. A 3.4. pontbeli követelményt célszerű a triggerben, illetve a trigger által meghívott tárolt

eljárásokban megvalósítani.

2.1. lépés (A részleg tábla létrehozása)

-- Az esetlegesen létező azonos nevű objektumok törléseDROP VIEW részleg;DROP TABLE részleg;

-- A részleg tábla létrehozásaCREATE TABLE részlegASSELECT * FROM dept;

SELECT * FROM részleg;

ORA-00942: a tábla vagy a nézet nem létezikORA-00942: a tábla vagy a nézet nem létezikA tábla létrejött.

DEPTNO DNAME LOC------ -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON

2.2. lépés (A részlegfeltételt ellenőrző tárolt alprogram létrehozása)

-- A részleglétezést ellenőrző tárolt alprogram-- Ennek két kimenete van attól függően, hogy létezik-e a megadott részleg,-- vagy nem (ez a hiba ág).CREATE OR REPLACE PROCEDURE Részlegfeltétel(RészlegID IN NUMBER)AS Előfordulás INTEGER;BEGIN SELECT COUNT(*) INTO Előfordulás FROM részleg WHERE deptno = RészlegID; IF Előfordulás = 0 -- F-a. FELTÉTEL! THEN RAISE_APPLICATION_ERROR(-20110,

document.doc - 13 -

Page 14: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

'>>HIBA: A Részlegfeltétel nem teljesül!');

document.doc - 14 -

Page 15: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

ELSE DBMS_OUTPUT.PUT_LINE('OK! '|| '(A Részlegfeltétel teljesül.)'); END IF;END;/SHOW ERROR

Az eljárás létrejött.Nincsenek hibák.

2.3. lépés (A fizetési feltételt ellenőrző tárolt alprogram létrehozása)

-- A fizetési feltételt ellenőrző tárolt alprogramban két vizsgálatot kell elvégezni.-- Először azt, hogy van-e már a megadott részlegben dolgozó, vagy nincs,-- Ha van dolgozó, akkor pedig azt, hogy van-e azonos munkakörű, vagy nincs.CREATE OR REPLACE PROCEDURE Fizetésfeltétel(RészlegID IN NUMBER, Munkakör IN VARCHAR2, Fizetés IN NUMBER)IS RészlegbeliDolgozók INTEGER; MunkakörbeliDolgozók INTEGER; RészlegÁtlag dolgozó.sal%TYPE; MunkakörÁtlag dolgozó.sal%TYPE; FizetésHatár dolgozó.sal%TYPE;

BEGIN-- Az új dolgozó részlegében már dolgozók számának meghatározása SELECT COUNT(*) INTO RészlegbeliDolgozók FROM dolgozó WHERE deptno = RészlegID;

-- A fizetés vizsgálata a részlegbeli dolgozók számától függően IF RészlegbeliDolgozók = 0 THEN -- Ekkor az új dolgozó az első dolgozó a részlegében IF Fizetés >= 2000 -- F-b3. FELTÉTEL! THEN DBMS_OUTPUT.PUT_LINE('OK! '|| '(Az új fizetés legalább 2000 USD.)'); ELSE RAISE_APPLICATION_ERROR(-20113, '>>HIBA: Az új fizetés kisebb 2000 USD-nél!'); END IF; ELSE -- Ekkor már vannak mások is az új dolgozó részlegében -- Kérdés: Vannak-e azonos munkakörbeliek is? SELECT COUNT(*) INTO MunkakörbeliDolgozók FROM dolgozó WHERE deptno = RészlegID AND UPPER(job) = UPPER(Munkakör);

-- A fizetés vizsgálata a részlegbeli dolgozók munkakörétől függően IF MunkakörbeliDolgozók = 0 THEN -- Nincs azonos munkakörű a részlegben SELECT AVG(sal) INTO RészlegÁtlag FROM dolgozó GROUP BY deptno HAVING deptno = RészlegID;

FizetésHatár := ROUND(2/3 * RészlegÁtlag) + 300; DBMS_OUTPUT.PUT_LINE('> 2/3 * RészlegÁtlag + 300 = '|| FizetésHatár);

document.doc - 15 -

Page 16: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

IF Fizetés >= FizetésHatár -- F-b2. FELTÉTEL! THEN DBMS_OUTPUT.PUT_LINE('OK! '|| '(Az új fizetés a részlegátlag 2/3-ánál min. 300 USD-vel több.)'); ELSE RAISE_APPLICATION_ERROR(-20112, '>>HIBA: Az új fizetés kisebb, ' || 'mint a részlegátlag 300 USD-vel megnövelt értéke!'); END IF; ELSE -- Van azonos munkakörű a részlegben SELECT AVG(sal) INTO MunkakörÁtlag FROM dolgozó GROUP BY deptno, job HAVING deptno = RészlegID AND UPPER(job) = UPPER(Munkakör);

FizetésHatár := ROUND(3/4 * MunkakörÁtlag); DBMS_OUTPUT.PUT_LINE('> 3/4 * MunkakörÁtlag = '|| FizetésHatár); IF Fizetés >= FizetésHatár -- F-b1. FELTÉTEL! THEN DBMS_OUTPUT.PUT_LINE('OK! '|| '(Az új fizetés a részlegbeli munkaköri átlag 3/4-nél több.)'); ELSE RAISE_APPLICATION_ERROR(-20111, '>>HIBA: Az új fizetés kisebb, ' || 'mint a részlegbeli munkaköri átlag 3/4-e!'); END IF; END IF; END IF;END;/SHOW ERROR

Az eljárás létrejött.Nincsenek hibák.

Megjegyzés

A fenti tárolt eljárásban a SELECT AVG(sal) INTO RészlegÁtlag FROM dolgozó GROUP BY deptno HAVING deptno = RészlegID;

helyett írhattuk volna SELECT AVG(sal) INTO RészlegÁtlag FROM dolgozó WHERE deptno = RészlegID;

valamint a SELECT AVG(sal) INTO MunkakörÁtlag FROM dolgozó GROUP BY deptno, job HAVING deptno = RészlegID AND UPPER(job) = UPPER(Munkakör);

helyett írhattuk volna SELECT AVG(sal) INTO MunkakörÁtlag FROM dolgozó WHERE deptno = RészlegID AND UPPER(job) = UPPER(Munkakör);

document.doc - 16 -

Page 17: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

2.4. lépés (Az adatbevitel-felügyelő trigger létrehozása)

-- A sortrigger a feltételvizsgáló tárolt alprogramokat hívja meg.DROP TRIGGER AdatFelügyelő;CREATE OR REPLACE TRIGGER AdatFelügyelő BEFORE INSERT ON dolgozó FOR EACH ROWBEGIN DBMS_OUTPUT.PUT_LINE ('> A felviendő dolgozó: ' ||:new.ename); Részlegfeltétel(:new.deptno); Fizetésfeltétel(:new.deptno, :new.job, :new.sal); DBMS_OUTPUT.PUT_LINE (:new.ename || ': OK!');END;/SHOW ERROR

ORA-04080: 'ADATFELÜGYELŐ' trigger nem létezikA trigger létrejött.Nincsenek hibák.

3. lépés feladata

3.3. A trigger és a tárolt eljárások ellenőrzése érdekében végezze el a szükséges adatfelviteleket.

3. lépés feladatának megoldása (A felügyelt adatbevitel ellenőrzése)

Az alábbiakban ellenőrizni kell az F-a., F-b1., F-b2. és F-b3. feltételek mindegyikének teljesülését és nem teljesülését. Ennek célszerű módja olyan adatfelviteleket készíteni, melyekben mindig csak egy feltétel nem-teljesülését és teljesülését vizsgáljuk. Mivel az F-a. feltétel teljesülése az összes többihez szükséges, így mindössze hét adatfelvitel szükséges a teljes ellenőrzéshez.

3.1. lépés (Adatlekérdezések az ellenőrzéshez)

-- Részlegenkénti munkaköri átlagok (az F-b1. feltétel vizsgálatához)SELECT deptno AS Részleg, job AS Munkakör, ROUND(AVG(sal)*3/4) AS "RészlegMunkakörÁtlag 3/4-e" FROM dolgozó GROUP BY deptno, job;

RÉSZLEG MUNKAKÖR RészlegMunkakörÁtlag 3/4-e---------- --------- -------------------------- 10 CLERK 975 10 MANAGER 1838 10 PRESIDENT 3750 20 CLERK 713 20 ANALYST 2250 20 MANAGER 2231 30 CLERK 713 30 MANAGER 2138 30 SALESMAN 1050

9 sor kijelölve.

-- Részlegátlagok (az F-b2. feltétel vizsgálatához)SELECT deptno AS Részleg, ROUND(AVG(SAL)*2/3)+300 AS "2/3-ad RészlegÁtlag + 300" FROM dolgozó GROUP BY deptno;

RÉSZLEG 2/3-ad RészlegÁtlag + 300---------- ------------------------- 10 2244 20 1750 30 1344

document.doc - 17 -

Page 18: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

3.2. lépés (Ellenőrzések)

-- 1. Ellenőrzés:-- Az F-a. (Részlegfeltétel) NEM-teljesülésének vizsgálataINSERT INTO dolgozó VALUES(1234,'Péter(a)','SALESMAN',7698,'2005.12.11',2000,NULL,50);

> A felviendő dolgozó: Péter(a)INSERT INTO dolgozó *Hiba a(z) 1. sorban:ORA-20110: >>HIBA: A Részlegfeltétel nem teljesül!ORA-06512: a(z) "SCOTT.RÉSZLEGFELTÉTEL", helyen a(z) 11. sornálORA-06512: a(z) "SCOTT.ADATFELÜGYELŐ", helyen a(z) 3. sornálORA-04088: hiba a(z) 'SCOTT.ADATFELÜGYELŐ' trigger futása közben

-- 2. Ellenőrzés:-- Az F-a. (Részlegfeltétel) teljesülése mellett-- az F-b1. (Fizetési feltétel, RészlegMunkakör Fiz.átlag 3/4-e) vizsgálataINSERT INTO dolgozó VALUES(1234,'János1(b1)','SALESMAN',7698,'2005.12.11',1049,NULL,30);INSERT INTO dolgozó VALUES(1234,'János2(b1)','SALESMAN',7698,'2005.12.11',1050,NULL,30);

> A felviendő dolgozó: János1(b1)OK! (A Részlegfeltétel teljesül.)> 3/4 * MunkakörÁtlag = 1050INSERT INTO dolgozó *Hiba a(z) 1. sorban:ORA-20111: >>HIBA: Az új fizetés kisebb, mint a részlegbeli munkaköri átlag 3/4-e!ORA-06512: a(z) "SCOTT.FIZETÉSFELTÉTEL", helyen a(z) 78. sornálORA-06512: a(z) "SCOTT.ADATFELÜGYELŐ", helyen a(z) 4. sornálORA-04088: hiba a(z) 'SCOTT.ADATFELÜGYELŐ' trigger futása közben

> A felviendő dolgozó: János2(b1)OK! (A Részlegfeltétel teljesül.)> 3/4 * MunkakörÁtlag = 1050OK! (Az új fizetés a részlegbeli munkaköri átlag 3/4-nél több.)János2(b1): OK!

1 sor létrejött.

-- 3. Ellenőrzés:-- Az F-a. (Részlegfeltétel) teljesülése mellett-- az F-b2. (Fizetési feltétel, 2/3-ad RészlegÁtlag + 300) NEM-teljesülésének vizsgálataINSERT INTO dolgozó VALUES(1234,'Éva1(b2)','TANULÓ',7698,'2005.12.11',1749,NULL,20);INSERT INTO dolgozó VALUES(1234,'Éva2(b2)','TANULÓ',7698,'2005.12.11',1750,NULL,20);

> A felviendő dolgozó: Éva1(b2)OK! (A Részlegfeltétel teljesül.)> 2/3 * RészlegÁtlag + 300 = 1750INSERT INTO dolgozó *Hiba a(z) 1. sorban:ORA-20112: >>HIBA: Az új fizetés kisebb, mint a részlegátlag 300 USD-vel megnövelt értéke!ORA-06512: a(z) "SCOTT.FIZETÉSFELTÉTEL", helyen a(z) 57. sornálORA-06512: a(z) "SCOTT.ADATFELÜGYELŐ", helyen a(z) 4. sornálORA-04088: hiba a(z) 'SCOTT.ADATFELÜGYELŐ' trigger futása közben

> A felviendő dolgozó: Éva2(b2)OK! (A Részlegfeltétel teljesül.)> 2/3 * RészlegÁtlag + 300 = 1750OK! (Az új fizetés a részlegátlag 2/3-ánál min. 300 USD-vel több.)Éva2(b2): OK!

1 sor létrejött.

document.doc - 18 -

Page 19: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

-- 4. Ellenőrzés:-- Az F-a. (Részlegfeltétel) teljesülése mellett-- az F-b3. (Fizetési feltétel, a részlegben még nincs dolgozó) NEM-teljesülésének vizsgálataINSERT INTO dolgozó VALUES(1234,'Ágnes1(b3)','SALESMAN',7698,'2005.12.11',1999,NULL,40);INSERT INTO dolgozó VALUES(1234,'Ágnes2(b3)','SALESMAN',7698,'2005.12.11',2000,NULL,40);

> A felviendő dolgozó: Ágnes1(b3)OK! (A Részlegfeltétel teljesül.)INSERT INTO dolgozó *Hiba a(z) 1. sorban:ORA-20113: >>HIBA: Az új fizetés kisebb 2000 USD-nél!ORA-06512: a(z) "SCOTT.FIZETÉSFELTÉTEL", helyen a(z) 27. sornálORA-06512: a(z) "SCOTT.ADATFELÜGYELŐ", helyen a(z) 4. sornálORA-04088: hiba a(z) 'SCOTT.ADATFELÜGYELŐ' trigger futása közben

> A felviendő dolgozó: Ágnes2(b3)OK! (A Részlegfeltétel teljesül.)OK! (Az új fizetés legalább 2000 USD.)Ágnes2(b3): OK!

1 sor létrejött.

4. lépés feladata

3.5. Utolsó lépésként listázza a dolgozó táblát, majd állítsa vissza az eredeti táblatartalmat.

4. lépés feladatának megoldása

-- A dolgozó tábla listázása és adatvisszaállításSELECT * FROM dolgozó;ROLLBACK;SELECT * FROM dolgozó;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- 7839 KING PRESIDENT 1981-11-17 5000 10 7698 BLAKE MANAGER 7839 1981-05-01 2850 30 7782 CLARK MANAGER 7839 1981-06-09 2450 10 7566 JONES MANAGER 7839 1981-04-02 2975 20 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 7900 JAMES CLERK 7698 1981-12-03 950 30 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 7902 FORD ANALYST 7566 1981-12-03 3000 20 7369 SMITH CLERK 7902 1980-12-17 800 20 7788 SCOTT ANALYST 7566 1987-04-19 3000 20 7876 ADAMS CLERK 7788 1987-05-23 1100 20 7934 MILLER CLERK 7782 1982-01-23 1300 10 1234 János2(b1) SALESMAN 7698 2005-12-11 1050 30 1234 Éva2(b2) TANULÓ 7698 2005-12-11 1750 20 1234 Ágnes2(b3) SALESMAN 7698 2005-12-11 2000 40

17 sor kijelölve.

A visszaállítás befejeződött.

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- 7839 KING PRESIDENT 1981-11-17 5000 10 7698 BLAKE MANAGER 7839 1981-05-01 2850 30 7782 CLARK MANAGER 7839 1981-06-09 2450 10 7566 JONES MANAGER 7839 1981-04-02 2975 20 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 7900 JAMES CLERK 7698 1981-12-03 950 30 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 7902 FORD ANALYST 7566 1981-12-03 3000 20

document.doc - 19 -

Page 20: Oracle PL-SQL Összefoglaló Feladatok, Megoldással (2005, 19 Oldal)

7369 SMITH CLERK 7902 1980-12-17 800 20 7788 SCOTT ANALYST 7566 1987-04-19 3000 20 7876 ADAMS CLERK 7788 1987-05-23 1100 20 7934 MILLER CLERK 7782 1982-01-23 1300 10

14 sor kijelölve.

document.doc - 20 -