Adatbázisok szerver oldali programozása Labor, 2006.03.21.

A VIK Wikiből
(AdatbServerProgJegyzet20060321 szócikkből átirányítva)

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.


<style> pre { margin-top: 2px; margin-bottom: 2px; } li { line-height: 18px; } </style>


<< Labor, 2006.03.21. >>

  1. Készíts egy tárolt eljárást, aminek bemeneti paramétere egy pilóta neve, két kimeneti paramétere pedig a pilóta magassága és súlya! Az eljárást próbáld ki SQL Windowból, a kimeneti paramétereket a DBMS_OUTPUT.PUT_LINE metódussal írasd ki a kimenetre!
    • Program Window:
      CREATE OR REPLACE PROCEDURE pilotaparams(pnev IN VARCHAR2, magassag OUT INT, suly OUT INT) IS
      BEGIN
        SELECT pilota.magassag, pilota.suly INTO magassag, suly
        FROM pilota
        WHERE pilota.nev = pnev;
      END pilotaparams;
    • SQL Window:
      DECLARE
        magassag INT;
        suly INT;
      BEGIN
        pilotaparams('Cristijan Albers', magassag, suly);
        DBMS_OUTPUT.PUT_LINE('Magassag: ' || magassag || '  Suly: ' || suly);
      END;
  2. Próbáld ki az előző feladatban megoldott eljárás hívását a Test Window-ból! A Test Window egy olyan környezet, ahol lehetőség van környezeti változókat használni a blokkon belül. Ha környezeti változóban adjuk meg a bemeneti és a két kimeneti paramétert, akkor az eredményt az ablak alsó felében láthatjuk, nem kell nekünk extra kiíratni a kimenetre. A környezeti változók deklarálása is a Test Window alsó ablakában lehetséges, ahol meg kell adni a változó nevét és típusát, ha bemeneti paraméter, akkor az értékét is. A változóra a blokkon belül a kettőspont változónévvel lehet hivatkozni. (Pl. a változó neve legyen pilotanev, akkor a blokkon belül =:pilotanev= kifejezéssel hivatkozunk rá.)
    BEGIN
      pilotaparams(:pilotanev, magassag, suly);
    END;

    Test Window alján:

    Variable Type Value
    pilotanev String Cristijan Albers
    magassag Integer
    suly Integer

    F8-ra kitölti a hiányzó értékeket.

  3. Egészítsd ki az előző feladatot hibakezeléssel is. Amennyiben nem létezik a bemenetként megadott pilóta, akkor a kimeneti értékek -1 legyenek!
    CREATE OR REPLACE PROCEDURE pilotaparams(pnev IN VARCHAR2, magassag OUT INT, suly OUT INT) IS
    BEGIN
      SELECT pilota.magassag, pilota.suly INTO magassag, suly
      FROM pilota
      WHERE pilota.nev = pnev;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
    	 magassag := -1;
    	 suly := -1;
    END pilotaparams;
  4. Készíts egy tárolt eljárást, aminek bemeneti paramétere egy csapat neve és egy évszám! Az eljárás listázza ki a kimenetre az adott csapat adott évben szerződtetett pilótáit!
    CREATE OR REPLACE PROCEDURE csapat_szezon_pilotak(csnev IN VARCHAR2, szev IN int) IS
    BEGIN
    	FOR rec IN (
    		SELECT pilota.nev
    		FROM csapat, csapat_pilota, csapat_szezon, pilota
    		WHERE csapat.csapatid = csapat_szezon.csapatid
    			AND csapat_szezon.csapatszezonid = csapat_pilota.csapatszezonid
    			AND pilota.pilotaid = csapat_pilota.pilotaid
    			AND csapat.nev = csnev
    			AND csapat_szezon.ev = szev
    	) LOOP
    	  DBMS_OUTPUT.PUT_LINE(rec.nev);
    	END LOOP;
    END csapat_szezon_pilotak;
  5. Írj egy olyan eljárást, aminek az egyetlen bemenő paramétere az évszám, és az adott szezonban létező csapatok pilótáit listázza ki a kimenetre szépen formázva (a csapat nevek alatt bentebb vannak felsorolva a pilóták nevei)!
    CREATE OR REPLACE PROCEDURE szezon_pilotak(szev IN int) IS
    BEGIN
    	FOR rec IN (
    		SELECT csapat.csapatid, csapat.nev
    		FROM csapat, csapat_szezon
    		WHERE csapat.csapatid = csapat_szezon.csapatid
    			AND csapat_szezon.ev = szev
    	) LOOP
    		DBMS_OUTPUT.PUT_LINE(rec.nev);
    		FOR rec2 IN (
    			SELECT pilota.nev
    			FROM csapat_pilota, csapat_szezon, pilota
    			WHERE csapat_szezon.csapatszezonid = csapat_pilota.csapatszezonid
    				AND pilota.pilotaid = csapat_pilota.pilotaid
    				AND rec.csapatid = csapat_szezon.csapatid
    				AND csapat_szezon.ev = szev
    		) LOOP
    			DBMS_OUTPUT.PUT_LINE('	' || rec2.nev);
    		END LOOP;
    	END LOOP;
    END szezon_pilotak;
  6. Írj egy tárolt eljárást, aminek segítségével egy csapatot és egy pilótát tudunk egy szezonban összerendelni. Az eljárás bemenő paramétere a csapat neve, a pilóta neve, a szezon évszáma és a pilóta típusa legyen. Használd a hibakezelési lehetőségeket az alábbi szituációkra, és mindegyikről külön küldj hibaüzenetet:
    • Nem létezik az adott nevő csapat vagy az adott évben nem indult.
    • Nem létezik az adott pilóta.
    • Nincs ilyen szezon definiálva az adatbázisban.
    • Már tagja az adott pilóta az adott csapatnak az adott évben.
    • Ha a pilóta típusa 1 vagy 2 és ilyen már létezik, akkor vegye fel másik számúnak, ha az még nem foglalt, vagy ha már mindkét pozíció foglalt, akkor teszt pilótának, és küldjön erről üzenetet.
    CREATE OR REPLACE PROCEDURE szezon_pilotak(
    	csapatnev VARCHAR2;
    	pilotanev VARCHAR2;
    	szezonev INT;
    	pilotatipus CHAR;
    ) IS
    BEGIN
      -- to be continued...
    END;
  7. Írj függvényt, ami a bemeneteként kapott FLOAT típusú számot szöveges formátummá konvertálja a következők szerint: óra:perc:másodperc.ezredmásodperc!
  8. Írj lekérdezést, ami az előző feladatban megírt függvény segítségével kilistázza a 2005-ös Ausztrál Nagydíj eredményét (pilóta név, helyezés, idő)!
  9. Írj lekérdezést, ami az előző feladatban megírt lekérdezést egészíti ki olyan módon, hogy egy újabb oszlopban az adott időeredmény és az első helyezett eredményének a különbsége is megjelenik! Az eredményedet ellenőrizd le a http://www.formula1.com oldalon található táblázattal! Az eredmény így nézzen ki: TODO: táblázat
  10. Írj egy függvényt, ami a tanév szemesztereinek következőképpen megadott kódját szöveges, emberek számára egyértelmően értelmezhetővé konvertálja! A szemeszterkód egy ötjegyő szám, aminek első négy jegye az évet jelenti, míg az ötödik számjegye az év félévét jelenti. Például a 2002 év őszi félévét a 20022 jelöli, míg a 2003 tavaszi félévet a 20031 kód jelöli. Megjelenítéskor az első esetben „2002/2003 I. félév” a második esetben pedig „2002/2003 II. félév” szöveget szeretnénk látni. A megírt függvényt próbáld ki néhány minta bemenettel!
  11. Az előző feladatban megírt függvény segítségével listázd ki a tanár-diák adatbázis =SEMESTER= tábla adatait!

-- Peti - 2006.03.21.