Object Oriented Database Oracle PLSQL

SQL>
SQL>
SQL> create or replace
  2  type employee as object(
  3    name varchar2(100),
  4    empno number,
  5    hiredate date,
  6    vacation_used number,
  7    final member procedure vacation( p_days number ),
  8    not instantiable member procedure give_raise( p_increase number ),
  9    not instantiable member function yearly_compensation return number
 10  )
 11  not instantiable
 12  not final
 13  /
Type created.
SQL>
SQL> create or replace
  2  type body employee as
  3    final member procedure vacation( p_days number ) is
  4    begin
  5      if p_days + self.vacation_used <= 10 then
  6        self.vacation_used := self.vacation_used + p_days;
  7      else
  8        raise_application_error(
  9          -20001,
 10          'You are ' || to_char(p_days + self.vacation_used - 10) ||
 11          ' days over your vacation limit.' );
 12      end if;
 13    end;
 14  end;
 15  /
Type body created.
SQL>
SQL>
SQL> create or replace
  2  type sales_rep
  3  under employee(
  4    salary number,
  5    commission number,
  6    overriding member procedure give_raise( p_increase number ),
  7    member procedure give_commission( p_increase number ),
  8    overriding member function yearly_compensation return number
  9  )
 10  /
Type created.
SQL> create or replace
  2  type body sales_rep as
  3   overriding member procedure give_raise( p_increase number ) is
  4   begin
  5     self.salary := self.salary + (self.salary * (p_increase/100));
  6   end;
  7   member procedure give_commission( p_increase number ) is
  8   begin
  9     self.commission := self.commission + p_increase;
 10   end;
 11   overriding member function yearly_compensation return number is
 12   begin
 13     return self.salary + self.commission;
 14   end;
 15  end;
 16  /
Type body created.
SQL>
SQL> drop type sales_rep;
Type dropped.
SQL> drop type employee;
Type dropped.
SQL>
SQL>