2012. április 27. TARTALOM



Hasonló dokumentumok
2006. május 1. TARTALOM

Adatbázis használat I. 2. gyakorlat

PL/SQL (folytatás) Kurzorok, függvények, eljárások

ADATBÁZIS HASZNÁLAT I. 4. gyakorlat

Adatbázis használat I. 2. gyakorlat

2007. február 25. TARTALOM

Adatbázis használat I. 5. gyakorlat

Oracle Példatár (SQL-PL/SQL)

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

PL/SQL feladatok 8. gyakorlat

1.1. Feladat Listázza ki a 20-as részleg dolgozóinak nevét, belépési idejét, foglalkozását a nevek szerint csökkenően rendezve.

Tranzakciókezelés PL/SQL-ben

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

B IT MAN 65/1. Adatbázis Rendszerek II. Ellenőrző kérdések APLSQL B IT MAN. v:

Haladó DBMS ismeretek 1

PL/SQL 1. rész. Procedural Language extension to SQL

KENDE MÁRIA NAGY ISTVÁN: Oracle Példatár(SQL-PL/SQL) Házi feladatok a 3.gyakorlathoz: 1. fejezet: Egyszerű lekérdezések

SELECT DISTINCT deptno FROM emp; (distinct) SELECT STATEMENT HASH UNIQUE TABLE ACCESS FULL EMP

A trigger egy aktualizálási művelet esetén végrehajtandó programrészletet definiál. Alakja:

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

2012. április 13. TARTALOM

B I T M A N B I v: T M A N

Adatbázis Rendszerek II. 2. Ea: Gyakorló környezet

Kalmár György Adatbázis alapú rendszerek

Adatbázisok I. Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

Adatbázis Rendszerek II. 2. Gyakorló környezet

SQL PÉLDATÁR. készült a PTE TTK Iskolai informatika III. kurzus teljesítésére

Gyakorlás: Hozzunk létre egy Alkalmazottak táblát AZO szám, Részleg szöveg, Munkakör szöveg és BelépésDátuma dátum típussal.

SQL. Táblák összekapcsolása lekérdezéskor Aliasok Allekérdezések Nézettáblák

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

Adatbázis rendszerek SQL nyomkövetés

Együttes hozzárendelés

Adatbázis-lekérdezés. Az SQL nyelv. Makány György

ORACLE. SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

ADATBÁZIS-KEZELÉS FÉLÉVES FELADAT

Adatbázis kezelés Delphiben. SQL lekérdezések

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

Adattípusok. Max. 2GByte

Adatbázis Rendszerek II. 6. PLSQL Triggerek 32/1B IT MAN

B I T M A N B I v: T M A N

Adattípusok. Max. 2GByte

ADATBÁZISOK gyakorlat: SQL 2. rész SELECT

Adatbázisok* tulajdonságai

LBRA6i integrált rendszer

Triggerek. Olyan névvel ellátott adatbázisobjektumok, amelyek eseményorientált feldolgozást tesznek lehetővé

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

Adatbázis használat I. 1. gyakorlat

Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2

Adatbázisok II. Jánosi-Rancz Katalin Tünde 327A 1-1

SQL DDL-2 (aktív elemek) triggerek

SQL parancsok feldolgozása

BGF. 4. Mi tartozik az adatmodellek szerkezeti elemei

Adatbázis-kezelés, információs-rendszerek

Adatbázisok elmélete 9. előadás

A relációs adatbáziskezelés szabványos nyelve Két fő csoportba sorolhatók az utasításai

Debreceni Egyetem Informatikai Kar TANULÓI NYILVÁNTARTÓ SZOFTVER FIREBIRD ADATBÁZIS ALKALMAZÁSÁVAL

Adatbázisok elmélete 9. előadás

B I T M A N B I v: T M A N

Adatbázis Rendszerek II. 4. PLSQL Kurzorok, hibakezelés 53/1B IT MAN

A könyv tartalomjegyzéke

Adatbázisok I. Az SQL nyelv

Az indexelés újdonságai Oracle Database 12c R1 és 12c R2

ADATBÁZISOK I. Az esetleges hibákat kérlek a csongor@csongorbokay.com címen jelezd! Utolsó módosítás: március 20.


Adatbázis Rendszerek II. 8. Gyakorló környezet

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)

Java és web programozás

Összefoglaló. <variable_name> [IN OUT IN OUT] <data_type> [:=<default_value>] ... <label_name>: <statements>... GOTO <label_name>;...

Készítette: Szabóné Nacsa Rozália

