III. Témakör: PL/SQL

>> 1. Alapok. Változóhasználat, vezérlési szerkezetek.
>> 2. Hivatkozási és összetett adattípusok, kurzor.
>> 3. Hiba-és kivételkezelés, tárolt alprogramok, csomagok.
>> 4. Triggerek alkalmazása, felépítése, lekérdezése.
_______________________________________________________
8. gyak. (IV.09) - PL/SQL  alapok.
Változóhasználat, vezérlési szerkezetek.   


On-line help: Oracle PL//SQL User's Guide and Ref.10g   HTML     PDF
Segédanyagok: PL/SQL Technology Center (Oracle 11g PL/SQL)
Nikovits Tibor (ELTE) PL/SQL összefoglaló: Plsql.htm

Oracle rendszer alaptáblái dept, emp, salgrade
-- lásd Oracle Database Samples Schemas (10.2)      HTML      PDF  
-- Hozzuk létre a dept, emp, salgrade táblákat az Oracle SCOTT felhasználó
    tábláiból (mivel hallgatói jogosultság nem szól a scott tábláira, előbb áthoztam,
    és a sila.dept, sila.emp illetve sila.salgrade táblákat már látják a hallgatók is),
    CREATE TABLE dept AS SELECT * FROM sila.dept; stb... VAGY 
-- A dept és emp táblák közvetlen létrehozása: cr_dept_emp.sql 
-- A dept, emp, salgrade, dummy, customer, ord, item, product, price táblák
    és a sales nézettábla létrehozása: cr_dept_stb_sales.sql 

PL/SQL feladatok 

8.gyakorlat órai mintapéldái PL/SQL alapokra  (jelszóval nyitható)
1a_valtozok.sql - Változóhasználat (I. az SQL*Plus felhasználói változói,
      II. az SQL*Plus környezeti változói, III. a PL/SQL (belső) változói).
      Az adatok képernyőre való kiíratása (Az Oracle beépített csomagjai,
      DBMS_OUTPUT csomag PUT_LINE eljárása). CONCAT fv. vagy || jel.
--   Írjunk egy PL/SQL blokkot tartalmazó SQL*Plus szkipt programot, amely
      a felhasználótól bekér egy egész számot! Ha ez a szám nagyobb 100-nál,
      akkor a PL/SQL blokkban, egyébként pedig a PL/SQL blokkot követő
      gazdanyelvi (SQL*Plus) környezetben írassa ki

1b_select_into.sql - A SELECT ... INTO utasítás a PL/SQL-ben
--   Határozzuk meg egy PL/SQL program segítségével a felhasználó által
      megadott telephelyen dolgozók béröszegét.

1c_if_then.sql - Feltételes utasítás (és a MOD)
--   Kérjünk be két egész számot és döntsük el, hogy az összegük páros-e vagy
      páratlan. Az eredményt a PL/SQL blokkban írjuk ki futás közben.  

1d_loop_ciklus.sql - LOOP ciklus 
--  Állítsuk elő a felhasználó által megadott darabszámig a Fibonacci-sorozat
     elemeit. (A megoldáshoz LOOP ciklust használjunk.)

1e_while_ciklus.sql - WHILE ciklus 
--  Kérjünk be két (nem túl nagy) egész számot és írjuk ki a legnagyobb közös
     osztókat (az Euklideszi algoritmussal és a WHILE ciklust használjunk).

1f_for_ciklus.sql - FOR ciklus 
--  Írjunk SQL*Plus szkript programot, amely egy PL/SQL blokkban kiszámítja
     a felhasználó által megadott A számtól a felhasználó által megadott B számig
     a páratlan számok négyzetösszegét, és ezt az SQL*Plus környezetben írjuk ki.
     (A megoldáshoz FOR ciklust használjunk.)

8.gyakorlat feladatai önálló feldolgozásra
h1a. - Hello World program. Kérjük, hogy adja meg a nevét, és íratassuk ki
          a képernyőre, hogy 'Szia <név>!' (képernyőre való kiíratás)
