Rekurzív nem-negált Datalog program kiértékelése PL/SQL-ben
További PL/SQL feladatok
   

SEGÉDANYAGOK: ORACLE  PL/SQL:
Oracle® Database 10g (10.2)  Documentation Library
- Oracle PL/SQL User's Guide and Ref.10g      HTML   PDF
- Oracle PL/SQL Packages and Types Ref.10g HTML   PDF
 
További segédanyagok a PL/SQL-hez:
- Nikovits Tibor (ELTE) PL/SQL összefoglaló: NT_Plsql.htm
- Kósa Balázs (ELTE) PL/SQL összefoglaló: KB_Plsql.pdf   
- Ullman/Chang (Standford) Using Oracle PL/SQL
- Ullman/Chang (Standford) Constraints and Triggers
- PL/SQL Technology Center (Oracle 11g PL/SQL)
         
Rekurzív nem-negált Datalog program kiértékelése PL/SQL-ben

[Ullman-Widom]  5.3. Datalog szabályok és lekérdezések
[Ullman-Widom] 10.2. Rekurzió az SQL-ben (466-474.o.) 
   
Rek1.feladat:
- Az alábbi feladat a tankönyv (Ullman-Widom kék könyv) 10.2 szakaszára épül.
   Jaratok(legitarsasag, honnan, hova, koltseg, indulas, erkezes)
   táblában repülőjáratok adatait tároljuk.
   
- Készítsetek ebből saját példányt: jaratok_tabla.txt és az alapján dolgozzatok
            DROP TABLE jaratok;
            CREATE TABLE jaratok(
                            legitarsasag CHAR(2),
                            honnan VARCHAR2(10),
                            hova VARCHAR2(10),
                            koltseg NUMBER,
                            felszallas NUMBER,
                            erkezes NUMBER);
      
            INSERT INTO jaratok VALUES('UA', 'SF','DEN', 1000, 930,1230);
            INSERT INTO jaratok VALUES('AA', 'SF','DAL', 10000, 900,1430);
            INSERT INTO jaratok VALUES('UA','DEN','CHI', 500, 1500,1800);
            INSERT INTO jaratok VALUES('AA','DEN','DAL', 2000, 1400,1700);
            INSERT INTO jaratok VALUES('AA','DAL','CHI', 600, 1530,1730);
            INSERT INTO jaratok VALUES('AA','DAL', 'NY', 2000, 1500,1930);
            INSERT INTO jaratok VALUES('AA','CHI', 'NY', 3000, 1900,2200);
            INSERT INTO jaratok VALUES('UA','CHI', 'NY', 2000, 1830,2130);
            INSERT INTO jaratok VALUES('LH', 'CHI', 'DEN', 2000, 1900, 2100);
   
- (Papíros feladat) Fejezzzük ki Datalog programmal, hogy mely (x,y) város párokra
   lehetséges egy vagy több átszállással eljutni x városból y városba?
- Megoldás:
   1.    Eljut(X, Y) <- Jaratok(L, X, Y, K, F, E)
   2.    Eljut(X, Y) <- Eljut(X, Z) AND Jaratok(L, Z, Y, K, F, E)

- (Papíros feladat) A fenti rekurzív Datalog programot írjuk át az SQL3 szabványban
   szereplő WITH RECURSIVE utasítással! (papíron, mert az Oracle nem támogatja)
   (viszont az Oracle-ben láttuk a CONNECT BY PRIOR-t, lásd 9gyak#Rek1)
- Megoldás:
            WITH eljut AS
                  (SELECT honnan, hova FROM jaratok
             UNION 
                  SELECT eljut.honnan, jaratok.hova
                  FROM eljut, jaratok
                  WHERE eljut.hova = jaratok.honnan
                  AND eljut.honnan <> jaratok.hova)
            SELECT * FROM eljut;
   
- A fenti nemnegált rekurzív Datalog programot írjuk át Oracle PL/SQL programra!
- Ehhez előbb hozzuk létre egy alábbi szerkezetű ELJUT táblát:
            DROP TABLE Eljut;
            CREATE TABLE Eljut(
                             honnan VARCHAR2(10),
                             hova VARCHAR2(10));

- Írjunk egy olyan PL/SQL programot, ami feltölti az ELJUT táblát a megfelelő
   város párokkal, ahol az első városból el lehet jutni a másodikba. Mely (x, y)
   várospárokra lehetséges egy vagy több átszállással eljutni x városból y városba?
   (Fontos! Önmagával ne szerepeljen egy város sem!)
   
Rek2.feladat:
- (Papíros feladat) Fejezzzük ki Datalog programmal, hogy mely (x,y) város párokra
   milyen költségekkel lehetséges egy vagy több átszállással eljutni x városból y városba?
- Megoldás:
   1.    Eljut(X, Y, K) <-  Jaratok(L, X, Y, K, F, E)
   2.    Eljut(X, Y, K) <- Eljut(X, Z, K1) AND Jaratok(L2, Z, Y, K2, F2, E2) AND K=K1+K2

- Most hozzuk létre egy alábbi szerkezetű ELJUT táblát, amely a költséget is tartalmazza:
            DROP TABLE Eljut;
            CREATE TABLE Eljut(
                             honnan VARCHAR2(10),
                             hova VARCHAR2(10),
                             koltseg NUMBER);
   
- Most úgy töltsük fel az ELJUT táblát, hogy a költség oszlop a minimális költséget
   tartalmazza a két város között (A és B város között a lehető legolcsóbb út költsége)
   
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, vagyis ha több
   járattal  utazunk és átszállásra van szükségünk, akkor az érkező járatnak legalább egy
   órával a rá következő indulás előtt meg kell érkeznie.
   (Feltehetjük, hogy nincs egy napnál hosszabb utazás)
- Ezt a feladatot is fejezzzük ki előbb Datalog programmal, majd hozzuk létre az ELJUT
   táblát a megfelelő szerkezettel, és most úgy töltsük fel az ELJUT táblát, hogy a minimális
   időt tartalmazza két város között (A és B város között a lehető leggyorsabb út és ideje)
   
Rek4.feladat:
- A fenti feladatokat old meg PL/SQL-ben úgy is, hogy ne csak a várospárokat, hanem
   a teljes útvonalat is listázzuk ki.
   

PL/SQL GYAKOROLÓ FELADATOK: 
--  Lásd Feladatok.pdf (8-9-10. fejezet feladatai)  
-- Ehhez: a táblák létrehozása  cr_dept_emp.sql
     
Vissza az AB1 gyakorlat oldalára             Vissza a Kezdőlapra