5. téma XML DB. Az adatkezelés és XML kapcsolata. Miért fontos az XML használata az adatbázis kezelésben?

Az SQL*Plus használata

Tábla létrehozása: CREATE TABLE alma( ID INT( 3 ) NOT NULL PRIMARY KEY, Leiras VARCHAR( 100 ) );

Táblakezelés: Open SQL Internal table. Tarcsi Ádám: Az SAP programozása 1.

SQL haladó. Külső összekapcsolások, Csoportosítás/Összesítés, Beszúrás/Törlés/Módosítás, Táblák létrehozása/kulcs megszorítások

Adatbázisok. 2. gyakorlat SQL november november 12. Adatbázisok 1 / 31

PL/SQL blokk. [címke] [DECLARE deklarációs utasítás(ok)] BEGIN végrehajtható utasítás(ok) [EXCEPTION kivételkezelő] END [név];

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE) október október 22. Adatbázisok 1 / 14

Relációs algebra áttekintés és egy táblára vonatkozó lekérdezések

Az SQL nyelv Structured Query Language (Struktúrált lekérdező nyelv)

OO PDO. Tehát PDO használatával, könnyen átállhatunk egy másik adatbáziskezelőre, anélkül hogy a kódot teljes egészében újraírnánk.

BEVEZETÉS Az objektum fogalma

Adatbázisban tárolt kollekciók

Adatbázis-kezelés. Harmadik előadás

SQL- Utasítások csoportosítása Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

Adatbázisok elleni fenyegetések rendszerezése. Fleiner Rita BMF/NIK Robothadviselés 2009

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlaton a következőket fogjuk gyakorolni:

Adatbázisok elmélete 10. előadás

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2( Adatbázisrendszerek 2) 3. Előadás: Tárolt eljárások (folytatás) Nézetek

SQL jogosultság-kezelés. Privilégiumok Grant és Revoke Grant Diagrammok

Adatbázisok. 9. gyakorlat SQL: SELECT október október 26. Adatbázisok 1 / 14

A PL/SQL motor. A PL/SQL nyelvű egységek fordítását és futtatását végző rendszer. az adatbázis-kezelőben fejlesztőeszközben (pl.

Elemi alkalmazások fejlesztése IV.

Adatbázisok I A relációs algebra

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

Adatbázisok-1 előadás Előadó: dr. Hajas Csilla

INFORMATIKAI ALAPISMERETEK

Adatbázisok I. Jánosi-Rancz Katalin Tünde 327A 1-1

Átírás:

KENDE MÁRIA - NAGY ISTVÁN PL/SQL FELADATGYŰJTEMÉNY TARTALOM 9. Foglalkozás Hivatkozási és összetett adattípusok, kurzor, ROWID... 2 10. Foglalkozás Összefoglaló feladatok... 15 Melléklet Dinamikus SQL... 35 Irodalom... 37 2012. április 27. #13_PL-SQL Feladatgyűjtemény (07) - 1 -

9. Foglalkozás Hivatkozási és összetett adattípusok, kurzor, ROWID Részletesebben lásd [2]: 9. fejezet, FELADATGYŰJTEMÉNY 9.1. Feladat Írjon egy olyan PL/SQL programot, amely az emp táblából létrehoz egy dolgozó táblát, és minden dolgozó fizetését megemeli a saját fizetésének véletlenszám (0-100) értékű százalékával. 9.2. Feladat Írjon PL/SQL programot, amely az emp táblából létrehoz egy dolgozó táblát, és megnöveli a felhasználó által megadott azonosítójú főnök minden beosztottjának fizetését azok átlagfizetésének 10%-val. 9.3. Feladat Írjon PL/SQL programot, mely az emp táblából létrehoz egy dolgozó táblát, és megnöveli a felhasználó által megadott nevű főnök minden beosztottjának fizetését azok átlagfizetésének 10%-val. 9.4. Feladat Írjon egy PL/SQL szkript programot az alábbi feladatok megoldására: Hozzon létre egy dolgozó nevű táblát az emp táblának a felhasználó által megadott telephelyű (loc) 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.) Ellenőrizze a megoldást új dolgozó felvitelével, és a partnerkeresés megismétlésével. TOVÁBBI FELADATOK T9.5. Feladat Írjon egy olyan PL/SQL programot, amely az emp táblából létrehoz egy dolgozó táblát és bővíti egy nyeremény oszloppal. A nyeremény a beosztottak számára a főnökök átlagfizetésének véletlenszerű százaléka (0-50), a főnököknek pedig a beosztottak összfizetésének véletlenszerű százaléka (10-50). Listázza a dolgozó táblát a nyereményhúzás előtt és után is. T9.6. Feladat Írjon egy olyan PL/SQL programot, amely az emp táblából létrehoz egy dolgozó táblát és bővíti egy pár nevű oszloppal. Ezt az oszlopot töltse fel az oooo karaktersorozattal. Egy kereső dolgozó partnere az, aki ugyanabban a munkakörben dolgozik és páros hónapban lépett be. Írja be kereső pár oszlopába a megtalált partner nevét, illetve a partner pár oszlopába a kereső nevét. Egy partner csak egyszer fordulhat elő. #13_PL-SQL Feladatgyűjtemény (07) - 2 -

