8.FELADATSOR (INFORMÁCIÓS RENDSZEREK)
   
   Témakör: SQL DML, táblák tartalmának módosítása: delete, update, insert
   +ehhez szükséges a tranzakció-kezelés: commit, rollback, savepoint
   >> Lásd EA+ Ullman-Widom Tankönyv 6.5.-6.6. szakasz [ 6.ea.pdf /1.rész]
   >> [ kiegészítés: Oracle segédanyagok: SQL09_DML.pdf ]
 
   FELADATSOR: dolgozo, osztaly (SQL DML: DELETE, INSERT és UPDATE)
   Előkészítés: Ezekhez a DML feladatokhoz ámenetileg most megszorítások
   (mint például hivatkozási épség) megadása nélkül hozzuk létre a táblákat.
   -- Emlékeztető: Dolgozo, Osztaly, Fiz_Kategoria: createDolg+Constraints  
    A módosítást egy másodpéldányon (oszt2, dolg2, fizkat2) végezzük, hogy
    a tábla eredeti tartalma megmaradjon és a megszorítások se zavarjanak.
 
DROP TABLE fizkat2;
DROP TABLE dolg2;
DROP TABLE oszt2;
CREATE TABLE oszt2 AS SELECT * FROM Osztaly;
CREATE TABLE dolg2 AS SELECT * FROM Dolgozo;
CREATE TABLE fizkat2 AS SELECT  * FROM Fiz_Kategoria;
 
   -- Az SQL DML feladatok után kérdezzük le a módosított tábla tartalmát,
   -- majd állítsuk vissza a tábla eredeti tartalmát a ROLLBACK utasítással!
 
ROLLBACK; -- visszaállítjuk a tábla eredeti tartalmát (a további feladatokhoz)
COMMIT; -- ezzel véglegesítjük a táblák tartalmát (befejezzük a tranzakciót)
   
DELETE - sorok törlése
DELETE [FROM ] tábla
[WHERE feltétel ]
 
  1. Töröljük azokat a dolgozókat (a dolg2 táblából), akiknek jutaléka NULL.
  2. Töröljük azokat a dolgozókat, akiknek a belépési dátuma 1982 előtti.
  3. Töröljük azokat a dolgozókat, akik osztályának telephelye DALLAS.
  4. Töröljük azokat a dolgozókat, akiknek a fizetése kisebb, mint az átlagfizetés.
  5. Töröljük azokat a dolgozókat, akiknek a fizetése kisebb, mint a saját
      osztályuk átlagfizetése.
  6. Töröljük a legjobban kereső dolgozót.
  7. Töröljük ki azokat az osztályokat (az oszt2 táblából), ahol dolgozik valaki,  
      akinek a fizetése a Fiz_Kategoria tábla szerint a 2-es kategóriába esik.
  8. Töröljük ki azon osztályokat, amelyeknek 2 olyan dolgozója van, akinek
      a fizetése a 2-es fizetési kategóriába esik a Fiz_Kategoria tábla alapján. 
    
UPDATE - tábla tartalmának módosítása
UPDATE tábla
SET oszlop = érték [, oszlop = érték, ... ]
[WHERE feltétel ]
 
  1. Növeljük meg a 20-as osztályon a dolgozók fizetését 20%-kal.
  2. Növeljük meg azok fizetését 500-zal, akik jutaléka NULL vagy
      a fizetésük kisebb az átlagnál.
  3. Növeljük meg mindenkinek a jutalékát a jelenlegi maximális jutalékkal,
      ha valakinek ismeretlen a jutaléka (NULL) tekintsük 0-nak.
  4. Módosítsuk 'Loser'-re a legrosszabbul kereső dolgozó nevét.
  5. Növeljük meg azoknak a dolgozóknak a jutalékát 3000-rel, akiknek
      legalább 2 közvetlen beosztottjuk van.
      Az ismeretlen (NULL) jutalékot vegyük úgy, mintha 0 lenne.
  6. Növeljük meg azoknak a dolgozóknak a fizetését a jelenlegi minimális fizetés
      5%-kával, akiknek van olyan beosztottja, aki minimális fizetéssel rendelkezik.
  7. Növeljük meg a nem főnökök fizetését a saját osztályuk átlagfizetésével.
  8. Összetett, több lépéses feladat a Kende-Nagy feladatgyűjteményből (ott 5.5/c)
      Bővítsük a dolg2 táblát egy lakhely oszloppal, az új oszlop létrehozása:
      ALTER TABLE dolg2 ADD lakhely VARCHAR2(30);
      majd módosítsuk a táblát töltsük fel a lakcím oszlopát a következőképpen:
      A BOSTON-ban dolgozók CHICAGO-ban, a CHICAGO-ban dolgozók pedig
      BOSTON-ban laknak, kivéve azokat a CHICAGO-i dolgozókat, akiknek
      BLAKE a főnöke, mert ők INDIANAPOLIS-ban laknak, feltéve, hogy
      nem CLERK foglalkozásúak, mert akkor sehol sem laknak (NULL).
   

