Oracle PL/SQL/Object Oriented Database/Self

Материал из SQL эксперт
Перейти к: навигация, поиск

Use self reference

SQL> CREATE OR REPLACE TYPE aobj AS object (
  2                    state CHAR(2),
  3                    amt NUMBER(5),
  4
  5                    MEMBER FUNCTION mult (times in number) RETURN number,
  6                    PRAGMA RESTRICT_REFERENCES(mult, WNDS));
  7  /
Type created.
SQL>
SQL>
SQL> -- "self"
SQL>
SQL> CREATE OR REPLACE TYPE BODY aobj AS
  2  MEMBER FUNCTION mult (times in number) RETURN NUMBER
  3  IS
  4    BEGIN
  5      RETURN times * self.amt;
  6    END;
  7  END;
  8  /
Type body created.
SQL>
SQL>
SQL> CREATE TABLE aobjtable (arow aobj);
Table created.
SQL>
SQL>
SQL>
SQL> INSERT INTO aobjtable VALUES (aobj("FL",25));
1 row created.
SQL> INSERT INTO aobjtable VALUES (aobj("AL",35));
1 row created.
SQL> INSERT INTO aobjtable VALUES (aobj("OH",15));
1 row created.
SQL>
SQL> -- Use the function we created: use the table alias in our SELECT as well as the qualifier, arow:
SQL>
SQL> SELECT x.arow.state, x.arow.amt, x.arow.mult(2)
  2  FROM aobjtable x;
AR   AROW.AMT X.AROW.MULT(2)
-- ---------- --------------
FL         25             50
AL         35             70
OH         15             30
SQL>
SQL>
SQL> DESC aobjtable;
 Name                                                                                                  Null?    Type
 ----------------------------------------------------------------------------------------------------- -------- --------------------------------------------------------------------
 AROW                                                                                                   AOBJ
SQL>
SQL> drop table aobjtable;
Table dropped.
SQL>
SQL>



Use self to reference member variable

 
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) ||" days over your vacation limit." );
 11      end if;
 12    end;
 13  end;
 14  /
Type body created.
SQL>
SQL>
SQL> create or replace type consultant under employee(
  2    hourly_rate number,
  3    overriding member procedure give_raise( p_increase number ),
  4    overriding member function yearly_compensation return number
  5  )
  6  /
Type created.
SQL>
SQL>
SQL>
SQL> create or replace
  2  type body consultant as
  3    overriding member procedure give_raise( p_increase number ) is
  4    begin
  5      self.hourly_rate := self.hourly_rate + p_increase;
  6    end;
  7    overriding member function yearly_compensation return number is
  8    begin
  9      return self.hourly_rate * 40 * 52;
 10    end;
 11  end;
 12  /
Type body created.
SQL>
SQL> drop type consultant;
Type dropped.
SQL>
SQL> drop type employee;
Type dropped.
SQL>