Oracle PL/SQL/Object Oriented Database/Select

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

demonstrates SQL operations on object types.

   <source lang="sql">

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>

</source>
   
  


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

   <source lang="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> 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>

      </source>
   
  


Query data from table based on object

   <source lang="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 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>

      </source>
   
  


Query object table

   <source lang="sql">

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>

</source>
   
  


SELECTing Individual Columns in TCROs

   <source lang="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 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>

      </source>
   
  


SELECT Only One Column in the Composite

   <source lang="sql">

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>

      </source>
   
  


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

   <source lang="sql">

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.

</source>
   
  


SELECT with a WHERE Clause

   <source lang="sql">

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>

      </source>
   
  


Use %ROWTYPE to select from the relational table.

   <source lang="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 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>

</source>
   
  


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

   <source lang="sql">

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>

      </source>
   
  


Use * to reference column with user-defined type

   <source lang="sql">

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> --

</source>
   
  


Use type member function in select statement

   <source lang="sql">

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>

</source>