SQL>
SQL>
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 /
Type created.
SQL> show errors
No errors.
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> set serveroutput on
SQL>
SQL> DECLARE
2 v_Point1 Point := Point(1, 2);
3 v_Point2 Point;
4 v_Point3 Point;
5 BEGIN
6 v_Point2 := v_Point1.Times(4);
7 v_Point3 := v_Point1.Plus(v_Point2);
8 DBMS_OUTPUT.PUT_LINE('Point 2: ' || v_Point2.ToString);
9 DBMS_OUTPUT.PUT_LINE('Point 3: ' || v_Point3.ToString);
10 DBMS_OUTPUT.PUT_LINE('Distance between origin and point 1: ' ||
11 v_Point1.Distance);
12 DBMS_OUTPUT.PUT_LINE('Distance between point 1 and point 2: ' ||
13 v_Point1.Distance(v_Point2));
14 END;
15 /
Point 2: (4, 8)
Point 3: (5, 10)
Distance between origin and point 1: 2.23606797749978969640917366873127623544
Distance between point 1 and point 2: 6.70820393249936908922752100619382870632
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL>
SQL> CREATE TABLE point_object_tab OF Point;
Table created.
SQL>
SQL>
SQL> CREATE TABLE point_column_tab (
2 key VARCHAR2(20),
3 value Point);
Table created.
SQL>
SQL> set serveroutput on
SQL>
SQL> DECLARE
2 v_Point Point := Point(1, 1);
3 v_NewPoint Point;
4 v_Key point_column_tab.key%TYPE;
5 v_XCoord NUMBER;
6 v_YCoord NUMBER;
7 BEGIN
8 INSERT INTO point_object_tab VALUES (v_Point);
9 INSERT INTO point_column_tab VALUES ('My Point', v_Point);
10
11 SELECT *
12 INTO v_XCoord, v_YCoord
13 FROM point_object_tab;
14 DBMS_OUTPUT.PUT_LINE('Relational query of object table: ' ||
15 v_XCoord || ', ' || v_YCoord);
16
17 SELECT VALUE(ot)
18 INTO v_NewPoint
19 FROM point_object_tab ot;
20 DBMS_OUTPUT.PUT_LINE('object table: ' || v_NewPoint.ToString);
21
22 SELECT key, value
23 INTO v_Key, v_NewPoint
24 FROM point_column_tab;
25 DBMS_OUTPUT.PUT_LINE('column table: ' || v_NewPoint.ToString);
26
27 END;
28 /
Relational query of object table: 1, 1
object table: (1, 1)
column table: (1, 1)
PL/SQL procedure successfully completed.
SQL>
SQL> DECLARE
2 v_PointRef REF Point;
3 v_Point Point;
4 BEGIN
5 DELETE FROM point_object_tab;
6
7 INSERT INTO point_object_tab (x, y)
8 VALUES (0, 0);
9 INSERT INTO point_object_tab (x, y)
10 VALUES (1, 1);
11
12 SELECT REF(ot)
13 INTO v_PointRef
14 FROM point_object_tab ot
15 WHERE x = 1 AND y = 1;
16
17 SELECT DEREF(v_PointRef)
18 INTO v_Point
19 FROM dual;
20 DBMS_OUTPUT.PUT_LINE('Selected reference ' ||
21 v_Point.ToString);
22
23 INSERT INTO point_object_tab ot (x, y)
24 VALUES (10, 10)
25 RETURNING REF(ot) INTO v_PointRef;
26 END;
27 /
Selected reference (1, 1)
PL/SQL procedure successfully completed.
SQL>
SQL> DROP TABLE point_column_tab;
Table dropped.
SQL> DROP TABLE point_object_tab;
Table dropped.
SQL>
|