MEGOLDÁSGYŰJTEMÉNY 9.1. Feladat Írjon egy olyan PL/SQL programot, amely az emp táblából létrehoz egy dolgozó táblát, és minden dolgozó fizetését megemeli a saját fizetésének véletlenszám (0-100) értékű százalékával. Megoldás 1. A tábla létrehozása SET numwidth 5 DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT * FROM emp; SELECT * ; SET serveroutput ON DECLARE szorzo NUMBER; CURSOR dolgozo IS SELECT empno,sal ; BEGIN FOR i IN dolgozo LOOP szorzo := ROUND(DBMS_RANDOM.VALUE(0,100)/100,2); DBMS_OUTPUT.PUT_LINE('A szorzó értéke: ' szorzo ' 'emelés értéke:' (i.sal * szorzo)); SET sal = sal + (sal * szorzo) WHERE empno = i.empno; END LOOP; END; / ' SELECT * ; SET numwidth 10 Eredmény A tábla eldobva. A tábla létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- --------- ----- ----- ------ 7369 SMITH CLERK 7902 80-DEC-17 800 20 7499 ALLEN SALESMAN 7698 81-FEB-20 1600 300 30 7521 WARD SALESMAN 7698 81-FEB-22 1250 500 30 7566 JONES MANAGER 7839 81-ÁPR-02 2975 20 7654 MARTIN SALESMAN 7698 81-SZE-28 1250 1400 30 7698 BLAKE MANAGER 7839 81-MÁJ-01 2850 30 7782 CLARK MANAGER 7839 81-JÚN-09 2450 10 7788 SCOTT ANALYST 7566 87-ÁPR-19 3000 20 7839 KING PRESIDENT 81-NOV-17 5000 10 7844 TURNER SALESMAN 7698 81-SZE-08 1500 0 30 7876 ADAMS CLERK 7788 87-MÁJ-23 1100 20 7900 JAMES CLERK 7698 81-DEC-03 950 30 #13_PL-SQL Feladatgyűjtemény (07) - 3 -

7902 FORD ANALYST 7566 81-DEC-03 3000 20 7934 MILLER CLERK 7782 82-JAN-23 1300 10 14 sor kijelölve. A szorzó értéke:,71 A szorzó értéke:,28 A szorzó értéke:,71 A szorzó értéke:,34 A szorzó értéke:,12 A szorzó értéke:,99 A szorzó értéke:,66 A szorzó értéke:,65 A szorzó értéke:,54 A szorzó értéke:,95 A szorzó értéke:,7 A szorzó értéke:,48 A szorzó értéke:,76 A szorzó értéke:,37 emelés értéke:568 emelés értéke:448 emelés értéke:887,5 emelés értéke:1011,5 emelés értéke:150 emelés értéke:2821,5 emelés értéke:1617 emelés értéke:1950 emelés értéke:2700 emelés értéke:1425 emelés értéke:1783,6 emelés értéke:456 emelés értéke:2280 emelés értéke:481 A PL/SQL eljárás sikeresen befejeződött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ---------- ----- ----- ------ 7369 SMITH CLERK 7902 1980-12-17 1368 20 7499 ALLEN SALESMAN 7698 1981-02-20 2048 300 30 7521 WARD SALESMAN 7698 1981-02-22 2138 500 30 7566 JONES MANAGER 7839 1981-04-02 3987 20 7654 MARTIN SALESMAN 7698 1981-09-28 1400 1400 30 7698 BLAKE MANAGER 7839 1981-05-01 5672 30 7782 CLARK MANAGER 7839 1981-06-09 4067 10 7788 SCOTT ANALYST 7566 1987-04-19 4950 20 7839 KING PRESIDENT 1981-11-17 7700 10 7844 TURNER SALESMAN 7698 1981-09-08 2925 0 30 7876 ADAMS CLERK 7788 1987-05-23 4332 20 7900 JAMES CLERK 7698 1981-12-03 1406 30 7902 FORD ANALYST 7566 1981-12-03 5280 20 7934 MILLER CLERK 7782 1982-01-23 1781 10 14 sor kijelölve. 9.2. Feladat Írjon PL/SQL programot, amely az emp táblából létrehoz egy dolgozó táblát, és megnöveli a felhasználó által megadott azonosítójú főnök minden beosztottjának fizetését azok átlagfizetésének 10%-val. Megoldás SET numwidth 5 SET serveroutput ON ACCEPT azonositó PROMPT 'Kérem a főnök azonosítóját: ' DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT * FROM emp; SELECT * ; CREATE OR REPLACE VIEW megadott(dempno,dname,djob,dmgr,dhiredate, dsal,dcomm,ddeptno, átlag) AS SELECT dolgozó.*, átlag, (SELECT ROUND(AVG(sal)) AS átlag, mgr AS azon GROUP BY mgr HAVING mgr = &azonositó) al #13_PL-SQL Feladatgyűjtemény (07) - 4 -

WHERE al.azon = dolgozó.mgr; SELECT * FROM megadott; BEGIN SET sal = sal + 0.1 * (SELECT DISTINCT átlag FROM megadott) WHERE mgr = (SELECT DISTINCT dmgr FROM megadott); END; / SELECT * ; SET numwidth 10 Eredmény Kérem a főnök azonosítóját: 7698 A tábla eldobva. A tábla létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ---------- ----- ----- ------ 7369 SMITH CLERK 7902 1980-12-17 800 20 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 7566 JONES MANAGER 7839 1981-04-02 2975 20 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 7698 BLAKE MANAGER 7839 1981-05-01 2850 30 7782 CLARK MANAGER 7839 1981-06-09 2450 10 7788 SCOTT ANALYST 7566 1987-04-19 3000 20 7839 KING PRESIDENT 1981-11-17 5000 10 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 7876 ADAMS CLERK 7788 1987-05-23 2548 20 7900 JAMES CLERK 7698 1981-12-03 950 30 7902 FORD ANALYST 7566 1981-12-03 3000 20 7934 MILLER CLERK 7782 1982-01-23 1300 10 14 sor kijelölve. régi 9: HAVING mgr = &azonositó) al új 9: HAVING mgr = 7698) al A nézet létrejött. DEMPNO DNAME DJOB DMGR DHIREDATE DSAL DCOMM DDEPTNO ÁTLAG ------ ---------- --------- ----- ---------- ----- ----- ------- ----- 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 1310 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 1310 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 1310 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 1310 7900 JAMES CLERK 7698 1981-12-03 950 30 1310 5 sor kijelölve. 5 sor módosítva. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ---------- ----- ----- ------ 7369 SMITH CLERK 7902 1980-12-17 800 20 7499 ALLEN SALESMAN 7698 1981-02-20 1731 300 30 7521 WARD SALESMAN 7698 1981-02-22 1381 500 30 7566 JONES MANAGER 7839 1981-04-02 2975 20 7654 MARTIN SALESMAN 7698 1981-09-28 1381 1400 30 7698 BLAKE MANAGER 7839 1981-05-01 2850 30 #13_PL-SQL Feladatgyűjtemény (07) - 5 -

