11.GYAKORLAT (ADATBÁZISOK)
   
   ZH előtti összefoglalás kérdés/válasz, a II.ZH információ: [link]
     
   Témakör: Oracle PL/SQL témakör - Összefoglalás (zh előtti kérdés/válasz)
   - Változóhasználat, vezérlési szerkezetek a PL/SQL-ben: Példatár 8.fej.pdf
   - Kurzorok, FOR UPDATE kurzor módosításhoz: Oracle Példatár 9.fej.pdf
   - Kivétel- és hibakezelés, alprogramok: Oracle Példatár 10.fej.PSM.pdf 
   
 - PL/SQL elsajátításához segédletek: 
   Az egyetlen megengedett segédlet, amit a ZH írás alatt használhatunk:
   PL/SQL doksi: Oracle Database Rel.12.2 - PL/SQL Language Reference
   >> a doksiból nézünk példákat: List of Examples (PL/SQL Lang.Ref.12.2)
   
 - További segédanyagok a PL/SQL feldolgozásához:
   >> SQL/PSM, PL/SQL: 08.adatb.ea.pdf (korábbi BSc-2008 AB1EA/HajasCs.)
   >> Oracle PL/SQL: Oracle Junior EA >> Oracle PL/SQL.pdf  
   >> Oracle PL/SQL segédanyagok: eduPLSQL mappában => innen lásd például:
       >> plsql_progr.pdf -- Forrás Tankönyvtár: PL/SQL programozás Oracle-ben 
   

    
   PL/SQL 3.rész: 
   (folyt.) DML programban, kurzorok >> 6.fej. Static SQL/Cursors
 - Ismétlés: >> példa-2-25 select into >> példa-6-6 és példa-6-11 kurzorok
   >> példa-6-41 6.6.6.3 FOR UPDATE kurzor módosításhoz - hibák javítása:
      -- Ne adjon ki COMMIT utasítást a FOR UPDATE módosításra megnyitott
          kurzor lekérdezési ciklusán belül, mert a ciklus második lépésében a
          FETCH nem működik olyan kurzorra, amely már nem érvényes (hiba).
      -- Módosítható kurzort használjunk, ha a sorok értékeit módosítani vagy
          a sorokat törölni szeretnénk, ekkor a kurzorban a FOR UPDATE
          záredékot használjunk. Módosítás esetén a FETCH által utoljára lehívott,
          azaz aktuális sor azonosítása a CURRENT OF kurzor záradékkal történik.
      -- A végén zárja be a kurzort. (Javítsuk ki a fenti hibákat, próbáljuk ki.) 
      -- Figyelem! Ennek a demó példa lefuttatásánál a PL/SQL blokk előtti
          drop table emp; create table emp as select * from hr.employees;
          felülírja az Oracle Példatár feladatainál használt korábbi emp táblát,   
       -- ezért emp helyett emp_temp táblát célszerűbb használjunk, vagy utána
           az Oracle Példatár feladataihoz: cr_dept_emp.txt scriptet újra lefuttatjuk.
       [Megj.: A feladatsorban viszont a korábbi táblákban dolgozunk: createDolg]
   
   PL/SQL eljárások és függvények: 8.fej. PL/SQL Alprogramok
   >> volt példa2-17 Változók hatásköre, láthatósága, élettartalma (2.fej. Alapok)
   >> volt példa4-1 IF-THEN utasítás (például már itt is volt eljárás: 4.fej. Utasítások)
   >> 8.1. Alprogramokról áttekintés: Miért van szükség alprogramokra, előnyök
   >> 8.5.fej. Példák példa8-1 PL/SQL eljárásra és példa8-2 PL/SQL függvényre
   >> 8.7.fej. Paraméterátadás; 8.9.fej.Túlterhelés példa8-26 túlterhelésre példa
  
   PL/SQL kivétel- és hibakezelés >> 11.fej. Kivétel-és hibakezelés
   >> táblázat-11-3 előre definiált kivételek (Predefined Exceptions) Táblázat
   >> példa-11-3 példa előre definiált NO_DATA_FOUND hiba kezelésére
   >> példa11-6 példa előre definiált ZERO_DIVIDE (egyszerű névtelen blokk)
   >> példa-11-10 példa felhasználó által definiált kivételekre)
        -- Javítások: CREATE PROCEDURE helyett CREATE OR REPLACE PROCEDURE
        -- és az utasításrészben, ahol TO_DATE('01-JUL-2010', 'DD-MON-YYYY') kieg.:
           TO_DATE('01-JUL-2010', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE = American')
         
     
   PL/SQL FELADATSOR --3:
     -- A feladatokat most is a saját Dolgozo-Osztaly táblákra kell megírni, ehhez
         a táblákat létrehozó script, mint a DML-hez volt: createDolg (no constraint)
     -- A képernyőre való kiíráshoz a DBMS_OUTPUT.PUT_LINE() használatához,
         a PL/SQL blokk előtt állítsuk be: SET SERVEROUTPUT ON
 
-- -- --  --    
-- 11.)
/* FOR UPDATE kurzor módosításhoz, lásd  példa-6-41 (javítását lásd fentebb)
Módosítható explicit kurzor használatával növeljük meg a hivatalnokok (CLERK)
fizetését a saját fizetésük 20%-ával! (SQL DML feladatokra másolat dolg2 tábla)
 -- Ennek egy lehetséges megoldását lásd az Oracle Példatár 9.1.példa
 -- Oracle Példatár feladataihoz/példáihoz: cr_dept_emp.txt (angol ny. séma)
 -- mi viszont ezekre a táblákra magyar nyelvű sémával dolgozunk: createDolg
*/
 
