Oracle PL/SQL/Object Oriented Database/Select

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

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>



Display the New Table (SELECT * and SELECT by Column Name)

SQL> CREATE OR REPLACE TYPE address_obj as OBJECT(
  2        street VARCHAR2(20),
  3        city VARCHAR2(20),
  4        state CHAR(2),
  5        zip CHAR(5));
  6  /
Type created.
SQL> CREATE TABLE emp (empno   NUMBER(3),
  2                    name    VARCHAR2(20),
  3                    address ADDRESS_OBJ);
Table created.
SQL>
SQL>
SQL> INSERT INTO emp VALUES (101, "Adam", ADDRESS_OBJ("1 A St.","Mobile","AL","36608"));
1 row created.
SQL>
SQL> SELECT * FROM emp;
     EMPNO NAME
---------- --------------------
ADDRESS(STREET, CITY, STATE, ZIP)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       101 Adam
ADDRESS_OBJ("1 A St.", "Mobile", "AL", "36608")

SQL>
SQL>
SQL> drop table emp;
Table dropped.
SQL>
SQL>
SQL>



Query data from table based on object

SQL> CREATE OR REPLACE TYPE address_obj as OBJECT(
  2        street VARCHAR2(20),
  3        city VARCHAR2(20),
  4        state CHAR(2),
  5        zip CHAR(5));
  6  /
Type created.
SQL>
SQL> CREATE TABLE address_table OF ADDRESS_OBJ;
Table created.
SQL>
SQL> INSERT INTO address_table VALUES ("4 D St.", "Gulf Breeze","FL","32563");
1 row created.
SQL>
SQL> SELECT *
  2  FROM address_table;
STREET               CITY                 ST ZIP
-------------------- -------------------- -- -----
4 D St.              Gulf Breeze          FL 32563

SQL>
SQL>
SQL>
SQL> drop table address_table;
Table dropped.
SQL>
SQL>



Query object table

 
SQL>
SQL>
SQL> create or replace
  2  type address as object(
  3   id number,
  4   street varchar2(100),
  5   state varchar2(2),
  6   zipcode varchar(11)
  7  )
  8  /
Type created.
SQL>
SQL> create table address_table of address
  2  /
Table created.
SQL>
SQL>
SQL> insert into address_table values ( 1, "Oracle Way", "VA", "21090" )
  2  /
1 row created.
SQL>
SQL> select * from address_table;

        ID
----------
STREET
--------------------------------------------------------------------------------
ST ZIPCODE
-- -----------
         1
Oracle Way
VA 21090

SQL> drop table address_table;
Table dropped.
SQL>



SELECTing Individual Columns in TCROs

SQL> CREATE OR REPLACE TYPE address_obj as OBJECT(
  2        street VARCHAR2(20),
  3        city VARCHAR2(20),
  4        state CHAR(2),
  5        zip CHAR(5));
  6  /
Type created.
SQL>
SQL> CREATE TABLE address_table OF ADDRESS_OBJ;
Table created.
SQL>
SQL> CREATE TABLE client (name VARCHAR2(20),
  2    address REF address_obj scope is address_table);
Table created.
SQL>
SQL> INSERT INTO address_table VALUES (ADDRESS_OBJ("1 A St.","Mobile","AL","36608"));
1 row created.
SQL>
SQL>
SQL>
SQL> INSERT INTO client SELECT "Walsh", REF(aa) FROM address_table aa;
1 row created.
SQL>
SQL>
SQL> -- SELECTing Individual Columns in TCROs
SQL>
SQL>
SQL> SELECT * FROM client;
NAME      ADDRESS
--------- --------------------------------------------------
Walsh     0000220208589A813178324DF39D575B3701C24CE19751BEFE
          0AF34AC18C9B571EDA8D0418

SQL>
SQL>
SQL>
SQL>
SQL> drop table client;
Table dropped.
SQL>
SQL> drop table address_table;
Table dropped.
SQL>
SQL>



SELECT Only One Column in the Composite

SQL> -- SELECTing Only One Column in the Composite
SQL>
SQL> CREATE OR REPLACE TYPE address_obj as OBJECT(
  2        street VARCHAR2(20),
  3        city VARCHAR2(20),
  4        state CHAR(2),
  5        zip CHAR(5));
  6  /
Type created.
SQL>
SQL> CREATE TABLE emp (empno   NUMBER(3),
  2                    name    VARCHAR2(20),
  3                    address ADDRESS_OBJ);