7782 CLARK MANAGER 7839 1981-06-09 2450 10 7788 SCOTT ANALYST 7566 1987-04-19 3000 20 7839 KING PRESIDENT 1981-11-17 5000 10 7844 TURNER SALESMAN 7698 1981-09-08 1631 0 30 7876 ADAMS CLERK 7788 1987-05-23 2548 20 7900 JAMES CLERK 7698 1981-12-03 1081 30 7902 FORD ANALYST 7566 1981-12-03 3000 20 7934 MILLER CLERK 7782 1982-01-23 1300 10 14 sor kijelölve. 9.3. Feladat Írjon PL/SQL programot, mely az emp táblából létrehoz egy dolgozó táblát, és megnöveli a felhasználó által megadott nevű főnök minden beosztottjának fizetését azok átlagfizetésének 10%-val. Megoldás1 SET numwidth 5; BREAK ON mgr DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT * FROM emp; SELECT * ; Eredmény A tábla eldobva. A tábla létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ---------- ----- ----- ------ 7369 SMITH CLERK 7902 1980-12-17 800 20 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 7521 WARD SALESMAN 1981-02-22 1250 500 30 7566 JONES MANAGER 7839 1981-04-02 2975 20 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 7698 BLAKE MANAGER 7839 1981-05-01 2850 30 7782 CLARK MANAGER 1981-06-09 2450 10 7788 SCOTT ANALYST 7566 1987-04-19 3000 20 7839 KING PRESIDENT 1981-11-17 5000 10 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 7876 ADAMS CLERK 7788 1987-05-23 2548 20 7900 JAMES CLERK 7698 1981-12-03 950 30 7902 FORD ANALYST 7566 1981-12-03 3000 20 7934 MILLER CLERK 7782 1982-01-23 1300 10 14 sor kijelölve. 1. Lépés. Hozzunk létre egy nézetet a beosztottak átlagának kiszámítására. CREATE OR REPLACE VIEW beoátlag AS SELECT mgr, ROUND(AVG(sal)) AS átlag WHERE mgr IS NOT NULL GROUP BY mgr; SELECT * FROM beoátlag; Eredmény A nézet létrejött. #13_PL-SQL Feladatgyűjtemény (07) - 6 -