-- -- --  --    
-- 12.)
 /* FOR UPDATE kurzor módosításhoz
Módosítsuk a dolgozók nevét írjuk át, hogy csak a kezdőbetű legyen nagy,
a többi betű kicsi, továbbá a dolgozók fizetését is növeljük meg 2 %-kal!
*/

-- -- --  --    
-- 13.)
/* Módosítás kurzorral
Írjunk meg egy procedúrát, amelyik módosítja a paraméterében megadott osztályon
a fizetéseket, és kiírja a dolgozó nevét és új fizetését. 
A módosítás mindenki fizetéséhez adjon hozzá n*10 ezret,
ahol n a dolgozó nevében levő magánhangzók száma (A, E, I, O, U).
A procedúra a kiírás után adjon ki egy ROLLBACK utasítást, hogy megmaradjanak
az eredeti fizetések, így a procedúrát többször is futtatni tudják.
*/

CREATE OR REPLACE PROCEDURE fiz_mod2(p_oazon INTEGER) IS
Tesztelés:
set serveroutput on
execute fiz_mod2(10);

-- -- --  --    
-- 14.)
/* Exception
Írjunk meg egy függvényt, amelyik egy karakteres típusú paraméterben egy
dátumot kap a következő formátumban: 'éééé.hh.nn' vagy 'nn.hh.éééé'.
A függvény adja vissza a nap nevét, pl. 'kedd'.
Ha a megadott karakterlánc nem egy érvényes dátum, akkor adja vissza,
hogy 'rossz dátum'.
*/

CREATE OR REPLACE FUNCTION nap_nev(p_kar VARCHAR2) RETURN VARCHAR2 IS
...
SELECT nap_nev('2017.05.01'), nap_nev('02.05.2017'), nap_nev('2017.13.13') FROM dual;
    
-- -- --  --    
-- 15.)
/* Exception, SQLCODE
Írjunk meg egy procedúrát, amelyik a paraméterében kapott számra
külön sorokba kiírja annak reciprokát, négyzetgyökét, és faktoriálisát.
Ha bármelyik nem értelmezhető vagy túlcsordulást okoz, akkor erre
a részre írja ki a kapott hibakódot. (SQLCODE).
*/

CREATE OR REPLACE PROCEDURE szamok(n number) IS
Tesztelés:
set serveroutput on
execute szamok(0);
execute szamok(-2);
execute szamok(40);

-- -- --  --    
-- 16.)
/*
Írjunk meg egy függvényt, amelyik visszaadja a paraméterként szereplő '+'-szal
elválasztott számok és kifejezések összegét. Ha valamelyik kifejezés nem szám,
akkor azt az összeadásnál hagyja figyelmen kívül, vagyis 0-nak tekintse.
*/

