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

A VIK Wikiből

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> code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px; } li { line-height: 18px; } </style>


<< Labor, 2006.03.28. >>

Tárolt alprogramok

  1. Írj egy tárolt eljárást, aminek a segítségével kurzusokat lehet felvenni. Az eljárásnak két bemenő paramétere van, a diák azonosító, és a kurzusazonosító. Az eljárás a következő esetekben generáljon hibát:
    • ha a kurzus már betelt
    • ha a hallgató már jelentkezett erre a kurzusra
    • ha nem létezik a paraméterként beadott diák vagy kurzus.
  2. Írj egy tárolt eljárást, aminek a segítségével ki lehet törölni egy hallgatót egy kurzusról. Az eljárásnak legyen két bemenő paramétere, a diák azonosító és a törölni kívánt kurzusazonosító. Az eljárás akkor dobjon hibát, ha nem létezik a törölni kívánt diák vagy kurzus.
  3. Írj függvényt, aminek két bemeneti paramétere van, a pilóta azonosítója és egy évszám, visszatérési értéke pedig a pilóta adott évben szerzett pontjainak az összege!
  4. Írj függvényt, aminek bemenete egy helyezés, visszatérési értéke pedig a helyezéshez tartozó pontszám!

Triggerek

  1. Írj egy triggert, ami az anyag táblába való beszúrás esetén automatikusan generál azonosítót, ha a beszúrni kívánt adatok közt nincs megadva az azonosító! CREATE SEQUENCE anyag_seq START WITH 100 INCREMENT BY 1 CREATE OR REPLACE TRIGGER anyag_idtr BEFORE INSERT ON anyag FOR EACH ROW BEGIN IF :new.anyag_id IS NULL THEN SELECT anyag_seq.NEXTVAL INTO :new.anyag_id FROM DUAL; END IF; END;
  2. Írj egy triggert, ami csak akkor engedi, hogy egy hallgató felvegyen egy kurzust, ha a kurzus még nincs betelve.
  3. Készíts el egy nézetet, aminek segítségével a FELKESZ_ANYAG táblát láthatjuk, de az anyag és a félkész nevét láthatjuk, nem pedig a kódját. Ezek után írj egy triggert, ami lehetővé teszi, hogy új anyagot adjunk hozzá a félkészhez a nézeten keresztül! View létrehozása CREATE VIEW felkeszanyag AS SELECT felkesz_nev, anyag_nev, fa_mennyiseg FROM felkesz, anyag, felkesz_anyag WHERE felkesz.felkesz_id = felkesz_anyag.fa_felkeszid AND anyag.anyag_id = felkesz_anyag.fa_anyagid Trigger létrehozása CREATE OR REPLACE TRIGGER felkesz_anyag_insert INSTEAD OF INSERT ON felkeszanyag FOR EACH ROW DECLARE anyagid INT; felkeszid INT; BEGIN SELECT anyag_id INTO anyagid FROM anyag WHERE anyag_nev = :new.anyag_nev; SELECT felkesz_id INTO felkeszid FROM felkesz WHERE felkesz_nev = :new.felkesz_nev; INSERT INTO felkesz_anyag (fa_felkeszid, fa_anyagid, fa_mennyiseg) VALUES (felkeszid, anyagid, :new.fa_mennyiseg); END; Tesztelés INSERT INTO felkeszanyag VALUES ('tejszinhab', 'liszt', 1); COMMIT;
  4. Módosítsd a PILOTA_FUTAM táblát úgy, hogy legyen egy oszlop a pilóta pontszámának tárolására is (ez származtatott adat, a PILOTA_FUTAM tábla alapján számítható). Készíts triggert, ami karbantartja az új oszlop értékét, bármilyen módosítást is hajtunk végre a pilóta pontszámát érintő táblában! Próbálj meg olyan megoldást találni, ami a lehető legkevesebb mővelettel oldja meg a feladatot! ALTER TABLE futam_pilota ADD pontszam INT CREATE OR REPLACE TRIGGER pilota_pontszam BEFORE INSERT OR UPDATE ON futam_pilota FOR EACH ROW BEGIN SELECT decode(:new.helyezes, NULL, 0, 1, 10, 2, 8, 3, 6, 4, 5, 5, 4, 6, 3, 7, 2, 8, 1, 0) INTO :new.pontszam FROM dual; END;
  5. Készíts nézetet, ami az alábbi mezőket tartalmazza: évszám, csapat neve, pilóta neve, pilóta típusa az adott csapatban az adott évben. Készíts triggert, ami lehetővé teszi új pilótát felvenni egy adott csapatba a nézeten keresztül.
  6. Készíts triggert, ami biztosítja, hogy egy évben egy pilóta csak egy csapatban szerepelhessen, valamint egy csapatban egyszerre csak egy elsőszámú és egy másodszámú pilóta lehessen, de akármennyi teszt pilóta.
  7. A cukrász adatbázisban módosítsd a FELKESZ táblát úgy, hogy egy mezőben a félkész egységárát is el tudjuk tárolni. Ez egy származtatott adat lesz, annak az érdekében, hogy a termék árának a lekérdezése egyszerőbb és gyorsabb legyen. Az új oszlop a (felkesz_ar float). Írd meg a triggereket, amik karban tartják ezt a mezőt. Triggereket az alábbi eseményekre kell írni:
    • Egy anyag ára megváltozott.
    • Új anyag kerül a félkész anyaglistájába.
    • Egy anyagot törölnek a félkész anyaglistájából.
    • Megváltozik a mennyisége a félkész által tartalmazott anyagnak (FELKESZ_ANYAG táblában).
    ALTER TABLE felkesz ADD felkesz_ar FLOAT
  8. A cukrászat adatbázist egészítsd ki az alábbi rendelés táblával! CREATE TABLE rendeles ( rendeles_id INT CONSTRAINT rendeles_primary_key PRIMARY KEY, rendeles_datum date NOT NULL, rendeles_anyagid int NOT NULL, rendeles_mennyiseg float NOT NULL, rendeles_rendezve date ) Írj triggert, ami felad egy újabb rendelést, ha valamely anyag mennyisége a minimális érték alá csökken. A rendelés mennyisége legyen annyi, hogy utána a maximális mennyiség legyen a raktárban.

-- Peti - 2006.03.28.