/********************LABORATORIUM 1:set autotrace on;select nazwisko, placa_pod from pracownicy;select nazwisko, placa_pod from pracownicy where numer = 1150; //użyto indexselect nazwisko, placa_pod from pracownicy where numer + 0 = 1150; //nie użyto indexuselect * from pracownicy, zespoly where nazwa like '%A';SELECT id_zesp FROM pracownicyMINUSSELECT id_zesp FROM pracownicy;SELECT kierunek, COUNT(*) FROM student GROUP BY kierunek UNION SELECT NULL, COUNT(*) FROM student; //niewydajneSELECT kierunek, COUNT(*) FROM studentGROUP BY cube(kierunek); //wydajne// przy DISTINCT pojawia się sortowanieSELECT * FROM ( SELECT nazwisko, placa_pod FROM pracownicy ORDER by placa_pod)WHERE ROWNUM <=4;/*********************WYKLAD 2:CREATE [OR REPLACE] TYPE nazwa AS OBJECT ( nazwa1 typ1 [...], nazwa2 typ2 [...], [MEMBER PROCEDURE nazwa_procedury], [MEMBER FUNCTION nazwa_funkcji RETURN typ]);/DROP TYPE nazwa_typu;DESCRIBE nazwa_typu;CREATE OR REPLACE TYPE ulamek AS OBJECT ( licznik NUMBER (4), mianownik NUMBER (4), MEMBER PROCEDURE skroc);CREATE OR REPLACE TYPE BODY ulamek ASMEMBER PROCEDURE skrocIS r NUMBER;BEGIN r:=nwd (licznik, mianownik); licznik:=licznik/r; mianownik:=mianownik/r;END skroc;END;/CREATE TABLE ulamki ( atrybut ulamek, CONSTRAINT ulamki_chk CHECK (atrybut.mianownik <> 0));INSERT INTO ulamki VALUES (ulamek (12, 4));CREATE TABLE ulamki_bis OF ulamek;ALTER TABLE ulamki_bis ADD CONSTRAINTS ulamki_bis_chk CHECK (mianownik <> 0);INSERT INTO ulamki_bis VALUES (3, 5);INSERT INTO ulamki_bis VALUES (12, 5);SELECT * FROM ulamki_bis;SELECT VALUE(u) FROM ulamki_bis u;/******** DZIEDZICZENIE:CREATE OR REPLACE TYPE publikacja AS OBJECT ( tytul VARCHAR2 (30), autor VARCHAR2 (25)) NOT FINAL;/CREATE OR REPLACE TYPE recenzja UNDER publikacja ( dla_kogo_recenzja VARCHAR2 (30));CREATE OR REPLACE TYPE ksiazka UNDER publikacja ( wydawnictwo VARCHAR2 (20));CREATE TABLE publikacje OF publikacja;INSERT INTO publikacje VALUES (publikacja ('Systemy rozproszone', 'Roman Wychowaniec') );INSERT INTO publikacje VALUES ( recenzja ('Inzynieria oprogramowania', 'Krzysztof Wiaderek', 'Praca dyplomowa') );INSERT INTO publikacjeVALUES ( ksiazka ('Systemy baz danych', 'J. Date', 'PWN') );SELECT * FROM publikacje p;SELECT VALUE (p) FROM publikacje p;SELECT TREAT (VALUE(p) AS publikacja)FROM publikacje p WHERE autor LIKE '%D%';// VALUE (zmienna korelacyjna)// TREAT (wyrazenie AS typ) // rzutowanie/******************************LAB3CREATE OR REPLACE TYPE adres AS OBJECT ( kod VARCHAR2 (6), miasto VARCHAR2 (20), ulica VARCHAR2 (20));CREATE OR REPLACE TYPE osoba AS OBJECT ( pesel NUMBER (11), nazwisko VARCHAR2 (20), zam REF adres);CREATE TABLE osoby OF osoba;DECLARErob REF adres;BEGIN INSERT INTO adresy Ad VALUES (0, 0, 0); RETURNING RED (Ad) INTO rob; INSERT INTO osoby VALUES (0, 0, rob); INSERT INTO osoby VALUES (0, 0, rob);END;SELECT o.nazwisko, DEREF (o.zam) FROM osoby o;/******************** WYKLADCREATE OR REPLACE TYPE filia AS OBJECT ( numer NUMBER (1), adres VARCHAR (25), telefon VARCHAR (10));CREATE OR REPLACE TYPE filie AS VARRAY (5) OF filia;CREATE TABLE banki ( nazwa VARCHAR2 (20), centrala VARCHAR2 (15), oddzialy filie);INSERT INTO banki VALUES ( 'PKO', 'Warszawa', filie (filia(2, 'Czestochowa', '232323232'), filia (3, 'Krakow, '21323123')));CREATE OR REPLACE TYPE lokal AS OBJECT ( nazwa VARCHAR2 (20), powierzchnia NUMBER (6, 1));CREATE OR REPLACE TYPE lokale AS TABLE OF lokal;CREATE OR REPLACE TYPE budynek AS OBJECT ( adres VARCHAR2 (30), zasob lokale, MEMBER FUNCTION lista_lokali RETURN NUMBER);CREATE OR REPLACE TYPE BODY budynek ASMEMBER FUNCTION liczba_lokali RETURN NUMBERISBEGIN RETURN zasob COUNT();END liczba_lokali;END;CREATE TABLE budynki OF budynek NESTED TABLE zasob STORE AS zas_lokali;// Wskazanie miejsca zagniezdzenia tabeli zawsze gdy taka istniejeINSERT INTO budynki VALUES (budynek ('Czestochowa NMP 23', lokale (lokal('Mieszkanie', 63.4), lokal ('Biuro', 78))) );SELECT * FROM budynki;SELECT adres, b.liczba_lokali() FROM budynki b;SELECT b.nazwa, b.powierzchnia FROM ( SELECT zasob FROM budynki WHERE adres LIKE '%K%') b;// THE = TABLE (nowszy i zalecany)INSERT INTO THE (SELECT zasob FROM budynki WHERE adres LIKE '%K%') VALUES (lokal ('Biuro PZU', 125));/*************** PERSPEKTYWYkomputery (kom_id, typ_plyty, ram, procesor)dyski (dysk_id, komp_id, pojem, producent)CREATE OR REPLACE TYPE typ_dysk AS OBJECT ( dysk_id NUMBER (4), pojem NUMBER (4, 1), producent VARCHAR2 (10));CREATE OR REPLACE TYPE kolekcja dyskow AS TABLE OF typ_dysk;CREATE OR REPLACE TYPE typ_komputer AS OBJECT ( komp_id NUMBER (4), typ_plyty VARCHAR2 (40), ram NUMBER (3), procesor VARCHAR2 (15), dysk kolekcja_dyskow);CREATE OR REPLACE VIEW zb_komputery OF typ_komputerWITH OBJECT IDENTIFIER (komp_id)ASSELECT komp_id, typ_plyty, procesor, CAST( MULTISET( SELECT typ_dysk(dysk_id, pojem, producent) FROM dyski WHERE komp_id = k.komp_id ) AS kolekcja_dyskow )FROM komputery K// CAST (MULTISET (podzapytanie) AS typ_kolekcji)CREATE OR REPLACE TYPE nazwiska AS TABLE OF VARCHAR (30);SELECT nazwa, CAST (MULTISET( SELECT nazwisko FROM pracownicy WHERE etat = nazwa) AS nazwiska)FROM etaty;// METODY NA VARRAY: count () extend () delete () last () first () next ()DECLARE fil filie; i NUMBER;BEGIN SELECT oddzialy INTO fil FROM banki WHERE nazwa = 'PKO'; fil.extend (1); fil(fil.last) := filia (4, 'Wroclaw', '23123123'); UPDATE banki SET oddzialy = fil WHERE nazwa = 'PKO'; FOR i IN 1..fil.count() LOOP dbms_output.put_lines(fil(i).numer || ' ' || fil(i).adres); END LOOP;END;