Table created.
SQL>
SQL>
SQL> INSERT INTO emp VALUES (101, "Adam", ADDRESS_OBJ("1 A St.","Mobile","AL","36608"));
1 row created.
SQL>
SQL> COLUMN name FORMAT a9
SQL> COLUMN empno FORMAT 999999
SQL> COLUMN address FORMAT a50
SQL>
SQL>
SQL> SELECT name, e.address.city FROM emp e;
NAME      ADDRESS.CITY
--------- --------------------
Adam      Mobile
SQL>
SQL>
SQL> drop table emp;
Table dropped.
SQL>
SQL>



Select the object type from the table, rather than the columns.

 
SQL>
SQL>
SQL> CREATE TABLE rel_tab (
  2    f1 NUMBER,
  3    f2 VARCHAR2(50)
  4  );
Table created.
SQL>
SQL> CREATE or replace TYPE objType AS OBJECT (
  2    f1 NUMBER,
  3    f2 VARCHAR2(50)
  4  );
  5  /
Type created.
SQL> show errors
No errors.
SQL>
SQL> CREATE TABLE obj_tab OF objType;
Table created.
SQL>
SQL>
SQL> DECLARE
  2    v_Row obj_tab%ROWTYPE;
  3    CURSOR c_AllRows IS
  4      SELECT VALUE(o) FROM obj_tab o;
  5  BEGIN
  6    OPEN c_AllRows;
  7    LOOP
  8      FETCH c_AllRows INTO v_Row;
  9      EXIT WHEN c_AllRows%NOTFOUND;
 10      DBMS_OUTPUT.PUT_LINE(v_Row.f1 || " " || v_Row.f2);
 11    END LOOP;
 12    CLOSE c_AllRows;
 13  END;
 14  /
PL/SQL procedure successfully completed.
SQL>
SQL> drop table rel_tab;
Table dropped.
SQL> drop table obj_tab;
Table dropped.



SELECT with a WHERE Clause

SQL> --SELECT with a WHERE Clause
SQL>
SQL> CREATE OR REPLACE TYPE address_obj as OBJECT(
  2        street VARCHAR2(20),
  3        city VARCHAR2(20),
  4        state CHAR(2),
  5        zip CHAR(5));
  6  /
Type created.
SQL>
SQL> CREATE TABLE emp (empno   NUMBER(3),
  2                    name    VARCHAR2(20),
  3                    address ADDRESS_OBJ);
Table created.
SQL>
SQL>
SQL> INSERT INTO emp VALUES (101, "Adam", ADDRESS_OBJ("1 A St.","Mobile","AL","36608"));
1 row created.
SQL>
SQL> COLUMN name FORMAT a9
SQL> COLUMN empno FORMAT 999999
SQL> COLUMN address FORMAT a50
SQL>
SQL> SELECT name, e.address.city FROM emp e WHERE e.address.state = "AL";
NAME      ADDRESS.CITY
--------- --------------------
Adam      Mobile
SQL>
SQL> drop table emp;
Table dropped.
SQL>
SQL>
SQL>



Use %ROWTYPE to select from the relational table.

 
SQL>
SQL> CREATE TABLE rel_tab (
  2    f1 NUMBER,
  3    f2 VARCHAR2(50)
  4  );
Table created.
SQL>
SQL> CREATE or replace TYPE objType AS OBJECT (
  2    f1 NUMBER,
  3    f2 VARCHAR2(50)
  4  );
  5  /
Type created.
SQL> show errors
No errors.
SQL>
SQL> CREATE TABLE obj_tab OF objType;
Table created.
SQL>
SQL>
SQL> DECLARE
  2    v_Row rel_tab%ROWTYPE;
  3    CURSOR c_AllRows IS
  4      SELECT * FROM rel_tab;
  5  BEGIN
  6    OPEN c_AllRows;
  7    LOOP
  8      FETCH c_AllRows INTO v_Row;
  9      EXIT WHEN c_AllRows%NOTFOUND;
 10      DBMS_OUTPUT.PUT_LINE(v_Row.f1 || " " || v_Row.f2);
 11    END LOOP;
 12    CLOSE c_AllRows;
 13  END;
 14  /
PL/SQL procedure successfully completed.
SQL>
SQL> drop table rel_tab;
Table dropped.
SQL> drop table obj_tab;
Table dropped.
SQL>



Use the function we created: use the table alias in our SELECT as well as the qualifier

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> 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; /* SEE BELOW */
  6    END;
  7  END;
  8  /
Type body created.
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 * to reference column with user-defined type

 
SQL>
SQL>
SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,
  2                    ENAME VARCHAR2(10),
  3                    JOB VARCHAR2(9),
  4                    MGR NUMBER(4),
  5                    HIREDATE DATE,
  6                    SAL NUMBER(7, 2),
  7                    COMM NUMBER(7, 2),
  8                    DEPTNO NUMBER(2));
