Object Oriented Database Oracle PLSQL

SQL>
SQL> set serveroutput on
SQL> CREATE OR REPLACE TYPE Point AS OBJECT (
  2    x NUMBER,
  3    y NUMBER,
  4
  5    MEMBER FUNCTION ToString RETURN VARCHAR2,
  6    PRAGMA RESTRICT_REFERENCES(ToString, RNDS, WNDS, RNPS, WNPS),
  7
  8    MEMBER FUNCTION Distance(p IN Point DEFAULT Point(0,0))
  9      RETURN NUMBER,
 10    PRAGMA RESTRICT_REFERENCES(Distance, RNDS, WNDS, RNPS, WNPS),
 11
 12    MEMBER FUNCTION Plus(p IN Point) RETURN Point,
 13    PRAGMA RESTRICT_REFERENCES(Plus, RNDS, WNDS, RNPS, WNPS),
 14
 15    MEMBER FUNCTION Times(n IN NUMBER) RETURN Point,
 16    PRAGMA RESTRICT_REFERENCES(Times, RNDS, WNDS, RNPS, WNPS)
 17  );
 18  /
SQL>
SQL> CREATE OR REPLACE TYPE BODY Point AS
  2    MEMBER FUNCTION ToString RETURN VARCHAR2 IS
  3      myResult VARCHAR2(20);
  4      v_xString VARCHAR2(8) := SUBSTR(TO_CHAR(x), 1, 8);
  5      v_yString VARCHAR2(8) := SUBSTR(TO_CHAR(y), 1, 8);
  6    BEGIN
  7      myResult := '(' || v_xString || ', ';
  8      myResult := myResult || v_yString || ')';
  9      RETURN myResult;
 10    END ToString;
 11
 12    MEMBER FUNCTION Distance(p IN Point DEFAULT Point(0,0))
 13      RETURN NUMBER IS
 14    BEGIN
 15      RETURN SQRT(POWER(x - p.x, 2) + POWER(y - p.y, 2));
 16    END Distance;
 17
 18    MEMBER FUNCTION Plus(p IN Point) RETURN Point IS
 19      myResult Point;
 20    BEGIN
 21      myResult := Point(x + p.x, y + p.y);
 22      RETURN myResult;
 23    END Plus;
 24
 25    MEMBER FUNCTION Times(n IN NUMBER) RETURN Point IS
 26      myResult Point;
 27    BEGIN
 28      myResult := Point(x * n, y * n);
 29      RETURN myResult;
 30    END Times;
 31  END;
 32  /
Type body created.
SQL> show errors
No errors.
SQL>
SQL>
SQL> DECLARE
  2    v_P1 Point := Point(-1, 5);
  3    v_P2 Point := Point(5, 2);
  4    myResult Point;
  5  BEGIN
  6    DBMS_OUTPUT.PUT_LINE('p1: ' || v_P1.toString);
  7    DBMS_OUTPUT.PUT_LINE('p2: ' || v_P2.toString);
  8
  9    DBMS_OUTPUT.PUT_LINE('Distance between p1 and p2 = ' || v_P1.Distance(v_P2));
 10
 11    DBMS_OUTPUT.PUT_LINE('Distance between p1 and the origin = ' ||
 12      v_P1.Distance);
 13
 14    myResult := v_P1.Times(n => 2.5);
 15    DBMS_OUTPUT.PUT_LINE('p1 * 2.5: ' || myResult.toString);
 16    myResult := v_P1.Plus(p => v_P2);
 17    DBMS_OUTPUT.PUT_LINE('p1 + p2: ' || myResult.toString);
 18  END;
 19  /
p1: (-1, 5)
p2: (5, 2)
Distance between p1 and p2 = 6.70820393249936908922752100619382870632
Distance between p1 and the origin = 5.09901951359278483002822410902278198956
p1 * 2.5: (-2.5, 12.5)
p1 + p2: (4, 7)
PL/SQL procedure successfully completed.
SQL>
SQL>