CREATE OR REPLACE FUNCTION osszeg2(p_char VARCHAR2) RETURN NUMBER IS
...
SELECT osszeg2('1+21 + bubu + y1 + 2 + -1 ++') FROM dual;

     

    
   Még egy fontos kiegészítés: Az "Eljut-feladat" PL/SQL-ben (nincs zh-án)
   SQL WITH  RECURSIVE utasítást, az Eljut feladatot lásd a 08.gyakorlaton
   Adott Járatok tábla alapján programmal INSERT INTO Eljut (SFW);
    
   Rekurzió: SQL-1999 szabvány WITH RECURSIVE utasítása helyett itt programmal
   > Eljut feladat, gráf adatszerkezet lekérdezésére írjunk programot PL/SQL-ben!
   > Ullman-Widom tankönyv 10.2 szakasza Eljut-feladat: korábbiEA/p67_p80.pdf
       Az Eljut-feladat a Tankönyv (Ullman-Widom kék könyv) 10.2 szakaszára épül:
   
       Adott Jaratok(legitarsasag, honnan, hova, koltseg, indulas, erkezes) táblában
       repülőjáratok adatait tároljuk (honnan-hova várospárok). Azt keressük, hogy
       Dallasból mely városokba tudunk eljutni (közvetlenül vagy egy/több átszállással). 
       -- Ezzel a scripttel jaratok_tabla.txt készítsük el a repülőgépjáratokról a táblát.
    
   > Rek1.feladat: Mely (x, y) várospárokra lehetséges egy vagy több átszállással
      eljutni x városból y városba? -- Ehhez készítsünk egy Eljut(honnan, hova) táblát, 
      a sorait a járatok tábla alapján PL/SQL programmal töltsük fel (ciklust szervezni, 
      az insert 2.alakja: több sor felvitele alkérdéssel/járatok és eljut táblák alapján).
      >>> (csak ha kell, egy kis segítség, további ötletek és a megoldás vázlata: itt)
   
   > Rek2.feladat: Mely (x,y) város párokra hány átszállással és milyen költségekkel
      lehetséges egy vagy több átszállással eljutni x városból y városba? -- Ehhez is
      készítsünk Eljut2(honnan, hova, atszallas, koltseg) táblát, a sorait programmal.
    >> Papíron megoldandó feladat: Fejezzük ki az SQL-1999-es szabvány SELECT
         WITH RECURSIVE utasítással, hogy mely mely városokba (hova) tudunk eljutni
         'DAL' (Dallas)-ból legfeljebb 3 átszállással és legfeljebb 5000 költségből.
          >>> (csak ha kell, egy kis segítség WITH RECURSIVE papíros részéhez itt)
   
   > Rek3.feladat: Tegyük fel, hogy nemcsak az érdekel, hogy el tudunk-e jutni az
      egyik városból a másikba, hanem az is, hogy utazásunk során az átszállások is
      ésszerűek legyenek, ez azt jelenti, hogy ha több járattal utazunk, akkor nézni
      kell átszálláskor az érkező járatnak legalább egy órával a rákövetkező indulás
      előtt meg kell érkeznie. (Tegyük fel, hogy nincs egy napnál hosszabb utazás!)
     
   > Rek4.feladat: Ne csak a várospárokat, hanem a teljes útvonalat is listázzuk ki.
    
     
   4.rész:  Oracle PL/SQL kiegészítések (szorgalmi, nincs a ZH-ban)  
 
 PL/SQL triggerek: 9. Triggerek
   >> Constraints, triggerek témakör szerepelt Adatbázisok-1 előadáson. 
   >> PL/SQL triggerekre példákat lásd Oracle Példatár 10.fej.Trigger.pdf 
   
   PL/SQL csomagok: 10. Csomagok
   >> Oracle standard csomagokat lásd Oracle Database PL/SQL Packages
     -- DBMS_OUTPUT  =>> DBMS_OUTPUT.PUT_LINE eljárás kiírás képernyőre;
     -- DBMS_RANDOM =>> DBMS_RANDOM.VALUE (AlsóHatár, FelsőHatár) függvény:
         a véletlenszám-generátor függvény RETURN binary_integer típusú számot ad.
       
 
   Ţovábbi gyakorló PL/SQL feladatok 
   >> Oracle Példatár Feladatok.pdf 10.fejezet trigger-feladatai mellett vegyük elő
        a korábbi 8. fejezet és 9.fejezet feladatait, és azokat írjuk át tárolt eljárásra,
        tárolt függvényre, +ahol csak lehet egészítsük ki kivétel- és hibakezeléssel is!