Table created.
SQL>
SQL> INSERT INTO EMP VALUES (7369, "SMITH", "CLERK",    7902, TO_DATE("17-DEC-1980", "DD-MON-YYYY"), 800, NULL, 20);
1 row created.
SQL> INSERT INTO EMP VALUES (7499, "ALLEN", "SALESMAN", 7698, TO_DATE("20-FEB-1981", "DD-MON-YYYY"), 1600, 300, 30);
1 row created.
SQL> INSERT INTO EMP VALUES (7521, "WARD",  "SALESMAN", 7698, TO_DATE("22-FEB-1981", "DD-MON-YYYY"), 1250, 500, 30);
1 row created.
SQL> INSERT INTO EMP VALUES (7566, "JONES", "MANAGER",  7839, TO_DATE("2-APR-1981",  "DD-MON-YYYY"), 2975, NULL, 20);
1 row created.
SQL> INSERT INTO EMP VALUES (7654, "MARTIN", "SALESMAN", 7698,TO_DATE("28-SEP-1981", "DD-MON-YYYY"), 1250, 1400, 30);
1 row created.
SQL> INSERT INTO EMP VALUES (7698, "BLAKE", "MANAGER", 7839,TO_DATE("1-MAY-1981", "DD-MON-YYYY"), 2850, NULL, 30);
1 row created.
SQL> INSERT INTO EMP VALUES (7782, "CLARK", "MANAGER", 7839,TO_DATE("9-JUN-1981", "DD-MON-YYYY"), 2450, NULL, 10);
1 row created.
SQL> INSERT INTO EMP VALUES (7788, "SCOTT", "ANALYST", 7566,TO_DATE("09-DEC-1982", "DD-MON-YYYY"), 3000, NULL, 20);
1 row created.
SQL> INSERT INTO EMP VALUES (7839, "KING", "PRESIDENT", NULL,TO_DATE("17-NOV-1981", "DD-MON-YYYY"), 5000, NULL, 10);
1 row created.
SQL> INSERT INTO EMP VALUES (7844, "TURNER", "SALESMAN", 7698,TO_DATE("8-SEP-1981", "DD-MON-YYYY"), 1500, 0, 30);
1 row created.
SQL> INSERT INTO EMP VALUES (7876, "ADAMS", "CLERK", 7788,TO_DATE("12-JAN-1983", "DD-MON-YYYY"), 1100, NULL, 20);
1 row created.
SQL> INSERT INTO EMP VALUES (7900, "JAMES", "CLERK", 7698,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 950, NULL, 30);
1 row created.
SQL> INSERT INTO EMP VALUES (7902, "FORD", "ANALYST", 7566,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 3000, NULL, 20);
1 row created.
SQL> INSERT INTO EMP VALUES (7934, "MILLER", "CLERK", 7782,TO_DATE("23-JAN-1982", "DD-MON-YYYY"), 1300, NULL, 10);
1 row created.
SQL>
SQL> CREATE TABLE DEPT (DEPTNO NUMBER(2),DNAME VARCHAR2(14),LOC VARCHAR2(13) );
Table created.
SQL>
SQL> INSERT INTO DEPT VALUES (10, "ACCOUNTING", "NEW YORK");
1 row created.
SQL> INSERT INTO DEPT VALUES (20, "RESEARCH", "DALLAS");
1 row created.
SQL> INSERT INTO DEPT VALUES (30, "SALES", "CHICAGO");
1 row created.
SQL> INSERT INTO DEPT VALUES (40, "OPERATIONS", "BOSTON");
1 row created.
SQL>
SQL> create or replace type emp_type
  2    as object
  3    (empno       number(4),
  4     ename       varchar2(10),
  5     job         varchar2(9),
  6     mgr         number(4),
  7     hiredate    date,
  8     sal         number(7, 2),
  9     comm        number(7, 2)
 10    );
 11  /
Type created.
SQL>
SQL> create or replace type emp_tab_type as table of emp_type;
  2  /
Type created.
SQL> create table dept_and_emp
  2    (deptno number(2) primary key,
  3     dname     varchar2(14),
  4     loc       varchar2(13),
  5     emps      emp_tab_type
  6    )
  7    nested table emps store as emps_nt;
Table created.
SQL>
SQL>
SQL> insert into dept_and_emp
  2    select dept.*,
  3       CAST( multiset( select empno, ename, job, mgr, hiredate, sal, comm from emp ) AS emp_tab_type )
  4      from dept
  5  /