MGR ÁTLAG ----- ----- 7566 3000 7698 1310 7782 1300 7788 2548 7839 2758 7902 800 6 sor kijelölve. 2. Lépés. Nézet létrehozása a dolgozó, főnök adataival és az átlaggal együtt. CREATE OR REPLACE VIEW BEOSZT AS SELECT d.empno AS dazon, d.ename AS dnév, f.empno AS fazon, f.ename AS fnév, átlag d, dolgozó f, Beoátlag beo WHERE d.mgr = f.empno(+) AND f.empno = beo.mgr; SELECT * FROM beoszt; Eredmény A nézet létrejött. DAZON DNÉV FAZON FNÉV ÁTLAG ----- ---------- ----- ---------- ----- 7788 SCOTT 7566 JONES 3000 7902 FORD 7566 JONES 3000 7499 ALLEN 7698 BLAKE 1310 7521 WARD 7698 BLAKE 1310 7654 MARTIN 7698 BLAKE 1310 7844 TURNER 7698 BLAKE 1310 7900 JAMES 7698 BLAKE 1310 7934 MILLER 7782 CLARK 1300 7876 ADAMS 7788 SCOTT 2548 7566 JONES 7839 KING 2758 7698 BLAKE 7839 KING 2758 7782 CLARK 7839 KING 2758 7369 SMITH 7902 FORD 800 13 sor kijelölve. 2. Lépés. Írjuk meg a növelést mindazoknak, akik a felhasználó által megadott főnök beosztottai, és listázzuk főnökazonosító szerint rendezve. ACCEPT név PROMPT 'Kérem a főnök nevét: ' BEGIN SET sal = sal + 0.1 * (SELECT DISTINCT átlag FROM beoszt WHERE UPPER(fnév) = UPPER('&név')) WHERE dolgozó.mgr IN (SELECT fazon FROM beoszt WHERE UPPER(fnév) = UPPER('&név')); END; / SELECT * ORDER BY mgr; SET numwidth 10 CLEAR BREAKS #13_PL-SQL Feladatgyűjtemény (07) - 7 -

Eredmény Kérem a főnök nevét: blake régi 6: WHERE UPPER(fnév) = UPPER('&név')) új 6: WHERE UPPER(fnév) = UPPER('blake')) régi 9: WHERE UPPER(fnév) = UPPER('&név')); új 9: WHERE UPPER(fnév) = UPPER('blake')); A PL/SQL eljárás sikeresen befejeződött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ---------- ----- ----- ------ 7788 SCOTT ANALYST 7566 1987-04-19 3000 20 7902 FORD ANALYST 1981-12-03 3000 20 7499 ALLEN SALESMAN 7698 1981-02-20 1731 300 30 7521 WARD SALESMAN 1981-02-22 1381 500 30 7900 JAMES CLERK 1981-12-03 1081 30 7844 TURNER SALESMAN 1981-09-08 1631 0 30 7654 MARTIN SALESMAN 1981-09-28 1381 1400 30 7934 MILLER CLERK 7782 1982-01-23 1300 10 7876 ADAMS CLERK 7788 1987-05-23 2548 20 7566 JONES MANAGER 7839 1981-04-02 2975 20 7782 CLARK MANAGER 1981-06-09 2450 10 7698 BLAKE MANAGER 1981-05-01 2850 30 7369 SMITH CLERK 7902 1980-12-17 800 20 7839 KING PRESIDENT 1981-11-17 5000 10 14 sor kijelölve. Megoldás2 SET numwidth 5 ACCEPT név PROMPT 'Kérem a főnök nevét: ' DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT * FROM emp; SELECT * ; CREATE OR REPLACE VIEW megadott(dempno,dname,djob,dmgr,dhiredate,dsal,dcomm,ddeptno,átlag) AS SELECT dolgozó.*, átlag, (SELECT ROUND(AVG(sal)) AS átlag, mgr AS azon GROUP BY mgr) al WHERE al.azon = dolgozó.mgr; SELECT * FROM megadott; CREATE OR REPLACE VIEW fönöknév(azon,fnév) AS SELECT DISTINCT főnök.empno, főnök.ename FROM emp dolg, emp főnök WHERE dolg.mgr = főnök.empno(+); SELECT * FROM fönöknév; CREATE OR REPLACE VIEW jo(fnév,azonos,dnév,átlag) AS SELECT fnév, dempno, dname, #13_PL-SQL Feladatgyűjtemény (07) - 8 -