INSERT -- 1.alakja - egy új sor felvitele értékek megadásával
INSERT INTO tábla [(oszlop [, oszlop... ])]
VALUES (érték [, érték... ]);
 
  1. Vigyünk fel egy 'Kovacs' nevű új dolgozót a 10-es osztályra a következő
      értékekkel: dkod=1, dnev='Kovacs', oazon=10, belépés=aktuális dátum,
      fizetés=a 10-es osztály átlagfizetése. A többi oszop legyen NULL.
 
  2. Példa a helyettesítő/felhasználói változókra: &Numerikus/'&Karakteres'  
      az insert utasításban, itt a felhasználónak kell begépelnie az értékeket:
 
INSERT INTO dolg2 (dkod, dnev, oazon)
VALUES (&DOLGKOD, upper('&DOLGNEV'), &OSZTAZON);
 
-- -- -- -- --
INSERT -- 2.alakja - több sor felvitele alkérdéssel
INSERT INTO tábla [(oszlop [, oszlop... ])]
(SFW alkérdés);
 
  3. Több sor felvitele: Hozzunk létre egy UjOsztaly nevű táblát, amelynek
      attribútumai megegyeznek az Osztály tábla oszlopaival, plusz van
      még egy numerikus típusú letszam nevű új oszlopa. 
 
DROP TABLE UjOsztaly;
CREATE TABLE UjOsztaly
AS SELECT o.*, 0 letszam
FROM Osztaly o
WHERE 1=2;
 
      Ebbe az UjOsztaly táblába az insert utasítás 2. alakjával (alkérdéssel )
      vigyünk fel új sorokat az osztály és dolgozó táblák aktuális tartalmának
      felhasználásával minden osztály adatát kiegészítve az adott osztályon
      dolgozók létszámával.
      Azok az osztályok is jelenjenek meg ahol nem dolgozik senki,
      ott a létszám 0 legyen.
      Továbbá ha vannak olyan dolgozók, akiknek nem ismert az osztálya,
      azok létszámát egy olyan sorba írjuk be, amelyben az adatok
      oazon=0, onev= 'FIKTIV' és telephely='ISMERETLEN' legyenek.
 
   4. Több sor felvitele: Hozzunk létre egy UjDolg nevű táblát, amelynek
      attribútumai megegyeznek az Dolgozo tábla oszlopaival, plusz van
      még egy numerikus típusú Nyeremény nevű attribútuma.
      Ebbe az UjDolg táblába az insert utasítás 2. alakjával (alkérdéssel )
      vigyünk fel új sorokat a dolgozo táblák sorait egészítsük ki véletlenszám
      generátor függvénnyel adjuk meg a nyereményt, amely 1000 és 3000
      közötti 100-ra kerekített érték legyen! Segítség:
      - Ujdolg tábla létrehozása hasonlóan, mint az előző UjOsztaly tábla volt.
 
INSERT INTO UjDolg (dkod, dnev, oazon, fonoke, fizetes, nyeremeny)  
(SELECT dkod, dnev, oazon, fonoke, fizetes,
round(dbms_random.value(1000, 3000),-2) nyeremeny
FROM Dolgozo d);
    
>> Önálló gyakorlásra: Oracle Példatár Feladatok.pdf 5.fejezet DML feladatai