4 rows created.
SQL>
SQL>
SQL> select d.deptno, d.dname, emp.*
  2    from dept_and_emp D, table(d.emps) emp
  3  /
    DEPTNO DNAME               EMPNO ENAME      JOB              MGR HIREDATE                    SAL    COMM
---------- -------------- ---------- ---------- --------- ---------- -------------------- ---------- ----------
    DEPTNO DNAME               EMPNO ENAME      JOB              MGR HIREDATE                    SAL    COMM
---------- -------------- ---------- ---------- --------- ---------- -------------------- ---------- ----------
        10 ACCOUNTING           7369 SMITH      CLERK           7902 17-DEC-1980 00:00:00        800
        10 ACCOUNTING           7499 ALLEN      SALESMAN        7698 20-FEB-1981 00:00:00       1600        300
        10 ACCOUNTING           7521 WARD       SALESMAN        7698 22-FEB-1981 00:00:00       1250        500
        10 ACCOUNTING           7566 JONES      MANAGER         7839 02-APR-1981 00:00:00       2975
        10 ACCOUNTING           7654 MARTIN     SALESMAN        7698 28-SEP-1981 00:00:00       1250       1400
        10 ACCOUNTING           7698 BLAKE      MANAGER         7839 01-MAY-1981 00:00:00       2850
        10 ACCOUNTING           7782 CLARK      MANAGER         7839 09-JUN-1981 00:00:00       2450
        10 ACCOUNTING           7788 SCOTT      ANALYST         7566 09-DEC-1982 00:00:00       3000
        10 ACCOUNTING           7839 KING       PRESIDENT            17-NOV-1981 00:00:00       5000
        10 ACCOUNTING           7844 TURNER     SALESMAN        7698 08-SEP-1981 00:00:00       1500          0
        10 ACCOUNTING           7876 ADAMS      CLERK           7788 12-JAN-1983 00:00:00       1100
        10 ACCOUNTING           7900 JAMES      CLERK           7698 03-DEC-1981 00:00:00        950
        10 ACCOUNTING           7902 FORD       ANALYST         7566 03-DEC-1981 00:00:00       3000
        10 ACCOUNTING           7934 MILLER     CLERK           7782 23-JAN-1982 00:00:00       1300
        20 RESEARCH             7369 SMITH      CLERK           7902 17-DEC-1980 00:00:00        800
        20 RESEARCH             7499 ALLEN      SALESMAN        7698 20-FEB-1981 00:00:00       1600        300
        20 RESEARCH             7521 WARD       SALESMAN        7698 22-FEB-1981 00:00:00       1250        500
        20 RESEARCH             7566 JONES      MANAGER         7839 02-APR-1981 00:00:00       2975
        20 RESEARCH             7654 MARTIN     SALESMAN        7698 28-SEP-1981 00:00:00       1250       1400
        20 RESEARCH             7698 BLAKE      MANAGER         7839 01-MAY-1981 00:00:00       2850
        20 RESEARCH             7782 CLARK      MANAGER         7839 09-JUN-1981 00:00:00       2450
        20 RESEARCH             7788 SCOTT      ANALYST         7566 09-DEC-1982 00:00:00       3000
        20 RESEARCH             7839 KING       PRESIDENT            17-NOV-1981 00:00:00       5000
        20 RESEARCH             7844 TURNER     SALESMAN        7698 08-SEP-1981 00:00:00       1500          0
        20 RESEARCH             7876 ADAMS      CLERK           7788 12-JAN-1983 00:00:00       1100
        20 RESEARCH             7900 JAMES      CLERK           7698 03-DEC-1981 00:00:00        950
        20 RESEARCH             7902 FORD       ANALYST         7566 03-DEC-1981 00:00:00       3000
        20 RESEARCH             7934 MILLER     CLERK           7782 23-JAN-1982 00:00:00       1300
        30 SALES                7369 SMITH      CLERK           7902 17-DEC-1980 00:00:00        800
        30 SALES                7499 ALLEN      SALESMAN        7698 20-FEB-1981 00:00:00       1600        300
        30 SALES                7521 WARD       SALESMAN        7698 22-FEB-1981 00:00:00       1250        500
        30 SALES                7566 JONES      MANAGER         7839 02-APR-1981 00:00:00       2975
        30 SALES                7654 MARTIN     SALESMAN        7698 28-SEP-1981 00:00:00       1250       1400
        30 SALES                7698 BLAKE      MANAGER         7839 01-MAY-1981 00:00:00       2850
        30 SALES                7782 CLARK      MANAGER         7839 09-JUN-1981 00:00:00       2450
        30 SALES                7788 SCOTT      ANALYST         7566 09-DEC-1982 00:00:00       3000
        30 SALES                7839 KING       PRESIDENT            17-NOV-1981 00:00:00       5000
        30 SALES                7844 TURNER     SALESMAN        7698 08-SEP-1981 00:00:00       1500          0
        30 SALES                7876 ADAMS      CLERK           7788 12-JAN-1983 00:00:00       1100
        30 SALES                7900 JAMES      CLERK           7698 03-DEC-1981 00:00:00        950
        30 SALES                7902 FORD       ANALYST         7566 03-DEC-1981 00:00:00       3000
        30 SALES                7934 MILLER     CLERK           7782 23-JAN-1982 00:00:00       1300
        40 OPERATIONS           7369 SMITH      CLERK           7902 17-DEC-1980 00:00:00        800
        40 OPERATIONS           7499 ALLEN      SALESMAN        7698 20-FEB-1981 00:00:00       1600        300
        40 OPERATIONS           7521 WARD       SALESMAN        7698 22-FEB-1981 00:00:00       1250        500
        40 OPERATIONS           7566 JONES      MANAGER         7839 02-APR-1981 00:00:00       2975
        40 OPERATIONS           7654 MARTIN     SALESMAN        7698 28-SEP-1981 00:00:00       1250       1400
        40 OPERATIONS           7698 BLAKE      MANAGER         7839 01-MAY-1981 00:00:00       2850
        40 OPERATIONS           7782 CLARK      MANAGER         7839 09-JUN-1981 00:00:00       2450
        40 OPERATIONS           7788 SCOTT      ANALYST         7566 09-DEC-1982 00:00:00       3000
        40 OPERATIONS           7839 KING       PRESIDENT            17-NOV-1981 00:00:00       5000
        40 OPERATIONS           7844 TURNER     SALESMAN        7698 08-SEP-1981 00:00:00       1500          0
        40 OPERATIONS           7876 ADAMS      CLERK           7788 12-JAN-1983 00:00:00       1100
        40 OPERATIONS           7900 JAMES      CLERK           7698 03-DEC-1981 00:00:00        950
        40 OPERATIONS           7902 FORD       ANALYST         7566 03-DEC-1981 00:00:00       3000
        40 OPERATIONS           7934 MILLER     CLERK           7782 23-JAN-1982 00:00:00       1300