átlag FROM fönöknév, megadott WHERE UPPER(fnév) = UPPER('&név') AND azon = dmgr; SELECT * FROM jo; CREATE OR REPLACE VIEW növ(emeles) AS SELECT DISTINCT 0.1*átlag FROM jo; SELECT * FROM növ; BEGIN SET sal = sal + (SELECT emeles FROM növ) WHERE empno = (SELECT azonos FROM jo WHERE dolgozó.ename = dnév); END; / SELECT * ; Eredmény Kérem a főnök nevét: blake A tábla eldobva. A tábla létrejött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ---------- ----- ----- ------ 7369 SMITH CLERK 7902 1980-12-17 800 20 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 7566 JONES MANAGER 7839 1981-04-02 2975 20 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 7698 BLAKE MANAGER 7839 1981-05-01 2850 30 7782 CLARK MANAGER 7839 1981-06-09 2450 10 7788 SCOTT ANALYST 7566 1987-04-19 3000 20 7839 KING PRESIDENT 1981-11-17 5000 10 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 7876 ADAMS CLERK 7788 1987-05-23 2548 20 7900 JAMES CLERK 7698 1981-12-03 950 30 7902 FORD ANALYST 7566 1981-12-03 3000 20 7934 MILLER CLERK 7782 1982-01-23 1300 10 14 sor kijelölve. A nézet létrejött. DEMPNO DNAME DJOB DMGR DHIREDATE DSAL DCOMM DDEPTNO ÁTLAG ------ ---------- --------- ----- ---------- ----- ----- ------- ----- 7902 FORD ANALYST 7566 1981-12-03 3000 20 3000 7788 SCOTT ANALYST 7566 1987-04-19 3000 20 3000 7900 JAMES CLERK 7698 1981-12-03 950 30 1310 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 30 1310 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 1310 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30 1310 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 1310 7934 MILLER CLERK 7782 1982-01-23 1300 10 1300 7876 ADAMS CLERK 7788 1987-05-23 2548 20 2548 7782 CLARK MANAGER 7839 1981-06-09 2450 10 2758 7698 BLAKE MANAGER 7839 1981-05-01 2850 30 2758 7566 JONES MANAGER 7839 1981-04-02 2975 20 2758 7369 SMITH CLERK 7902 1980-12-17 800 20 800 13 sor kijelölve. #13_PL-SQL Feladatgyűjtemény (07) - 9 -

A nézet létrejött. régi 6: WHERE UPPER(fnév) =UPPER('&név') AND új 6: WHERE UPPER(fnév) =UPPER('blake') AND A nézet létrejött. FNÉV AZONOS DNÉV ÁTLAG ---------- ------ ---------- ----- BLAKE 7499 ALLEN 1310 BLAKE 7521 WARD 1310 BLAKE 7654 MARTIN 1310 BLAKE 7844 TURNER 1310 BLAKE 7900 JAMES 1310 5 sor kijelölve. A nézet létrejött. A PL/SQL eljárás sikeresen befejeződött. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ---------- ----- ----- ------ 7369 SMITH CLERK 7902 1980-12-17 800 20 7499 ALLEN SALESMAN 7698 1981-02-20 1731 300 30 7521 WARD SALESMAN 7698 1981-02-22 1381 500 30 7566 JONES MANAGER 7839 1981-04-02 2975 20 7654 MARTIN SALESMAN 7698 1981-09-28 1381 1400 30 7698 BLAKE MANAGER 7839 1981-05-01 2850 30 7782 CLARK MANAGER 7839 1981-06-09 2450 10 7788 SCOTT ANALYST 7566 1987-04-19 3000 20 7839 KING PRESIDENT 1981-11-17 5000 10 7844 TURNER SALESMAN 7698 1981-09-08 1631 0 30 7876 ADAMS CLERK 7788 1987-05-23 2548 20 7900 JAMES CLERK 7698 1981-12-03 1081 30 7902 FORD ANALYST 7566 1981-12-03 3000 20 7934 MILLER CLERK 7782 1982-01-23 1300 10 14 sor kijelölve. 9.4. Feladat Írjon egy PL/SQL szkript programot az alábbi feladatok megoldására: Hozzon létre egy dolgozó nevű táblát az emp táblának a felhasználó által megadott telephelyű (loc) 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.) Ellenőrizze a megoldást új dolgozó felvitelével, és a partnerkeresés megismétlésével. 1. Megoldás (Explicit Kurzorral) ------------------------------------- -- Pari1.sql -- MEGOLDÁS (Explicit Kurzorral) ------------------------------------- SET serveroutput ON ACCEPT th PROMPT 'Telephely: ' ACCEPT fizk PROMPT 'FizetésKülönbség: ' #13_PL-SQL Feladatgyűjtemény (07) - 10 -

