· 6 years ago · Jun 12, 2019, 10:46 PM
1-- 1. Zdefiniuj typ obiektowy reprezentujący KSIAZKE. Każda książka
2-- powinien mieć autora, tytuł, liczbę stron oraz datę wydania i cenę, liczbę
3-- wypożyczeń. Utwórz tablicę obiektową i KSIAZKI przechowują obiekty
4-- tego typu. Wprowadź kilka przykładowych obiektów, obejrzyj zawartość
5-- tabeli w postaci obiektowej i w postaci relacyjnej
6
7CREATE OR REPLACE TYPE ksiazka AS OBJECT
8(
9 autor VARCHAR2(30),
10 tytul VARCHAR2(30),
11 lstron NUMBER(10),
12 data_wydania DATE,
13 cena FLOAT
14);
15
16CREATE TABLE ksiazki OF ksiazka;
17INSERT INTO ksiazki VALUES (NEW ksiazka('Tolkien', 'Wladca Pierscieni Dwie wieze', 500, DATE '1970-01-01', 500));
18INSERT INTO ksiazki VALUES (NEW ksiazka('Tolkien', 'Wladca Pierscieni Powrot krola', 500, DATE '1971-01-01', 600));
19SELECT VALUE(k) FROM ksiazki k;
20SELECT * FROM ksiazki;
21
22
23-- 2. Utwórz tabelę BIBLIOTEKI zawierającą nazwę biblioteki, adres oraz
24-- atrybut obiektowy KSIAZKA. Wprowadź do tabeli przykładowe dane
25-- i wyświetl jej zawartość.
26
27
28CREATE TABLE biblioteki (
29 nazwa VARCHAR2(30),
30 adres VARCHAR2(50),
31 ksiazka ksiazka
32);
33INSERT INTO biblioteki VALUES ('Jakas tam nazwa', 'Lea 240', new ksiazka('Tolkien', 'Wladca Pierscieni Powrot krola', 500, DATE '1971-01-01', 600));
34INSERT INTO biblioteki VALUES ('Jakas tam nazwa 2', 'Lea 236', new ksiazka('Tolkien', 'Wladca Pierscieni Powrot krola', 500, DATE '1971-01-01', 600));
35SELECT nazwa, adres FROM biblioteki;
36SELECT b.nazwa, b.ksiazka.tytul FROM biblioteki b;
37
38-- 3. Wartość książki maleje o 5% z każdym rokiem. Dodaj do typu obiektowego
39-- KSIAZKA metodę wyliczającą na podstawie daty wydania
40-- i ceny aktualną wartość książki (wykorzystaj polecenie ALTER i
41-- zaimplementuj ciało). Wykonaj zapytanie do tabeli, które aktywuje tę
42-- metodę.
43
44
45ALTER TYPE ksiazka REPLACE AS OBJECT
46(
47 autor VARCHAR2(30),
48 tytul VARCHAR2(30),
49 lstron NUMBER(10),
50 data_wydania DATE,
51 cena FLOAT,
52 MEMBER FUNCTION cenaksiazki RETURN NUMBER
53);
54
55CREATE OR REPLACE TYPE BODY ksiazka IS
56 MEMBER FUNCTION cenaksiazki RETURN NUMBER IS
57 lata NUMBER(2);
58 wynik NUMBER(10,2) := 0;
59 BEGIN
60 lata := EXTRACT(YEAR FROM CURRENT_TIMESTAMP) - EXTRACT(YEAR FROM data_wydania);
61 wynik := cena;
62 FOR i IN 0..lata LOOP
63 wynik := wynik * 0.95;
64 end loop;
65 return wynik;
66 end cenaksiazki;
67END;
68
69SELECT p.tytul, p.cenaksiazki() FROM ksiazki p;
70
71-- 4. Dodaj do typu KSIAZKA metodę odwzorowującą, która pozwoli na
72-- porównywanie książek na podstawie lat od daty ich wydania raz
73-- zniszczenia (decyduje ilość wypożyczeń). Przyjmujemy, że 10
74-- wypożyczeń to jeden rok jeśli chodzi o lata, które upłynęły od daty wydania
75-- książki
76
77ALTER TYPE ksiazka ADD MAP MEMBER FUNCTION odwzoruj RETURN NUMBER CASCADE INCLUDING TABLE DATA;
78
79CREATE OR REPLACE TYPE BODY ksiazka IS
80 MEMBER FUNCTION cenaksiazki RETURN NUMBER IS
81 lata NUMBER(2);
82 wynik NUMBER(10,2) := 0;
83 BEGIN
84 lata := EXTRACT(YEAR FROM CURRENT_TIMESTAMP) - EXTRACT(YEAR FROM data_wydania);
85 wynik := cena;
86 FOR i IN 0..lata LOOP
87 wynik := wynik * 0.95;
88 end loop;
89 return wynik;
90 end cenaksiazki;
91 MAP MEMBER FUNCTION odwzoruj RETURN NUMBER IS
92 liczbalat NUMBER(10);
93 BEGIN
94 return (EXTRACT(YEAR FROM CURRENT_TIMESTAMP) - EXTRACT(YEAR FROM data_wydania))*10;
95 END;
96END;
97
98SELECT p.tytul, p.cenaksiazki(), p.odwzoruj() FROm ksiazki p;
99
100
101-- 5. Utwórz typ CZYTELNIK zawierający nazwisko i imię czytelnika. Dodaj
102-- do typu KSIAZKA referencje do CZYTELNIKA. Utwórz tabelę obiektową
103-- CZYTELNICY i wypełnij obie tabele danymi.
104
105
106
107DROP TYPE czytelnik FORCE;
108CREATE OR REPLACE TYPE czytelnik AS OBJECT
109(
110 imie VARCHAR2(20),
111 nazwisko VARCHAR2(20)
112);
113
114DROP TYPE ksiazka FORCE;
115
116CREATE OR REPLACE TYPE ksiazka AS OBJECT
117(
118 autor VARCHAR2(30),
119 tytul VARCHAR2(30),
120 lstron NUMBER(10),
121 data_wydania DATE,
122 cena FLOAT,
123 czyt REF CZYTELNIK,
124 MEMBER FUNCTION cenaksiazki RETURN NUMBER,
125 MAP MEMBER FUNCTION odwzoruj RETURN NUMBER
126);
127
128DROP TABLE czytelnicy;
129CREATE TABLE czytelnicy OF czytelnik;
130INSERT INTO czytelnicy VALUES(new czytelnik('Tomek', 'Pazera'));
131INSERT INTO czytelnicy VALUES(new czytelnik('Zuza', 'Pazera'));
132INSERT INTO czytelnicy VALUES(new czytelnik('Paulina', 'Pazera'));
133
134SELECT r.imie FROM czytelnicy r;
135
136DROP TABLE ksiazki;
137CREATE TABLE ksiazki OF ksiazka;
138INSERT INTO ksiazki VALUES(new ksiazka('Tolkien', 'Wladca Pierscieni Powrot krola', 500, DATE '1971-01-01', 600, (SELECT ref(c) FROM czytelnicy c WHERE c.imie = 'Tomek')));
139INSERT INTO ksiazki VALUES(new ksiazka('Tolkien', 'Wladca Pierscieni Powrot krola', 500, DATE '1971-01-01', 600, (SELECT ref(c) FROM czytelnicy c WHERE c.imie = 'Zuza')));
140
141SELECT r.czyt.imie FROM ksiazki r;
142
143-- 6. Wypisz autora i tytuł książki oraz nazwiska i imiona czytelników
144-- korzystając z nawigacji poprzez referencję.
145select o.autor, o.tytul, o.czyt.imie, o.czyt.nazwisko from ksiazki o;
146select o.autor, o.tytul, deref(o.czyt) from ksiazki o;
147
148
149-- 7. Usuń z tabeli CZYTELNICY jeden obiekt. Wyszukaj w tabeli KSIAZKI ,
150-- te książki, które nie mają przypisanego czytelnika (wiszące referencje) i
151-- przypisz tym referencjom NULL. Wykorzystaj pojedyncze polecenie
152-- DELETE i UPDATE.
153SELECT * FROM czytelnicy;
154DELETE FROM czytelnicy WHERE imie = 'Zuza';
155SELECT * FROM ksiazki k WHERE czyt is NULL;
156UPDATE ksiazki SET czyt = null WHERE czyt is dangling;
157
158-- 8. Wykonaj kilka eksperymentów na tablicach o zmiennym rozmiarze.
159-- Przykładowo: stwórz typ kolekcji zawierający informacje o przedmiotach
160-- nauczanych na studiach (łańcuchy znaków). Napisz program w PL/SQL,
161-- który tworzy kolekcję, wstawia do kolekcji przykładowe przedmioty,
162-- rozszerza kolekcję, wyświetla zawartość kolekcji, usuwa elementy z końca
163-- kolekcji, wyświetla informacje o długości kolekcji i o limicie na liczbę
164-- elementów.
165
166DROP TYPE przedmiot FORCE;
167
168CREATE OR REPLACE TYPE przedm AS OBJECT
169(
170 nazwa VARCHAR2(30)
171);
172
173CREATE OR REPLACE TYPE tab_przedmioty IS VARRAY(5) of przedm;
174
175SET SERVEROUTPUT ON;
176
177DECLARE
178 names tab_przedmioty;
179 total integer;
180 ostatni integer;
181BEGIN
182 names := tab_przedmioty(new przedm('Matematyka'), new przedm('Polski'));
183 total := names.count;
184 dbms_output.put_line('Liczba przedmiotow: '|| total);
185 FOR i in 1 .. total LOOP
186 dbms_output.put_line('Przedmiot: ' || names(i).nazwa);
187 NULL;
188 END LOOP;
189
190 names.extend;
191 dbms_output.put_line('Ostatni: ' || names.last);
192 dbms_output.put_line('Usuwamy ostatni rekord');
193 names.trim;
194 dbms_output.put_line('Dodajemy nowy rekord');
195 names.extend;
196 ostatni := names.last;
197 names(ostatni) := new przedm('Angielski');
198 total := names.count;
199 dbms_output.put_line('Liczba przedmiotow: '|| total);
200 FOR i in 1 .. total LOOP
201 dbms_output.put_line('Przedmiot: ' || names(i).nazwa);
202 NULL;
203 END LOOP;
204
205 dbms_output.put_line('Limit: '|| names.limit);
206
207END;
208
209-- 9. Utwórz typ tablicy o zmiennym rozmiarze przechowujący maksymalnie 30
210-- liczb, który będzie reprezentował listę ocen studenta. Utwórz typ
211-- obiektowy Student, który posiada atrybuty: indeks (typ liczbowy),
212-- nazwisko (typ łańcuchowy) oraz oceny (typu wcześniej zdefiniowanej
213-- kolekcji). Utwórz tabelę obiektową STUDENCI przechowującą obiekty
214-- typu STUDENT. Wstaw za pomocą polecenia INSERT kilku studentów,
215-- razem z ocenami, do tabeli. Odczytaj tabelę za pomocą polecenia SELECT.
216-- Zmień listę ocen jednego ze studentów za pomocą polecenia UPDATE.
217
218
219CREATE OR REPLACE TYPE OCENY IS VARRAY(30) OF INTEGER;
220CREATE OR REPLACE TYPE STUDENTOBJ AS OBJECT
221(
222 indeks INTEGER,
223 nazwisko VARCHAR2(30),
224 ocenki OCENY
225);
226CREATE TABLE STUDENTTAB OF STUDENTOBJ;
227INSERT INTO STUDENTTAB VALUES(new STUDENTOBJ(1, 'Pazera', oceny(5,4,3,2)));
228INSERT INTO STUDENTTAB VALUES(new STUDENTOBJ(1, 'Peron', oceny(2,2,2,2)));
229INSERT INTO STUDENTTAB VALUES(new STUDENTOBJ(1, 'Rybicki', oceny(3,2,3,2)));
230
231SELECT * FROM STUDENTTAB;
232UPDATE STUDENTTAB SET ocenki = oceny(3,3,3,3) WHERE nazwisko = 'Rybicki';
233
234-- 10. Wykonaj kilka eksperymentów na zagnieżdżonych tabelach. Przykładowo:
235-- stwórz typ kolekcji reprezentujący listę tytułów książek. Napisz program w
236-- PL/SQL, który tworzy kolekcję, rozszerza kolekcję i wstawia kilka książek,
237-- usuwa jakieś elementy ze środka oraz wyświetla wszystkie książki z
238-- kolekcji na konsoli z wykorzystaniem pętli FOR i metod EXISTS, FIRST
239-- i LAST oraz z pętli WHILE i metod FIRST i NEXT.
240CREATE OR REPLACE TYPE tytulyksiazek AS TABLE OF CHARACTER VARYING (50);
241
242DECLARE
243 tytuly tytulyksiazek;
244 total INTEGER;
245 ostatni INTEGER;
246BEGIN
247 tytuly := tytulyksiazek('Powrot krola', 'Dwie wieze');
248 total := tytuly.count;
249 dbms_output.put_line('Liczba ksiazek: ' || total);
250 FOR i IN 1..total LOOP
251 dbms_output.put_line('Tytul: ' || tytuly(i));
252 END LOOP;
253
254 tytuly.extend;
255 ostatni := tytuly.last;
256 tytuly(ostatni) := 'Druzyna pierscienia';
257
258 total := tytuly.count;
259 dbms_output.put_line('Liczba ksiazek: ' || total);
260 FOR i IN 1..total LOOP
261 dbms_output.put_line('Tytul: ' || tytuly(i));
262 END LOOP;
263
264 tytuly.delete(2);
265 total := tytuly.count;
266 dbms_output.put_line('Liczba ksiazek: ' || total);
267END;
268
269-- 11. Utwórz typ zagnieżdżonej tabeli przechowującej listę tytułów
270-- wypożyczonych filmów. Utwórz typ obiektowy reprezentujący klienta
271-- wypożyczalni o atrybutach: nazwisko (typu łańcuchowego) oraz filmy
272-- (typu wcześniej zdefiniowanej kolekcji). Utwórz tabelę obiektową
273-- KLIENCI przechowującą obiekty typu KLIENT. Wstaw przynajmniej
274-- dwóch klientów z wypożyczonymi filmami. Wykorzystując operator
275-- TABLE i polecenia INSERT, UPDATE i DELETE, wstaw, zmień i usuń
276-- jakieś filmy z tabeli zagnieżdżonej skojarzonej z jednym z klientów.
277
278CREATE OR REPLACE TYPE wypozyczonefilmy AS TABLE OF varchar2(30);
279CREATE OR REPLACE TYPE klient AS OBJECT (
280 nazw,
281 filmy wypozyczonefilmy
282 );
283
284CREATE TABLE KLIENCI OF klient;
285INSERT INTO KLIENCI VALUES ('paz', new wypozyczonefilmy('test1, test2'))
286
287CREATE OR REPLACE TYPE wypozyczonefilmy AS TABLE OF VARCHAR2(255);
288
289CREATE OR REPLACE TYPE klient AS OBJECT (
290 nazwisko VARCHAR2(30),
291 filmy wypozyczonefilmy
292);
293
294CREATE TABLE klienci OF klient NESTED TABLE filmy STORE AS filmytable;
295
296INSERT INTO klienci VALUES(new klient('Pazera', new wypozyczonefilmy('film 1', 'film 2')));
297INSERT INTO klienci VALUES(new klient('Sekuła', new wypozyczonefilmy('film 3', 'film 4')));
298
299SELECT VALUE(x) FROM TABLE(SELECT filmy FROM klienci WHERE nazwisko = 'Pazera') x;
300INSERT INTO TABLE(SELECT filmy FROM klienci WHERE nazwisko = 'Pazera') VALUES('film 10');
301UPDATE TABLE(SELECT filmy FROM klienci WHERE nazwisko = 'Pazera') x SET VALUE(x) = 'film 2' WHERE VALUE(x) = 'film2 ';
302DELETE FROM TABLE(SELECT filmy FROM klienci WHERE nazwisko = 'Pazera') x WHERE VALUE(x) = 'film 1';
303
304-- 12. Napisz zapytanie, które wypisze tabelę składającą się z dwóch kolumn:
305-- nazwisko klienta i wypożyczony film. Wykorzystaj połączenie tabeli
306-- obiektowej z zagnieżdżoną tabelą.
307SELECT nazwisko, value(x) FROM klienci CROSS JOIN TABLE(filmy) x;
308
309-- KOLOKWIUM III GRUPA 1
310
311-- 3. Zdefiniuj typ obiektowy reprezentujący SAMOCHODY. Każdy samochód powinien mieć markę, model, datę produkcji i
312-- cenę. Stwórz tablicę obiektową i wprowadź dwa przykładowe obiekty. Wypisz zawartość tablicy w postaci obiektowej
313-- i relacyjnej.
314
315CREATE OR REPLACE TYPE samochod AS OBJECT(
316 marka VARCHAR2(30),
317 model_sam VARCHAR(30),
318 rok_prod NUMBER(4,0),
319 cena NUMBER(15,2)
320);
321
322CREATE TABLE samochody of samochod;
323INSERT INTO samochody VALUES(new samochod('Fiat', 'Punto', 1996, 3000.50));
324INSERT INTO samochody VALUES(new samochod('Opel', 'Astra', 1997, 7000.50));
325
326SELECT * FROM samochody;
327SELECT VALUE(x) FROM samochody x;
328
329-- 4. Utwórz tablicę WLASCICIELE zawierającą imiona i nazwiska właścicieli oraz atrybut obiektowy SAMOCHOD. Dodaj
330-- funkcję obliczającą wiek samochodu oraz procedurę obniżającą cenę samochodu, która maleje z każdym rokiem o 10%.
331-- Zaproponuj przykład wykorzystana metody constructor.
332CREATE TABLE lasciciele (
333 imie
334 nazwisko
335 sam samochod;
336)
337
338ALTER TYPE samochod REPLACE AS OBJECT (
339 marka
340 model
341 rok
342 cena
343 MEMBER FUNCTION wiek RETURN NUMBER;
344 MEMBER PROCEDURE nowacena''
345 CONSTRUCTOR FUNCTION samochod(marka, model);
346 )
347
348CREATE OR REPLACE TYPE BODY samochod IS
349 MEMBER FUNCTION nowacena RETURN NUMBER IS
350 lata NUMBER;
351 wynik NUMBER;
352 BEGIN
353 wynik:= cena;
354 lata := EXTRACT(YEAR from current_timestamp) - extract(year from data_wyd);
355 FOR i in 1..lata loop
356 wynik := wynik * 0.9;
357 end loop;
358 END;
359 MEMBER PROCEDURE wiek IS
360
361
362
363CREATE TABLE wlasciciele (
364 imie VARCHAR2(30),
365 nazwisko VARCHAR2(30),
366 sam samochod
367);
368
369ALTER TYPE samochod REPLACE AS OBJECT (
370 marka VARCHAR2(30),
371 model_sam VARCHAR(30),
372 rok_prod NUMBER(4,0),
373 cena NUMBER(15,2),
374 MEMBER FUNCTION wiek RETURN NUMBER,
375 MEMBER PROCEDURE obniz_cene,
376 CONSTRUCTOR FUNCTION samochod(n_marka VARCHAR2(30), n_model_sam VARCHAR2(30)) return self as result
377 );
378
379CREATE OR REPLACE TYPE BODY samochod AS
380 MEMBER FUNCTION wiek RETURN NUMBER IS
381 BEGIN
382 return (EXTRACT(YEAR FROM sysdate) - rok_prod);
383 END;
384 MEMBER PROCEDURE obniz_cene IS
385 lata NUMBER(4);
386 BEGIN
387 lata := wiek();
388 FOR i IN 1..lata LOOP
389 cena := cena * 0.9;
390 end loop;
391 END;
392 CONSTRUCTOR FUNCTION samochod(n_marka VARCHAR2(30), n_model_sam VARCHAR2(30)) RETURN SELF AS RESULT IS
393 BEGIN
394 SELF.marka := n_marka;
395 SELF.model_sam := n_model_sam;
396 SELF.rok_prod := 1996;
397 SELF.cena := 100000;
398 END;
399end;
400
401-- 5. Zbuduj kolekcję (tablicę o zmiennym rozmiarze) przechowującą maksymalnie 10 różnych marek SAMOCHODÓW. Wstaw do
402-- kolekcji przykładowe dane (6 marek). Wypisz zawartość kolekcji. Rozszerz kolekcję o dwa elementy, wypisz zawartość
403-- kolekcji, usuń element z końca kolekcji.
404CREATE OR REPLACE TYPE samochodyTab AS VARRAY(10) OF VARCHAR2(30);
405DECLARE
406 sam samochodyTab;
407 last NUMBER;
408BEGIN
409 sam := samochodyTab('Fiat', 'Nissan', 'Opel', 'Mercedes', 'WV', 'Porsche');
410 FOR x IN sam.first()..sam.last() LOOP
411 DBMS_OUTPUT.PUT_LINE(sam(x));
412 end loop;
413 last := sam.last();
414 sam.extend(2);
415 sam(last + 1) := 'Lamborghini';
416 sam(last + 2) := 'xD';
417 FOR x IN sam.first()..sam.last() LOOP
418 DBMS_OUTPUT.PUT_LINE(sam(x));
419 end loop;
420 sam.trim(1);
421 FOR x IN sam.first()..sam.last() LOOP
422 DBMS_OUTPUT.PUT_LINE(sam(x));
423 end loop;
424end;
425
426-- 6. Zbuduj kolekcję (tablicę zagnieżdzoną) przechowującą maksymalnie 10 różnych marek SAMOCHODÓW. Wstaw do kolekcji
427-- przykładowe dane (6 marek). Wypisz zawartość kolekcji. Rozszerz kolekcję o dwa elementy, wypisz zawartość kolekcji,
428-- usuń element ze środka kolekcji (3 i 4). Wypisz element 5 i 6.
429CREATE OR REPLACE TYPE samochodyTab2 AS TABLE OF VARCHAR2(30);
430DECLARE
431 sam samochodyTab2;
432 last NUMBER;
433BEGIN
434 sam := samochodyTab2('Fiat', 'Nissan', 'Opel', 'Mercedes', 'WV', 'Porsche');
435 FOR x IN sam.first()..sam.last() LOOP
436 IF sam.exists(x) THEN
437 DBMS_OUTPUT.PUT_LINE(sam(x));
438 end if;
439 end loop;
440 DBMS_OUTPUT.PUT_LINE('********');
441 last := sam.last();
442 sam.extend(2);
443 sam(last + 1) := 'Lamborghini';
444 sam(last + 2) := 'xD';
445 FOR x IN sam.first()..sam.last() LOOP
446 IF sam.exists(x) THEN
447 DBMS_OUTPUT.PUT_LINE(sam(x));
448 END IF;
449 end loop;
450 DBMS_OUTPUT.PUT_LINE('********');
451 sam.delete(3,4);
452 FOR x IN sam.first()..sam.last() LOOP
453 IF sam.exists(x) THEN
454 DBMS_OUTPUT.PUT_LINE(sam(x));
455 END IF;
456 end loop;
457 DBMS_OUTPUT.PUT_LINE('********');
458 DBMS_OUTPUT.PUT_LINE(sam(5));
459 DBMS_OUTPUT.PUT_LINE(sam(6));
460end;
461
462-- KOLOKWIUM III GRUPA II
463
464-- 3. Zdefiniuj typ obiektowy reprezentujący STUDENTA. Każdy STUDENT powinien mieć nazwisko i imię, datę urodzenia oraz
465-- nr indeksu. Utwórz tablicę obiektową i wprowadź dwa przykładowe obiekty. Wypisz zawartość tablicy w postaci
466-- obiektowej i relacyjnej.
467CREATE OR REPLACE TYPE studentObj AS OBJECT (
468 imie VARCHAR2(30),
469 nazwisko VARCHAR2(30),
470 data_ur DATE,
471 nr_indeksu NUMBER(6)
472);
473
474CREATE TABLE studenciTable OF studentObj;
475INSERT INTO studenciTable VALUES(new studentObj('Tomasz', 'Pazera', DATE '1996-12-13', 121088));
476INSERT INTO studenciTable VALUES(new studentObj('Zuzanna', 'Pazera', DATE '1996-12-13', 121089));
477
478SELECT * FROM studenciTable;
479SELECT value(x) FROM studenciTable x;
480
481-- 4. Utwórz tablicę ADRESY zawierającą adres zamieszkania studenta (miejscowość i ulica) a następnie powiąż te
482-- obiekty za pomocą referencji. Wstaw obiekty do tabeli STUDENT oraz ADRESY. Wykonaj zapytania zwracające nazwisko
483-- i adres studenta - wykorzystaj nawigację poprzez referencje.
484CREATE OR REPLACE TYPE adresObj AS OBJECT
485(
486 miejscowosc VARCHAR2(30),
487 ulica VARCHAR2(50)
488);
489
490CREATE TABLE adresy OF adresObj;
491
492INSERT INTO adresy VALUES(new adresObj('Kraków', 'Lea'));
493INSERT INTO adresy VALUES(new adresObj('Kraków', 'Warszawska'));
494
495
496CREATE OR REPLACE TYPE studentObj AS OBJECT (
497 imie VARCHAR2(30),
498 nazwisko VARCHAR2(30),
499 data_ur DATE,
500 nr_indeksu NUMBER(6),
501 adres REF adresObj
502 );
503
504CREATE TABLE studenci OF STUDENTOBJ;
505
506INSERT INTO studenci VALUES(new studentObj('Tomasz', 'Pazera', DATE '1996-12-13', 121088, (SELECT ref(a) FROM adresy a WHERE a.ulica = 'Lea' )));
507
508SELECT nazwisko, deref(adres) FROM studenci;
509
510-- 5. Zbuduj kolekcję (tablicę o zmiennym rozmiarze) przechowującą maksymalnie 10 różnych marek SAMOCHODÓW.
511-- Wstaw do kolekcji przykładowe dane (6 marek). Wypisz zawartość kolekcji. Rozszerz kolekcję o dwa elementy,
512-- wypisz zawartość kolekcji, usuń element z końca kolekcji.
513-- JUŻ BYŁO
514
515-- 6. Zbuduj kolekcję (tablicę zagnieżdzoną) przechowującą maksymalnie 5 różnych tytułów filmów. Wstaw do
516-- kolekcji przykładowe dane (2 filmy). Wypisz zawartość kolekcji. Rozszerz kolekcję o dwa elementy, wypisz
517-- zawartość kolekcji, usuń element ze środka kolekcji (2 i 3). Wypisz element 4 i 5.
518
519-- SKORO ZAGNIEZDZONA TO CHYBA NIE MA MAKSYMALNEJ LICZBY ELEMENTOW !??!?!
520
521CREATE OR REPLACE TYPE bazafilmow AS TABLE OF VARCHAR(255);
522
523DECLARE
524 baza bazafilmow;
525 last NUMBER;
526BEGIN
527 baza := bazafilmow('Film 1', 'Film 2');
528 FOR i IN baza.first()..baza.last() LOOP
529 IF baza.exists(i) THEN
530 DBMS_OUTPUT.PUT_LINE(baza(i));
531 end if;
532 end loop;
533 last := baza.last();
534 baza.extend(2);
535 baza(last + 1) := 'Film 3';
536 baza(last + 2) := 'Film 4';
537 FOR i In baza.first()..baza.last() LOOP
538 IF baza.exists(i) THEN
539 DBMS_OUTPUT.PUT_LINE(baza(i));
540 end if;
541 end loop;
542 baza.delete(2,3);
543 FOR i In baza.first()..baza.last() LOOP
544 IF baza.exists(i) THEN
545 DBMS_OUTPUT.PUT_LINE(baza(i));
546 end if;
547 end loop;
548 DBMS_OUTPUT.PUT_LINE('********');
549 IF baza.exists(4) THEN
550 DBMS_OUTPUT.PUT_LINE(baza(4));
551 end if;
552 IF baza.exists(5) THEN
553 DBMS_OUTPUT.PUT_LINE(baza(5));
554 end if;
555end;
556
557-- KOLOKWIUM III GRUPA 3
558
559-- 3. Zdefiniuj typ obiektowy reprezentujący TELEFON. Każdy telefon powinien mieć nazwę sieci, numer oraz
560-- liczbę darmowych minut. Utwórz tablicę obiektową i wprowadź dwa przykładowe obiekty. Wypisz zawartość
561-- tablicy w postaci obiektowej i relacyjnej.
562CREATE OR REPLACE TYPE telefon AS OBJECT (
563 siec VARCHAR2(30),
564 nr NUMBER(9),
565 darmowe_minuty NUMBER(20)
566);
567
568CREATE TABLE telefony OF telefon;
569
570INSERT INTO telefony VALUES(new telefon('TMobile', 95929323, 200));
571INSERT INTO telefony VALUES(new telefon('Orange', 929233123, 100));
572
573SELECT * FROM telefony;
574SELECT VALUE(x) FROM telefony x;
575
576-- 4. Utwórz tablicę WLASCICIELE zawierającą imiona i nazwiska właścicieli telefonów oraz atrybut obiektowy
577-- TELEFON. Dodaj funkcję przeliczającą minuty na sekundy oraz procedurę która będzie aktualizowała
578-- liczbę darmowych minut (parametr procedury – wykorzystane minuty). Zaproponuj przykład wykorzystana
579-- metody constructor.
580CREATE TABLE wlasciciele (
581 imie VARCHAR2(30),
582 nazwisko VARCHAR2(30),
583 tel telefon
584);
585
586ALTER TYPE telefon REPLACE AS OBJECT (
587 siec VARCHAR2(30),
588 nr NUMBER(9),
589 darmowe_minuty NUMBER(20),
590 MEMBER FUNCTION mintosek RETURN NUMBER,
591 MEMBER PROCEDURE aktualizujdarmoweminuty(liczba NUMBER),
592 CONSTRUCTOR FUNCTION telefon(nr2 NUMBER) RETURN SELF AS RESULT
593 );
594
595CREATE OR REPLACE TYPE BODY telefon AS
596 MEMBER FUNCTION mintosek RETURN NUMBER IS
597 BEGIN
598 return darmowe_minuty*60;
599 end;
600 MEMBER PROCEDURE aktualizujdarmoweminuty(liczba NUMBER) IS
601 BEGIN
602 darmowe_minuty := liczba;
603 end;
604 CONSTRUCTOR FUNCTION telefon(nr2 NUMBER) RETURN SELF AS RESULT IS
605 BEGIN
606 SELF.nr := nr2;
607 SELF.siec := 'Orange';
608 SELF.tel := 123123123;
609 END;
610END;
611
612
613-- 5. Zbuduj kolekcję (tablicę o zmiennym rozmiarze) przechowującą ceny wybranego produktu. Wstaw do
614-- kolekcji przykładowe dane (6 obiektów). Wypisz zawartość kolekcji. Rozszerz kolekcję o dwa elementy,
615-- wypisz zawartość kolekcji, usuń element z końca kolekcji.
616CREATE OR REPLACE TYPE produkt AS VARRAY(10) OF VARCHAR2(30);
617
618DECLARE
619 bazap produkt;
620 last NUMBER;
621BEGIN
622 bazap := produkt('Mleko', 'Miod', 'Jajko', 'Smietana', 'Czeresnie', 'Jabłko');
623 FOR i IN bazap.first()..bazap.last() LOOP
624 DBMS_OUTPUT.PUT_LINE(bazap(i));
625 end loop;
626 last := bazap.last();
627 bazap.extend(2);
628 bazap(last + 1) := 'Test';
629 bazap(last + 2) := 'Test2';
630 FOR i IN bazap.first()..bazap.last() LOOP
631 DBMS_OUTPUT.PUT_LINE(bazap(i));
632 end loop;
633 bazap.trim(1);
634 FOR i IN bazap.first()..bazap.last() LOOP
635 DBMS_OUTPUT.PUT_LINE(bazap(i));
636 end loop;
637end;
638
639-- 6. Zbuduj kolekcję (tablicę zagnieżdzoną) przechowującą ceny wybranego produktu. Wstaw do kolekcji przykładowe
640-- dane (6 obiektów). Wypisz zawartość kolekcji. Rozszerz kolekcję o dwa elementy, wypisz zawartość kolekcji, usuń
641-- element ze środka kolekcji (3 i 4). Wypisz element 5 i 6.
642CREATE OR REPLACE TYPE produkty2 AS TABLE OF VARCHAR2(30);
643
644DECLARE
645 bazap produkty2;
646 last NUMBER;
647BEGIN
648 bazap := produkty2('Mleko', 'Miod', 'Jajko', 'Smietana', 'Czeresnie', 'Jabłko');
649 FOR i IN bazap.first()..bazap.last() LOOP
650 IF bazap.exists(i) THEN
651 DBMS_OUTPUT.PUT_LINE(bazap(i));
652 end if;
653 end loop;
654 last := bazap.last();
655 bazap.extend(2);
656 bazap(last + 1) := 'Test';
657 bazap(last + 2) := 'Test2';
658 FOR i IN bazap.first()..bazap.last() LOOP
659 IF bazap.exists(i) THEN
660 DBMS_OUTPUT.PUT_LINE(bazap(i));
661 end if;
662 end loop;
663 bazap.delete(3,4);
664 FOR i IN bazap.first()..bazap.last() LOOP
665 IF bazap.exists(i) THEN
666 DBMS_OUTPUT.PUT_LINE(bazap(i));
667 end if;
668 end loop;
669 IF bazap.exists(5) THEN
670 DBMS_OUTPUT.PUT_LINE(bazap(5));
671 end if;
672 IF bazap.exists(6) THEN
673 DBMS_OUTPUT.PUT_LINE(bazap(6));
674 end if;
675end;
676
677-- TEORIA
678Kolekcje to zbiory obiektów
679
680Metody:
681nazwa_kolekcji(wartosc, ...) - konstruktor kolekcji
682extend(x) - rozszerza kolekcję o x pustych elementów
683extend(x,i) - rozszerza kolekcje o x elementow o wartosci i-tego elementu
684trim(x) - usuwa x elementow od konca kolekcji
685delete(i) - usuwa i-ty element kolekcji
686delte(i, i+3) - usuwa od i-tego do i+3-ego elementy kolekcji
687next(x) - zwraca indeks elementu następującego element o indeksie x
688prior(x) - to samo tylko poprzedzającego
689exists(x) - sprawdza czy x element istnieje
690first - indeks pierwszego
691last - indeks ostatniego
692limit - max zakres kolekcji
693count - liczba elementow kolekcji
694
695
696Porównaj typy kolekcji:
697Wyróżniamy 2 typy kolekcji:
698- tabelę o zmiennym rozmiarze
699- tabelę zagnieżdżoną
700W tabeli o zmiennym rozmiarze nie można manipulować pojedynczymi elementami w SQL oraz elementy zachowują
701fizyczny porzadek. W varray podajemy maksymalną liczbę elementów.
702
703W tabeli zagnieżdzonej mozna manipulowac pojedynczymi elementami w SQL oraz należy wskazać tabelę out-line do
704przechowywania kolekcji. Nie ma limitu liczby elementów tabeli. Można na przykład usunąć element ze środka tabeli.
705
706Dostęp obiektowy do obiektu krotkowego: SELECT VALUE(x) FROM table x;
707Dostep relacyjny do obiektu krotkowego: SELECT * FROM table;
708
709Metody typu obiektowego:
710- MEMBER - wywoływane na rzecz konkretnego obiektu
711- STATIC - wywoływane na rzecz całego typu obiektowego
712- MAP/ORDER - metody wykorzystywane do porównywania obiektów
713- CONSTRUCTOR - metody tworzace nowe obiekty
714
715Metoda jest definiowana dwukrotnie:
716- w deklaracji typu: sygnatura metody (nazwa i lista argumentów)
717- w definicji typu (body): ciało metody (implementacja i kod źródłowy)
718
719DROP TYPE nazwa_typu FORCE - usunięcie typu wraz z zależnościami
720
721Perspektywy:
722 USER_OBJECTS - informacje o typach obiektowych
723 USER_METHOD_PARAMS, USER_METHOD_RESULTS, USER_TYPE_METHODS - informacje o metodach typów obiektowych
724
725Tożsamość obiektu to unikalny i niezmienny identyfikator związany z danym obiektem przez cały cykl jego życia/
726Tożsamość posiadają tylko obiekty krotkowe, zapewniana jest przez OID.
727Identyfikatory sa lokalne i globalnie unikalne, automatycznie indeksowane.
728Aplikacja może wykorzystywac referencje do identyfikatorów, odczytywane za pomocą REF()
729
730Przykład funkcji odwzorowującej:
731MAP MEMBER FUNCTION odwzoruj RETURN NUMBER IS
732BEGIN
733 RETURN wiek() + 3;
734end;
735
736Co to konstruktor?
737Metoda do tworzenia typów obiektowych. Typ obiektowy dostarcza domyslny konstruktor.
738Nazwa konstruktora jest taka sama jak nazwa typu obiektowego. Użytkownik może defniować własne konstruktory lub
739przesłonić domyślny.
740CONSTRUCTOR FUNCTION nazwa_typu (test VARCHAR2) RETURN SELF AS RESULT;
741
742Referencje
743typ obiektowy może posiadac referencje na istniejący obiekt innego typu obiektowego.
744np. obiekt osoba i adres
745kilka obiektów osoba może posiadać referencje na ten sam obiekt adres
746
747Nawigacja jawna
748SELECT o.pole1, DEREF(o.referencja) FROM tablica o;
749
750Nawigacja niejawna
751SELECT o.pole1, o.referencja.pole1 FROM tablica o;
752
753SELECT nazwisko, value(x) FROM klienci CROSS JOIN TABLE(filmy) x;
754
755Ograniczenia integralnościowe
756możliwe jest tylko dla tabel obiektowych (czyli CREATE TABLE tabela OF obiekt);
757ALTER TABLE table ADD PRIMARY KEY(pole1, pole2);
758ALTER TABLE tabela ADD CONSTRAINT ograniczenie CHECK (liczba > 0);
759ALTER TABLE tabela ADD CONSTRAINT ograniczenie2 liczba NOT NULL;