Databázové a informační systémy 1/9 DATABÁZOVÉ A INFORMAČNÍ SYSTÉMY Katedra informatiky FEI VŠB Technická univerzita Ostrava 2012/2013
Databázové a informační systémy 2/9 TABULKA ST U D E N T Pokud nebude řečeno jinak budou se všechny příkazy týkat tabulky Student: CREATE TABLE Student ( login CHAR(6) PRIMARY KEY, fname VARCHAR(30) NOT NULL, lname VARCHAR(50) NOT NULL, email VARCHAR(50) NOT NULL, tallness INT NOT NULL);
Databázové a informační systémy 3/9 ÚKOL 1: ŘÍDÍCÍ KONSTRUKCE 1. Přidejte do tabulky Student atribut istall, který bude nabývat hodnoty 0 nebo 1. 2. Vytvořte proceduru IsStudentTall s jedním parametrem p_login, která nalezne záznam s daným loginem. Nastaví u něj hodnotu atributu istall na 0 pokud je atribut tallness menší než jeho průměrná hodnota a hodnotu 1 v opačném případě (příkaz IF 1 ). 3. Vytvořte funkci LoginExist s jedním parametrem p_login, která vrátí true pokud existuje záznam s loginem p_login. Použijte funkci LoginExist k rozšíření procedury AddStudent2, která bude vytvářet login tak dlouho dokud nenalezne nepoužitý login (příkaz LOOP 2 ). 1 Oracle: PL/SQL Language Reference, str. 139. 2 Oracle: PL/SQL Language Reference, str. 139.
Databázové a informační systémy 4/9 ÚKOL 2: KURZOR 1. Upravte proceduru IsStudentTall aby procházela všechny záznamy a nastavovala příslušnou hodnotu atributu istall. Procedura tedy bude bez parametrů. Využijte typ student%rowtype a příkazy OPEN, FETCH, CLOSE 3. 2. Přepište proceduru IsStudentTall aby používala cyklus FOR 4. 3 Oracle: PL/SQL Language Reference, str. 217. 4 Oracle: PL/SQL Language Reference, str. 229.
Databázové a informační systémy 5/9 ÚKOL 3: ZÁLOHA TABULKY 1. Vytvořte uloženou proceduru CopyTableStructure s jedním parametrem p_table_name, která vytvoří kopii (pouze atributy) tabulky se jménem p_table_name. Nová tabulka bude prázdná, bude mít příponu _old a bude mít stejná jména atributů (a stejné typy) jako původní tabulka. Postup řešení: Jména a typy jednotlivých atributů načtěte ze systémového katalogu. Sestavte do řetězce příkaz CREATE TABLE, kterým vytvoříte novou tabulku. Použijte příkaz Execute Immediate 5 k jeho spuštění. 2. Vytvořte uloženou proceduru CopyTable s jedním parametrem p_table_name, která nejprve vytvoří kopii tabulky a pak zkopíruje také všechny záznamy. 5 Oracle: PL/SQL Language Reference, str. 264.
Databázové a informační systémy 6/9 ÚKOL 4: VÝJIMKY 1/2 Poznámka: pokud nebude řečeno jinak budou se všechny příkazy týkat tabulky Student. 1. Upravte funkci LoginExist tak, aby vrátila false skutečně jen v případě, že student s daným loginem v tabulce není. V případě jiné chyby výjimku propagujte 6. 2. Napiště funkci InsertStudent, která vloží záznam studenta a vrátí true v případě, že záznam byl úspěšně vložen. V případě že login studenta již v tabulce existuje, tak vrátí false. Využijte zachycení výjimky DUP_VAL_ON_INDEX. Použijte tuto funkci v proceduře AddStudent3, která bude fungovat stejně jako AddStudent2. 6 Oracle: PL/SQL Language Reference, str. 404.
Databázové a informační systémy 7/9 ÚKOL 4: VÝJIMKY 2/2 1. Upravte proceduru StudentBecomeTeacher aby se byla schopna vypořádat i se záznamy v tabulce Student_Course, které se odkazují na přesunovaného studenta. (Deklarujte výjimku asociovanou s číslem a odchyt te 7 ). 7 Oracle: PL/SQL Language Reference, str. 410.
Databázové a informační systémy 8/9 ÚKOL 5: TRIGGERY 1. Vytvořte trigger OperationCount který zaznamená do tabulky Statistics počty operací insert, update a delete. Tabulka Statistics bude tabulka se dvěma atributy. První atribut operation bude představovat typ operace a druhý atribut operationcount bude představovat počty daných operací (Použijte detekci DML operace v triggeru 8 ). 2. Přidejte atribut kapacita do tabulky Kurz, který bude představovat maximální kapacitu daného kurzu. Vytvořte trigger kontrolakapacity, který vypíše varovnou hlášku v případě, že je kapacita kurzu překročena. 3. V triggeru kontrolakapacity deklarujte výjimku capacity_exceeded, kterou vyvolejte v případě překročení kapacity 9. 8 Oracle: PL/SQL Language Reference, str. 344. 9 Oracle: PL/SQL Language Reference, str. 413.
Databázové a informační systémy 9/9 ÚKOL 6: BALÍKY PROCEDUR A FUNKCÍ 1. Vytvořte balík student_package, který bude obsahovat všechny funkce a procedury, které se vztahují k tabulce Student. Vložte do tohoto balíku všechny příslušné funkce a procedury 1011. 2. Vložte do balíku výjimku capacity_exceeded z předchozího úkolu a použijte tuto výjimku v triggeru kontrolakapacity. Pro vkládání záznamu do tabulky studijniplan si napište anonymní proceduru, která odchytí výjimku capacity_exceeded. 10 Oracle Academy Advanced PL/SQL Student Guide, str. 35. 11 Oracle: PL/SQL Language Reference, str. 388.