DROP TABLE dolgozo; CREATE TABLE dolgozo AS SELECT * FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE loc = UPPER('&th')); ALTER TABLE dolgozo RENAME COLUMN mgr TO partner; UPDATE dolgozo SET partner = NULL; SELECT * FROM dolgozo; DECLARE CURSOR KurzorA IS SELECT * FROM dolgozo FOR UPDATE; CURSOR KurzorB IS SELECT * FROM dolgozo FOR UPDATE; AR dolgozo%rowtype; BR dolgozo%rowtype; FK emp.sal%type; BEGIN FK := &fizk; OPEN KurzorA; LOOP FETCH KurzorA INTO AR; EXIT WHEN KurzorA%NOTFOUND; SELECT partner INTO AR.partner FROM dolgozo WHERE dolgozo.empno=ar.empno; IF AR.partner IS NULL THEN OPEN KurzorB; LOOP FETCH KurzorB INTO BR; EXIT WHEN KurzorB%NOTFOUND; SELECT partner INTO BR.partner FROM dolgozo WHERE dolgozo.empno=br.empno; IF (BR.partner IS NULL) AND (BR.empno!= AR.empno) AND (ABS(AR.sal-BR.sal) <= FK) THEN DBMS_OUTPUT.PUT_LINE(AR.empno); DBMS_OUTPUT.PUT_LINE(BR.empno); UPDATE dolgozo SET partner = AR.empno WHERE CURRENT OF KurzorB; UPDATE dolgozo SET partner = BR.empno WHERE CURRENT OF KurzorA; DBMS_OUTPUT.PUT_LINE('----------'); #13_PL-SQL Feladatgyűjtemény (07) - 11 -

END; / EXIT; END IF; END LOOP; CLOSE KurzorB; END IF; END LOOP; CLOSE KurzorA; SELECT * FROM dolgozo; ------------------------------------- 2. Megoldás (Implicit Kurzorral) ------------------------------------- -- Pari2.sql -- MEGOLDÁS (Implicit Kurzorral) ------------------------------------- SET serveroutput ON ACCEPT th PROMPT 'Telephely: ' ACCEPT fizk PROMPT 'FizetésKülönbség: ' DROP TABLE dolgozo; CREATE TABLE dolgozo AS SELECT * FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE loc = UPPER('&th')); ALTER TABLE dolgozo RENAME COLUMN mgr TO partner; UPDATE dolgozo SET partner = NULL; SELECT * FROM dolgozo; DECLARE FK emp.sal%type; BEGIN FK := &fizk; FOR AR IN (SELECT * FROM dolgozo) LOOP SELECT partner INTO AR.partner FROM dolgozo WHERE dolgozo.empno=ar.empno; IF AR.partner IS NULL THEN FOR BR IN (SELECT * FROM dolgozo) LOOP SELECT partner INTO BR.partner FROM dolgozo WHERE dolgozo.empno=br.empno; IF (BR.partner IS NULL) AND #13_PL-SQL Feladatgyűjtemény (07) - 12 -

