DROP TABLE PRACOWNICY;
DROP TABLE ZESPOLY;
DROP TABLE ETATY;
 
CREATE TABLE ZESPOLY
	(ID_ZESP NUMBER(2) CONSTRAINT PK_ZESP PRIMARY KEY,
	NAZWA VARCHAR2(20),
	ADRES VARCHAR2(20) );

CREATE TABLE ETATY
      ( NAZWA VARCHAR2(10) CONSTRAINT PK_ETAT PRIMARY KEY,
	PLACA_MIN NUMBER(6,2),
	PLACA_MAX NUMBER(6,2));

CREATE TABLE PRACOWNICY
       (ID_PRAC NUMBER(4) CONSTRAINT PK_PRAC PRIMARY KEY,
	NAZWISKO VARCHAR2(15),
	ETAT VARCHAR2(10) CONSTRAINT FK_ETAT REFERENCES ETATY(NAZWA),
	ID_SZEFA NUMBER(4) CONSTRAINT FK_ID_SZEFA REFERENCES PRACOWNICY(ID_PRAC), 
	ZATRUDNIONY DATE,
	PLACA_POD NUMBER(6,2) CONSTRAINT MIN_PLACA_POD CHECK(PLACA_POD>100),
	PLACA_DOD NUMBER(6,2),
	ID_ZESP NUMBER(2) CONSTRAINT FK_ID_ZESP REFERENCES ZESPOLY(ID_ZESP));
  
INSERT INTO ZESPOLY VALUES (10,'ADMINISTRACJA',      'PIOTROWO 3A');
INSERT INTO ZESPOLY VALUES (20,'SYSTEMY ROZPROSZONE','PIOTROWO 3A');
INSERT INTO ZESPOLY VALUES (30,'SYSTEMY EKSPERCKIE', 'STRZELECKA 14');
INSERT INTO ZESPOLY VALUES (40,'ALGORYTMY',          'WLODKOWICA 16');
INSERT INTO ZESPOLY VALUES (50,'BADANIA OPERACYJNE', 'MIELZYNSKIEGO 30');

INSERT INTO ETATY VALUES ('PROFESOR'  ,800.00,1500.00);
INSERT INTO ETATY VALUES ('ADIUNKT'   ,510.00, 750.00);
INSERT INTO ETATY VALUES ('ASYSTENT'  ,300.00, 500.00);
INSERT INTO ETATY VALUES ('STAZYSTA'  ,150.00, 250.00);
INSERT INTO ETATY VALUES ('SEKRETARKA',270.00, 450.00);
INSERT INTO ETATY VALUES ('DYREKTOR' ,1280.00,2100.00);
 
INSERT INTO PRACOWNICY VALUES (100,'WEGLARZ'    ,'DYREKTOR'  ,NULL,to_Date('01-01-1968','DD-MM-YY'),1730.00,420.50,10);
INSERT INTO PRACOWNICY VALUES (110,'BLAZEWICZ'  ,'PROFESOR'  ,100 ,to_Date('01-05-1973','DD-MM-YY'),1350.00,210.00,40);
INSERT INTO PRACOWNICY VALUES (120,'SLOWINSKI'  ,'PROFESOR'  ,100 ,to_Date('01-09-1977','DD-MM-YY'),1070.00,  NULL,30);
INSERT INTO PRACOWNICY VALUES (130,'BRZEZINSKI' ,'PROFESOR'  ,100 ,to_Date('01-07-1968','DD-MM-YY'), 960.00,  NULL,20);
INSERT INTO PRACOWNICY VALUES (140,'MORZY'      ,'PROFESOR'  ,130 ,to_Date('15-09-1975','DD-MM-YY'), 830.00,105.00,20);
INSERT INTO PRACOWNICY VALUES (150,'KROLIKOWSKI','ADIUNKT'   ,130 ,to_Date('01-09-1977','DD-MM-YY'), 645.50,  NULL,20);
INSERT INTO PRACOWNICY VALUES (160,'KOSZLAJDA'  ,'ADIUNKT'   ,130 ,to_Date('01-03-1985','DD-MM-YY'), 590.00,  NULL,20);
INSERT INTO PRACOWNICY VALUES (170,'JEZIERSKI'  ,'ASYSTENT'  ,130 ,to_Date('01-10-1992','DD-MM-YY'), 439.70, 80.50,20);
INSERT INTO PRACOWNICY VALUES (190,'MATYSIAK'   ,'ASYSTENT'  ,140 ,to_Date('01-09-1993','DD-MM-YY'), 371.00,  NULL,20);
INSERT INTO PRACOWNICY VALUES (180,'MAREK'      ,'SEKRETARKA',100 ,to_Date('20-02-1985','DD-MM-YY'), 410.20,  NULL,10);
INSERT INTO PRACOWNICY VALUES (200,'ZAKRZEWICZ' ,'STAZYSTA'  ,140 ,to_Date('15-07-1994','DD-MM-YY'), 208.00,  NULL,30);
INSERT INTO PRACOWNICY VALUES (210,'BIALY'      ,'STAZYSTA'  ,130 ,to_Date('15-10-1993','DD-MM-YY'), 250.00,170.60,30);
INSERT INTO PRACOWNICY VALUES (220,'KONOPKA'    ,'ASYSTENT'  ,110 ,to_Date('01-10-1993','DD-MM-YY'), 480.00,  NULL,20);
INSERT INTO PRACOWNICY VALUES (230,'HAPKE'      ,'ASYSTENT'  ,120 ,to_Date('01-09-1992','DD-MM-YY'), 480.00, 90.00,30);
 