h1b. - Írjuk ki KING fizetését! (olvasás táblából változóba)
h1c. - Írjuk ki KING belépési dátumát! (különböző dátum formátumokkal)
h1d. - PL/SQL programmal írassuk ki az emp sorainak számát és az átlagfizetést.
h1e. - Kérjünk be egy (nem túl nagy) egész számot és állapítsuk meg, hogy prím-e.
h1f.  - Kérjünk be két egész számot és írjuk ki a legkisebb közös többszörösét.
_______________________________________________________
9. gyak. (IV.16)  - PL/SQL kurzor.
Hivatkozási és összetett adattípusok, kurzor.


On-line help: Oracle PL//SQL User's Guide and Ref.10g   HTML     PDF
Segédanyagok: PL/SQL Technology Center (Oracle 11g PL/SQL)
Nikovits Tibor (ELTE) PL/SQL összefoglaló: Plsql.htm

9.gyakorlat órai mintapéldái kurzorra (jelszóval nyitható)

2a_gyujtotabla.sql - Összetett típus, rekord, gyűjtőtábla
-    Írjunk PL/SQL programot, amely meghatározza a 7698 azonosítójú
     dolgozó nevét gyűjtőtábla használatával.

2b_impl_kurzor.sql - Implicit kurzor, kurzorhasználat FOR ciklusban
-    Hozzuk létre a dolgozo táblát az emp táblából, és bővítsük azt egy sorszám
     oszloppal. Ezt töltsük fel 1-től kiindulva egyesével növekvő értékkel minden
     dolgozó esetén a dolgozók nevének ábécé sorrendje szerint.

2c_expl_kurzor.sql - Explicit kurzor
-    2b feladat másik megoldása

2d_current_of.sql - Explicit kurzor, FOR UPDATE, CURRENT OF 
-    2b, 2c feladat harmadik megoldása

2e_kurzor.sql - Kurzor, kurzorattribútumok (%FOUND, %NOTFOUND, stb)
-    Növeljük meg a hivatalnokok (CLERK) fizetését a saját fizetésük 20%-ával!
      (hibas_mo.sql)

9.gyakorlat feladatai önálló feldolgozásra
h2a. - Írjuk ki a dolgozók nevét és fizetését! (kurzor használata)
h2b. - Írjunk PL/SQLprogramot, amely (eldob és) létrehoz az emp táblából 
          egy dolgozo táblát, és megnöveli a felhasználó által megadott foglalkozású
          dolgozók fizetését 1000 USD-ral.
h2c. - Írjunk PL/SQLprogramot, amely (eldob és) létrehoz az emp táblából egy
          dolgozo táblát, és megnöveli a felhasználó által megadott százalékértékkel
          minden, az átlagfizetésnél alacsonyabb fizetéssel rendelkező dolgozók fizetését. 
h2d. - Írjunk PL/SQLprogramot, amely (eldob és) létrehoz az emp táblából egy
          dolgozo táblát, és ebben foglalkozásonként megnöveli a legkisebb fizetésű
          dolgozók bérét a foglalkozási csoportjukban legnagyobb fizetés és az ugyanitt
          számított átlagfizetés különbségének 20%-ával.
h2e. - Írjuk ki a 3. 5. és 8. legnagyobb fizetésű dolgozó nevét, fizetését!
          (kurzor attribútumok %ROWCOUNT)
h2f. - Tegyük be a dolgozók nevét egy plsql tömbbe, és írjuk ki az utolsó előtti sort!
          (összetett adattípusok RECORD/rekord TABLE OF/gyűjtőtábla v. plslq tömb)
_______________________________________________________
10. gyak. (IV.23)  - PL/SQL kivételkezelés, alprogramok.
Hiba-és kivételkezelés, tárolt alprogramok, csomagok.


On-line help: Oracle PL//SQL User's Guide and Ref.10g      HTML     PDF
                      Oracle PL/SQL Packages and Types Ref.10g  HTML     PDF
Segédanyagok: PL/SQL Technology Center (Oracle 11g PL/SQL)
Nikovits Tibor (ELTE) PL/SQL összefoglaló: Plsql.htm

10.gyakorlat órai mintapéldái alprogramokra, csomagokra (jelszóval nyitható)

3a_alprogr.sql - tárolt alprogramok
-    Egyszerű számnövelő példa a PL/SQL függvényekre és eljárásokra.

3b_csomag.sql - csomag
-    Egyszerű példa egy getemp eljárást és avg_salary fv-t tartalmazó csomagra.

