Mega Code Archive

 
Categories / Oracle PLSQL / Object Oriented Database
 

Demonstrates SQL operations on object types

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>