drop table pracownicy_o;
drop table zespoly_o;
drop table etaty_o;

drop type pracownicy_tab force;
drop type pracownik force;
drop type zespol force;
drop type etat force;

create or replace type pracownik;
/

create or replace type pracownicy_tab as table of ref Pracownik;
/

create or replace type zespol as object (
	ID_ZESP number(2),
	NAZWA VARCHAR2(20),
	ADRES VARCHAR2(20),
	PRACOWNICY PRACOWNICY_TAB
)
/

create or replace type etat as object (
	NAZWA VARCHAR2(10),
	PLACA_MIN NUMBER(6,2),
	PLACA_MAX NUMBER(6,2),
	PRACOWNICY PRACOWNICY_TAB
)
/


create or replace type pracownik as object (
	ID_PRAC number(4),
	NAZWISKO VARCHAR2(15),
	etat_ varchar2(10),
	ETAT_PRAC REF ETAT,
        ID_SZEFA number(4),
	SZEF REF PRACOWNIK,
	ZATRUDNIONY DATE,
	PLACA_POD NUMBER(6,2),
	PLACA_DOD NUMBER(6,2),
        ID_ZESP number(2),
	ZESPOL_PRAC REF ZESPOL
)
/

sho err;

create table pracownicy_o of pracownik;

create table zespoly_o of zespol
nested table pracownicy store as pracownicy_w_zespole;

create table etaty_o of etat
nested table pracownicy store as pracownicy_na_etacie;


insert into pracownicy_o 
select pracownik(id_prac,nazwisko,etat,null,id_szefa,null,zatrudniony,placa_pod,placa_dod,id_zesp,null)
from pracownicy;

insert into etaty_o
select etat(nazwa,placa_min,placa_max,
 cast(multiset(
  select ref(p)
  from pracownicy_o p
  where p.etat_=e.nazwa
 ) as pracownicy_tab))
from etaty e;

insert into zespoly_o
select zespol(id_zesp,nazwa,adres,
 cast(multiset(
  select ref(p)
  from pracownicy_o p
  where p.id_zesp=z.id_zesp
 ) as pracownicy_tab))
from zespoly z;

update pracownicy_o p
set p.szef=(
 select ref(x)
 from pracownicy_o x
 where x.id_prac=p.id_szefa)
where p.id_szefa is not null;

update pracownicy_o p
set p.etat_prac=(
 select ref(x)
 from etaty_o x
 where x.nazwa=p.etat_);

update pracownicy_o p
set p.zespol_prac=(
 select ref(x)
 from zespoly_o x
 where x.id_zesp=p.id_zesp);
 


alter type pracownik drop attribute id_prac cascade including table data;
alter type pracownik drop attribute id_szefa cascade including table data;
alter type pracownik drop attribute id_zesp cascade including table data;
alter type pracownik drop attribute etat_ cascade including table data;

alter type zespol drop attribute id_zesp cascade including table data;

COMMIT;

