Advertisement
Guest User

Untitled

a guest
Jun 12th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 27.19 KB | None | 0 0
  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.  
  7. CREATE 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.  
  16. CREATE TABLE ksiazki OF ksiazka;
  17. INSERT INTO ksiazki VALUES (NEW ksiazka('Tolkien', 'Wladca Pierscieni Dwie wieze', 500, DATE '1970-01-01', 500));
  18. INSERT INTO ksiazki VALUES (NEW ksiazka('Tolkien', 'Wladca Pierscieni Powrot krola', 500, DATE '1971-01-01', 600));
  19. SELECT VALUE(k) FROM ksiazki k;
  20. SELECT * 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.  
  28. CREATE TABLE biblioteki (
  29.     nazwa VARCHAR2(30),
  30.     adres VARCHAR2(50),
  31.     ksiazka ksiazka
  32. );
  33. INSERT INTO biblioteki VALUES ('Jakas tam nazwa', 'Lea 240', NEW ksiazka('Tolkien', 'Wladca Pierscieni Powrot krola', 500, DATE '1971-01-01', 600));
  34. INSERT INTO biblioteki VALUES ('Jakas tam nazwa 2', 'Lea 236', NEW ksiazka('Tolkien', 'Wladca Pierscieni Powrot krola', 500, DATE '1971-01-01', 600));
  35. SELECT nazwa, adres FROM biblioteki;
  36. SELECT 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.  
  45. ALTER 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.  
  55. CREATE 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;
  67. END;
  68.  
  69. SELECT 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.  
  77. ALTER TYPE ksiazka ADD MAP MEMBER FUNCTION odwzoruj RETURN NUMBER CASCADE INCLUDING TABLE DATA;
  78.  
  79. CREATE 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;
  96. END;
  97.  
  98. SELECT 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.  
  107. DROP TYPE czytelnik FORCE;
  108. CREATE OR REPLACE TYPE czytelnik AS OBJECT
  109. (
  110.     imie VARCHAR2(20),
  111.     nazwisko VARCHAR2(20)
  112. );
  113.  
  114. DROP TYPE ksiazka FORCE;
  115.  
  116. CREATE 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.  
  128. DROP TABLE  czytelnicy;
  129. CREATE TABLE czytelnicy OF czytelnik;
  130. INSERT INTO czytelnicy VALUES(NEW czytelnik('Tomek', 'Pazera'));
  131. INSERT INTO czytelnicy VALUES(NEW czytelnik('Zuza', 'Pazera'));
  132. INSERT INTO czytelnicy VALUES(NEW czytelnik('Paulina', 'Pazera'));
  133.  
  134. SELECT r.imie FROM czytelnicy r;
  135.  
  136. DROP TABLE ksiazki;
  137. CREATE TABLE ksiazki OF ksiazka;
  138. INSERT 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')));
  139. INSERT 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.  
  141. SELECT 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ę.
  145. SELECT o.autor, o.tytul, o.czyt.imie, o.czyt.nazwisko FROM ksiazki o;
  146. SELECT 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.
  153. SELECT * FROM czytelnicy;
  154. DELETE FROM czytelnicy WHERE imie = 'Zuza';
  155. SELECT * FROM ksiazki k WHERE czyt IS NULL;
  156. UPDATE 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.  
  166. DROP TYPE przedmiot FORCE;
  167.  
  168. CREATE OR REPLACE TYPE przedm AS OBJECT
  169. (
  170.   nazwa VARCHAR2(30)
  171. );
  172.  
  173. CREATE OR REPLACE TYPE tab_przedmioty IS VARRAY(5) OF przedm;
  174.  
  175. SET SERVEROUTPUT ON;
  176.  
  177. DECLARE
  178.    names tab_przedmioty;
  179.    total INTEGER;
  180.    ostatni INTEGER;
  181. BEGIN
  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.  
  207. END;
  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.  
  219. CREATE OR REPLACE TYPE OCENY IS VARRAY(30) OF INTEGER;
  220. CREATE OR REPLACE TYPE STUDENTOBJ AS OBJECT
  221. (
  222.   indeks INTEGER,
  223.   nazwisko VARCHAR2(30),
  224.   ocenki OCENY
  225. );
  226. CREATE TABLE STUDENTTAB OF STUDENTOBJ;
  227. INSERT INTO STUDENTTAB VALUES(NEW STUDENTOBJ(1, 'Pazera', oceny(5,4,3,2)));
  228. INSERT INTO STUDENTTAB VALUES(NEW STUDENTOBJ(1, 'Peron', oceny(2,2,2,2)));
  229. INSERT INTO STUDENTTAB VALUES(NEW STUDENTOBJ(1, 'Rybicki', oceny(3,2,3,2)));
  230.  
  231. SELECT * FROM STUDENTTAB;
  232. UPDATE 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.
  240. CREATE OR REPLACE TYPE tytulyksiazek AS TABLE OF CHARACTER VARYING (50);
  241.  
  242. DECLARE
  243.   tytuly tytulyksiazek;
  244.   total INTEGER;
  245.   ostatni INTEGER;
  246. BEGIN
  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);
  267. END;
  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.  
  278. CREATE OR REPLACE TYPE wypozyczonefilmy AS  TABLE OF VARCHAR2(30);
  279. CREATE OR REPLACE TYPE klient AS OBJECT (
  280.     nazw,
  281.     filmy wypozyczonefilmy
  282.                                         );
  283.  
  284. CREATE TABLE KLIENCI OF klient;
  285. INSERT INTO KLIENCI VALUES ('paz',  NEW wypozyczonefilmy('test1, test2'))
  286.  
  287. CREATE OR REPLACE TYPE wypozyczonefilmy AS TABLE OF VARCHAR2(255);
  288.  
  289. CREATE OR REPLACE TYPE klient AS OBJECT (
  290.     nazwisko VARCHAR2(30),
  291.     filmy wypozyczonefilmy
  292. );
  293.  
  294. CREATE TABLE klienci OF klient NESTED TABLE filmy STORE AS filmytable;
  295.  
  296. INSERT INTO klienci VALUES(NEW klient('Pazera', NEW wypozyczonefilmy('film 1', 'film 2')));
  297. INSERT INTO klienci VALUES(NEW klient('Sekuła', NEW wypozyczonefilmy('film 3', 'film 4')));
  298.  
  299. SELECT VALUE(x) FROM TABLE(SELECT filmy FROM klienci WHERE nazwisko = 'Pazera') x;
  300. INSERT INTO TABLE(SELECT filmy FROM klienci WHERE nazwisko = 'Pazera') VALUES('film 10');
  301. UPDATE TABLE(SELECT filmy FROM klienci WHERE nazwisko = 'Pazera') x SET VALUE(x) = 'film 2' WHERE VALUE(x) = 'film2 ';
  302. DELETE 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ą.
  307. SELECT 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.  
  315. CREATE 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.  
  322. CREATE TABLE samochody OF samochod;
  323. INSERT INTO samochody VALUES(NEW samochod('Fiat', 'Punto', 1996, 3000.50));
  324. INSERT INTO samochody VALUES(NEW samochod('Opel', 'Astra', 1997, 7000.50));
  325.  
  326. SELECT * FROM samochody;
  327. SELECT 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.
  332. CREATE TABLE lasciciele (
  333.     imie
  334.     nazwisko
  335.     sam samochod;
  336. )
  337.  
  338. ALTER 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.    
  348. CREATE 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.  
  363. CREATE TABLE wlasciciele (
  364.     imie VARCHAR2(30),
  365.     nazwisko VARCHAR2(30),
  366.     sam samochod
  367. );
  368.  
  369. ALTER 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.  
  379. CREATE 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;
  399. END;
  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.
  404. CREATE OR REPLACE TYPE samochodyTab AS VARRAY(10) OF VARCHAR2(30);
  405. DECLARE
  406.     sam samochodyTab;
  407.     LAST NUMBER;
  408. BEGIN
  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;
  424. END;
  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.
  429. CREATE OR REPLACE TYPE samochodyTab2 AS TABLE OF VARCHAR2(30);
  430. DECLARE
  431.     sam samochodyTab2;
  432.     LAST NUMBER;
  433. BEGIN
  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));
  460. END;
  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.
  467. CREATE 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.  
  474. CREATE TABLE studenciTable OF studentObj;
  475. INSERT INTO studenciTable VALUES(NEW studentObj('Tomasz', 'Pazera', DATE '1996-12-13', 121088));
  476. INSERT INTO studenciTable VALUES(NEW studentObj('Zuzanna', 'Pazera', DATE '1996-12-13', 121089));
  477.  
  478. SELECT * FROM studenciTable;
  479. SELECT 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.
  484. CREATE OR REPLACE TYPE adresObj AS OBJECT
  485. (
  486.     miejscowosc VARCHAR2(30),
  487.     ulica       VARCHAR2(50)
  488. );
  489.  
  490. CREATE TABLE adresy OF adresObj;
  491.  
  492. INSERT INTO adresy VALUES(NEW adresObj('Kraków', 'Lea'));
  493. INSERT INTO adresy VALUES(NEW adresObj('Kraków', 'Warszawska'));
  494.  
  495.  
  496. CREATE 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.  
  504. CREATE TABLE studenci OF STUDENTOBJ;
  505.  
  506. INSERT INTO studenci VALUES(NEW studentObj('Tomasz', 'Pazera', DATE '1996-12-13', 121088, (SELECT REF(a) FROM adresy a WHERE a.ulica = 'Lea' )));
  507.  
  508. SELECT 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.  
  521. CREATE OR REPLACE TYPE bazafilmow AS TABLE OF VARCHAR(255);
  522.  
  523. DECLARE
  524.     baza bazafilmow;
  525.     LAST NUMBER;
  526. BEGIN
  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;
  555. END;
  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.
  562. CREATE OR REPLACE TYPE telefon AS OBJECT (
  563.     siec VARCHAR2(30),
  564.     nr NUMBER(9),
  565.     darmowe_minuty NUMBER(20)
  566. );
  567.  
  568. CREATE TABLE telefony OF telefon;
  569.  
  570. INSERT INTO telefony VALUES(NEW telefon('TMobile', 95929323, 200));
  571. INSERT INTO telefony VALUES(NEW telefon('Orange', 929233123, 100));
  572.  
  573. SELECT * FROM telefony;
  574. SELECT 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.
  580. CREATE TABLE wlasciciele (
  581.     imie VARCHAR2(30),
  582.     nazwisko VARCHAR2(30),
  583.     tel telefon
  584. );
  585.  
  586. ALTER 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.  
  595. CREATE 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;
  610. END;
  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.
  616. CREATE OR REPLACE TYPE produkt AS VARRAY(10) OF VARCHAR2(30);
  617.  
  618. DECLARE
  619.     bazap produkt;
  620.     LAST NUMBER;
  621. BEGIN
  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;
  637. END;
  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.
  642. CREATE OR REPLACE TYPE produkty2 AS TABLE OF VARCHAR2(30);
  643.  
  644. DECLARE
  645.     bazap produkty2;
  646.     LAST NUMBER;
  647. BEGIN
  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;
  675. END;
  676.  
  677. -- TEORIA
  678. Kolekcje TO zbiory obiektów
  679.  
  680. Metody:
  681. nazwa_kolekcji(wartosc, ...) - konstruktor kolekcji
  682. extend(x) - rozszerza kolekcję o x pustych elementów
  683. extend(x,i) - rozszerza kolekcje o x elementow o wartosci i-tego elementu
  684. TRIM(x) - usuwa x elementow od konca kolekcji
  685. DELETE(i) - usuwa i-ty element kolekcji
  686. delte(i, i+3) - usuwa od i-tego DO i+3-ego elementy kolekcji
  687. next(x) - zwraca indeks elementu następującego element o indeksie x
  688. PRIOR(x) - TO samo tylko poprzedzającego
  689. EXISTS(x) - sprawdza czy x element istnieje
  690. FIRST - indeks pierwszego
  691. LAST - indeks ostatniego
  692. limit - MAX zakres kolekcji
  693. COUNT - liczba elementow kolekcji
  694.  
  695.  
  696. Porównaj typy kolekcji:
  697. Wyróżniamy 2 typy kolekcji:
  698. - tabelę o zmiennym rozmiarze
  699. - tabelę zagnieżdżONą
  700. W tabeli o zmiennym rozmiarze nie można manipulować pojedynczymi elementami w SQL oraz elementy zachowują
  701. fizyczny porzadek. W varray podajemy maksymalną liczbę elementów.
  702.  
  703. W tabeli zagnieżdzonej mozna manipulowac pojedynczymi elementami w SQL oraz należy wskazać tabelę out-line DO
  704. przechowywania kolekcji. Nie ma limitu liczby elementów tabeli. Można na przykład usunąć element ze środka tabeli.
  705.  
  706. Dostęp obiektowy DO obiektu krotkowego: SELECT VALUE(x) FROM TABLE x;
  707. Dostep relacyjny DO obiektu krotkowego: SELECT * FROM TABLE;
  708.  
  709. Metody 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.  
  715. Metoda 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.  
  719. DROP TYPE nazwa_typu FORCE - usunięcie typu wraz z zależnościami
  720.  
  721. Perspektywy:
  722.     USER_OBJECTS - informacje o typach obiektowych
  723.     USER_METHOD_PARAMS, USER_METHOD_RESULTS, USER_TYPE_METHODS - informacje o metodach typów obiektowych
  724.  
  725. TOżsamość obiektu TO unikalny i niezmienny identyfikator związany z danym obiektem przez cały cykl jego życia/
  726. TOżsamość posiadają tylko obiekty krotkowe, zapewniana jest przez OID.
  727. Identyfikatory sa lokalne i globalnie unikalne, automatycznie indeksowane.
  728. Aplikacja może wykorzystywac referencje DO identyfikatorów, odczytywane za pomocą REF()
  729.  
  730. Przykład funkcji odwzorowującej:
  731. MAP MEMBER FUNCTION odwzoruj RETURN NUMBER IS
  732. BEGIN
  733.     RETURN wiek() + 3;
  734. END;
  735.  
  736. Co TO konstruktor?
  737. Metoda DO tworzenia typów obiektowych. Typ obiektowy dostarcza domyslny konstruktor.
  738. Nazwa konstruktora jest taka sama jak nazwa typu obiektowego. Użytkownik może defniować własne konstruktory lub
  739. przesłonić domyślny.
  740. CONSTRUCTOR FUNCTION nazwa_typu (test VARCHAR2) RETURN SELF AS RESULT;
  741.  
  742. Referencje
  743. typ obiektowy może posiadac referencje na istniejący obiekt innego typu obiektowego.
  744. np. obiekt osoba i adres
  745. kilka obiektów osoba może posiadać referencje na ten sam obiekt adres
  746.  
  747. Nawigacja jawna
  748. SELECT o.pole1, DEREF(o.referencja) FROM tablica o;
  749.  
  750. Nawigacja niejawna
  751. SELECT o.pole1, o.referencja.pole1 FROM tablica o;
  752.  
  753. SELECT nazwisko, VALUE(x) FROM klienci CROSS JOIN TABLE(filmy) x;
  754.  
  755. Ograniczenia integralnościowe
  756. możliwe jest tylko dla tabel obiektowych (czyli CREATE TABLE tabela OF obiekt);
  757. ALTER TABLE TABLE ADD PRIMARY KEY(pole1, pole2);
  758. ALTER TABLE tabela ADD CONSTRAINT ograniczenie CHECK (liczba > 0);
  759. ALTER TABLE tabela ADD CONSTRAINT ograniczenie2 liczba NOT NULL;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement