/********************LABORATORIUM 1: set autotrace on; select nazwisko, placa_pod from pracownicy; select nazwisko, placa_pod from pracownicy where numer = 1150; //użyto index select nazwisko, placa_pod from pracownicy where numer + 0 = 1150; //nie użyto indexu select * from pracownicy, zespoly where nazwa like '%A'; SELECT id_zesp FROM pracownicy MINUS SELECT id_zesp FROM pracownicy; SELECT kierunek, COUNT(*) FROM student GROUP BY kierunek UNION SELECT NULL, COUNT(*) FROM student; //niewydajne SELECT kierunek, COUNT(*) FROM student GROUP BY cube(kierunek); //wydajne // przy DISTINCT pojawia się sortowanie SELECT * 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 AS MEMBER PROCEDURE skroc IS 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 publikacje VALUES ( 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 /******************************LAB3 CREATE 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; DECLARE rob 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; /******************** WYKLAD CREATE 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 AS MEMBER FUNCTION liczba_lokali RETURN NUMBER IS BEGIN 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 istnieje INSERT 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)); /*************** PERSPEKTYWY komputery (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_komputer WITH OBJECT IDENTIFIER (komp_id) AS SELECT 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;