3c_hibakez.sql - hiba és kivételkezelés
-    Példa hiba és kivételkezelésre
     Módosítsuk úgy a programot, hogy másik ágra tereljük a hibakezelést! 

3d_kivetelkez.sql - kivételkezelés
-   Írjunk egy olyan eljárást, amely kivételkezelést is tartalmaz és a jutalmat az
    emp táblából létrehozott dolgozo tábla jutalék (comm) értékéhez adja hozzá!
    A jutalom a dolgozó fizetésének 10%-a, feltéve, ha a fizetés 3000 dollár
    alatt van, egyébként csak egy "Boldog Karácsonyt!" üdvözletet kap.

10.gyakorlat feladatai önálló feldolgozásra
h3a. - Írjunk meg egy fv-t, ami az empno azonosító alapján visszaadja a nevet!
h3b. - Írjunk egy olyan függvényt, amely kurzor technikával egy EmpnoIn
          változóval megegyező dolgozó nevét betölti egy EnameOut változóba!
h3c. - Módosítsuk a fizetéseket egy kurzorral végighaladva rajtuk!
          Adjunk hozzá mindenki fizetéséhez n*10 ezret, ahol n a nevében levő
          magánhangzók (vagyis a, e, i, o, u) száma!
h3d. - Írjunk egy csomagot, amelyben eljárásként, függvényként, tárolt eljárásként
          és tárolt függvényként is szerepel az, hogy adott n-re visszaadja n faktoriálist!
          Ha a faktoriális túl nagy szám lenne, akkor a függvény adjon vissza -1-et,
          hiba és kivételkezeléssel megoldva, ekkor egy üzenetet is írjunk ki a hibáról.
_______________________________________________________
11. gyak. (IV.30)  - PL/SQL triggerek.
Triggerek alkalmazása, felépítése, lekérdezése.


On-line help: Oracle PL//SQL User's Guide and Ref.10g   HTML     PDF
Segédanyagok: PL/SQL Technology Center (Oracle 11g PL/SQL)
Nikovits Tibor (ELTE) PL/SQL összefoglaló: Plsql.htm

11.gyakorlat órai mintapéldái triggerekre (jelszóval nyitható)

4a_trigger.sql - triggerek
-   Hozzunk létre BEFORE triggert, amely megakadályozza a munkaidőn
     kívüli adatmanipulációkat az emp táblán! Írassuk ki, milyen műveleteket
     kíséreltek meg végrehajtani munkaidőn kívül!

4b_triggerek.sql - triggerek
-  Írjunk triggert (és ellenőrizzük is a működését), amely megakadályozza
    az elnökre (president) vonatkozó törlő, beszúró és adatmódosító
    DML utasítások működését!
    (a tesztelő script programban a hivatkozási megszorítás felfüggesztése
     illetve a végén az újbóli engedélyeztetése)

4c_after_delete.sql - triggerek  
- Adj meg egy olyan triggert, amely törli a hallgató összes adatát az indexk
   táblából miután töröltük a hallgatót a hallgato táblából!

11.gyakorlat feladatai  önálló feldolgozásra
h4a. - Fogalmazzuk át a 4a példát a következőképpen:
          Hozzunk létre olyan triggereket, melyek segítségével megakadályozzuk
          (letiltjuk) a munkaidőn kívüli beavatkozásokat az emp táblán, tavábbá
          egy feljegyzes nevű adattáblába feljegyezzük a munkaidőn kívül kísérelt,
           és a munkaidőben sikeresen elvégzett (engedélyezett) beavatkozások
           időpontját, jellegét ("Törlés", "Beszúrás", "Módosítás") és minősítését
           ("Letiltott", "Engedélyezett").
h4b. - Adjunk meg egy olyan triggert, amely törli a részlegen dolgozó
          összes dolgozó adatát az emp táblából miután töröltük a részleget
          a dept táblából! (a tesztelés előtt SAVEPOINT A; tesztelés után
          pedig állítsuk vissza az eredeti táblákat ROLLBACK A)

h4c. - Írjunk triggert (ellenőrizzük is a működését), amely megakadályozza,
          hogy a felhasználó olyan dolgozót vigyen fel vagy töröljön ki vagy
          fizetésemeléssel módosítson, akinek a havi bére eléri vagy meghaladja
         a részlegének átlagfizetését! (kivételkezelés is)