1. Adatbázis alapú rendszerek 1. ZH
1. Feladat (2 pont): Írjunk PL/SQL kódot, mely a következőket hajtja végre:
létrehoz egy CEG nevű táblát, mely az alábbi mezőkkel rendelkezik:
o cegid: egész szám, mely az elsődleges kulcs
o cegnev: max. 30 karakter hosszú karaktersorozat
o tulaj: max. 40 karakter hosszú karaktersorozat
o reszv: max. 10 jegyű, 2 tizedesjeggyel bíró szám, értéke nem lehet NULL
kiírja a „Kérem a cég azonosítóját:” szöveget és bekér egy megfelelő típusú értéket
kiírja a „Kérem a cég nevét:” szöveget és bekér egy megfelelő típusú értéket
kiírja a „Kérem a tulajdonos nevét:” szöveget és bekér egy megfelelő típusú értéket
kiírja a „Kérem a cég részvényének értékét (Ft):” szöveget és bekér egy megfelelő típusú
értéket
beszúrja a táblába az előbbi paraméterekkel megadott rekordot
kivételkezelés segítségével kiírja a „Hiba: több azonos nevű létezik!” üzenetet, amennyiben
az új adat felvitelével több azonos nevű cég keletkezett
2. Feladat (2 pont): Írjunk PL/SQL kódot, mely a következőket hajtja végre:
létrehoz egy, a fenti CEG tábla rekordtípusával megegyező gyűjtőtáblát
a gyűjtőtáblába bemásolja 1‐től 10‐ig a páros azonosítóval rendelkező rekordok tartalmát a
CEG táblából
törli a gyűjtőtábla 4‐es indexű elemét
végül a gyűjtőtábla első és utolsó indexértékei között végigiterálva kiírja a cég nevét és
részvényének értékét, de csak ha az adott indexértékhez létezik a gyűjtőtáblának sora
3. Feladat (3 pont): Írjunk PL/SQL kódot, mely a következőket hajtja végre:
kiírja a „Kérem a keresett tulajdonos nevét:” szöveget és bekér egy megfelelő típusú értéket
létrehoz a fenti CEG táblában szereplő, az előző lépésben megadott személy által tulajdonolt
cégek neveinek abc‐sorrendben való kilistázására egy explicit paraméterezett kurzort
a kurzor megnyitása után annak segítségével kiírja a rendezett listát
amennyiben a lista nem üres, a lista után közvetlenül a következő sorba, a megfelelő
kurzorfüggvény segítségével kiírja a következő szöveget: „Összesen N cég van X.Y.
tulajdonában!”, ahol X.Y. az illető neve, N pedig a tulajdonában lévő cégek száma
amennyiben a lista üres, kiírja a következő üzenetet: „X.Y. nem szerepel az adatbázisban!”,
ahol X.Y. a keresett tulajdonos neve
végül lezárja kurzort
4. Feladat (3 pont): Írjunk PL/SQL kódot, mely a következőket hajtja végre:
kiírja a „Kérem a cég nevének részletét:” szöveget és bekér egy megfelelő típusú értéket
létrehoz egy explicit paraméterezett kurzort, mely a fenti CEG táblában szereplő, az előző
lépésben megadott sztringet a nevében tartalmazó cégek részvényeinek értékét megnöveli
5.0‐val
a kérdéses értékek módosítása előtt a sorokat zárolja más kódrészletek/tranzakciók elől
minden egyes növelés után kiírja az „Eddig X cég adatai módosultak!” szöveget, ahol X a
kurzor által eddig feldolgozott sorok száma
2. Megoldások:
-- 1. Feladat --
create table ceg (
cegid integer primary key,
cegnev varchar2(30),
tulaj varchar2(40),
reszv number(10,2) not null
);
set serveroutput on
accept cid integer prompt 'Kérem a cég azonosítóját:'
accept cnev prompt 'Kérem a cég nevét:'
accept ctul prompt 'Kérem a tulajdonos nevét:'
accept cert number(10,2) prompt 'Kérem a cég részvényének értékét (Ft):'
insert into ceg values (&cid, '&cnev', '&ctul', &cert);
declare
nev ceg.cegnev%type;
begin
select cegnev into nev from ceg where cegnev LIKE '&cnev';
exception
when too_many_rows then
dbms_output.put_line('Hiba: több azonos nevű létezik!');
end;
/
-- 2. Feladat --
set serveroutput on
declare
type sortipus is table of ceg%rowtype
index by binary_integer;
gytabla sortipus;
ind binary_integer := 2;
begin
while ind <= 10
loop
select * into gytabla(ind) from ceg where cegid = ind;
ind := ind + 2;
end loop;
gytabla.delete(4);
for ind in gytabla.first..gytabla.last loop
if gytabla.exists(ind) then
dbms_output.put_line(gytabla(ind).cegnev || ': ' ||
gytabla(ind).reszv);
end if;
end loop;
end;
/
3. -- 3. Feladat --
accept tnev prompt 'Kérem a tulajdonos nevét:'
set serveroutput on
declare
cnev ceg.cegnev%type;
cursor listaz (tul varchar2) is
select cegnev from ceg where tulaj like tul order by cegnev;
begin
open listaz('&tnev');
loop
fetch listaz into cnev;
exit when listaz%notfound;
dbms_output.put_line(cnev);
end loop;
if listaz%rowcount > 0 then
dbms_output.put_line('Összesen ' || listaz%rowcount || ' ceg van ' ||
'&tnev' || ' tulajdonában!');
else
dbms_output.put_line('&tnev' || ' nem szerepel az adatbázisban!');
end if;
close listaz;
end;
/
-- 4. Feladat --
accept cnev prompt 'Kérem a cég nevének részletét:';
set serveroutput on
declare
cursor novel(nev varchar2) is
select *
from ceg
where cegnev like nev
for update of reszv;
begin
for j in novel('%&cnev%') loop
dbms_output.put_line('Eddig ' || novel%rowcount || ' cég adatai
módosultak!');
update ceg
set reszv = reszv + 5
where current of novel;
end loop;
end;
/