END; / (BR.empno!= AR.empno) AND (ABS(AR.sal-BR.sal) <= FK) THEN DBMS_OUTPUT.PUT_LINE(AR.empno); DBMS_OUTPUT.PUT_LINE(BR.empno); UPDATE dolgozo SET partner = AR.empno WHERE dolgozo.empno=br.empno; UPDATE dolgozo SET partner = BR.empno WHERE dolgozo.empno=ar.empno; DBMS_OUTPUT.PUT_LINE('----------'); EXIT; END IF; END LOOP; END IF; END LOOP; SELECT * FROM dolgozo; ------------------------------------- Futási eredmény (mindkét esetben) SQL> @pari1 vagy @pari2 Telephely: dallas FizetésKülönbség: 1000 A tábla eldobva. régi 6: WHERE loc = UPPER('&th')) új 6: WHERE loc = UPPER('dallas')) A tábla létrejött. A tábla módosítva. 5 sor módosítva. EMPNO ENAME JOB PARTNER HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- 7566 JONES MANAGER 1981-04-02 2975 20 7902 FORD ANALYST 1981-12-03 3000 20 7369 SMITH CLERK 1980-12-17 800 20 7788 SCOTT ANALYST 1982-12-09 3000 20 7876 ADAMS CLERK 1983-01-12 1100 20 5 sor kijelölve. régi 12: FK := &fizk; új 12: FK := 1000; 7566 7902 ---------- 7369 7876 ---------- #13_PL-SQL Feladatgyűjtemény (07) - 13 -

A PL/SQL eljárás sikeresen befejeződött. EMPNO ENAME JOB PARTNER HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- 7566 JONES MANAGER 7902 1981-04-02 2975 20 7902 FORD ANALYST 7566 1981-12-03 3000 20 7369 SMITH CLERK 7876 1980-12-17 800 20 7788 SCOTT ANALYST 1982-12-09 3000 20 7876 ADAMS CLERK 7369 1983-01-12 1100 20 5 sor kijelölve. #13_PL-SQL Feladatgyűjtemény (07) - 14 -

10. Foglalkozás Összefoglaló Feladatok Részletesebben lásd [2]: 9., és 10. fejezet FELADATGYŰJTEMÉNY 10.1. 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. 10.2. Feladat Hozzon létre egy dolgozó nevű táblát az emp tábla rekordjaiból, és bővítse egy partner nevű oszloppal, melynek típusa egyezzen meg az ename oszlop típusával. Készítsen egy SQL*Plus programba ágyazott PL/SQL blokkot, amely megkisérli a dolgozókat párosítani az alábbi szempontok alapján: - minden dolgozó táblabeli dolgozó partnere csak dolgozó táblabeli dolgozó lehet, - önmagának senki nem lehet partnere, - mindenki legfeljebb egy valakinek lehet partnere, - két dolgozó partnere lehet egymásnak, ha ugyanaz a főnökük és megegyezik a munkakörük. 10.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. #13_PL-SQL Feladatgyűjtemény (07) - 15 -

MEGOLDÁSGYŰJTEMÉNY 10.1. 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ása ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'; SET numwidth 5 -- Az esetlegesen létező azonos nevű objektumok törlése DROP VIEW dolgozó; DROP TABLE dolgozó; A munkamenet módosítva. ORA-00942: a tábla vagy a nézet nem létezik ORA-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ézet AS SELECT * FROM emp WHERE LOWER(job) = 'salesman'; SELECT * FROM DolgozóNézet; DROP TABLE dolgozó; CREATE TABLE dolgozó AS SELECT 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 * ; 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 #13_PL-SQL Feladatgyűjtemény (07) - 16 -

----- ---------- --------- ----- ---------- ----- ----- ------ 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; -- A partner mező ezúttal az alábbi törlés nélkül is üres SET partner = NULL; SELECT * ; 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ása CREATE 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 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ás SET partner = (SELECT PartnerID FROM PartnerKeresés WHERE DolgozóID = empno); SELECT * ; 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. #13_PL-SQL Feladatgyűjtemény (07) - 17 -

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 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 1250 8 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ása SET partner = NULL; -- A partner mező beállítása (feltöltése) SET partner = (SELECT MaxPartnerID FROM (SELECT DolgozóID, MAX(PartnerID) AS MaxPartnerID FROM PartnerKeresés GROUP BY DolgozóID) WHERE DolgozóID = empno); SELECT * ; 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 #13_PL-SQL Feladatgyűjtemény (07) - 18 -

>> 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.) -- ÚJABB PRÓBÁLKOZÁS 2. -- A partner mező inicializálása SET partner = NULL; -- A partner mező beállítása (feltöltése) 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 ); SELECT * ; 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.) #13_PL-SQL Feladatgyűjtemény (07) - 19 -

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 ON DECLARE v_egyik dolgozó.partner%type; v_másik dolgozó.partner%type; BEGIN -- A dolgozó tábla inicializálása 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 ) LOOP -- A partner azonosító lekérdezése a külső ciklus számára: SELECT partner INTO v_egyik 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 ) LOOP -- A partner azonosító lekérdezése a belső ciklus számára: SELECT partner INTO v_másik 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, #13_PL-SQL Feladatgyűjtemény (07) - 20 -