56 rows selected.
SQL>
SQL> drop table emp cascade constraints;
Table dropped.
SQL> drop table dept cascade constraints;
Table dropped.
SQL> drop table dept_and_emp;
Table dropped.
SQL> drop type emp_tab_type;
Type dropped.
SQL> drop type emp_type;
Type dropped.
SQL> --



Use type member function in select statement

 
SQL>
SQL>
SQL> create or replace
  2  type person as object (
  3   first_name varchar2(100),
  4   last_name varchar2(100),
  5   dob date,
  6   phone varchar2(100),
  7   member function get_last_name return varchar2,
  8   member function get_phone_number return varchar2 )
  9  not final
 10  /
Type created.
SQL>
SQL>
SQL> create or replace
  2  type body person as
  3    member function get_last_name return varchar2 is
  4    begin
  5      return self.last_name;
  6    end;
  7    member function get_phone_number return varchar2 is
  8    begin
  9      return self.phone;
 10    end;
 11  end;
 12  /
Type body created.
SQL>
SQL> create table person_table( p person );
Table created.
SQL>
SQL>
SQL>
SQL> create or replace
  2  type new_employee under person (
  3    empno number,
  4    hiredate date,
  5    work_phone varchar2(100),
  6    overriding member function get_phone_number return varchar2,
  7    member function get_home_phone_number return varchar2 )
  8  not final
  9  /
Type created.
SQL>
SQL> create or replace
  2  type body new_employee as
  3    overriding member function get_phone_number return varchar2 is
  4    begin
  5      return self.work_phone;
  6    end;
  7    member function get_home_phone_number return varchar2 is
  8    begin
  9      return self.phone;
 10    end;
 11  end;
 12  /
Type body created.
SQL>
SQL>
SQL>  select x.p.get_last_name() last_name,
  2           x.p.phone phone,
  3           treat( x.p as new_employee ).work_phone work_phone,
  4           x.p.get_phone_number() "GET_PHONE_NUMBER()",
  5           treat( x.p as new_employee ).get_phone_number() treat_as_new_employee
  6      from person_table x
  7    /
no rows selected
SQL>
SQL> drop table person_table;
Table dropped.
SQL>
SQL> drop type new_employee;
Type dropped.
SQL>
SQL> drop type person;
Type dropped.
SQL>