oracle cast multiset table 语法演示

    xiaoxiao2024-04-19  2

    转载自: http://blog.csdn.net/viszl/article/details/6543158

    处理数据库关系对象组件时会用到这个奇怪的语法,下面参照<oracle 编程艺术>中的例子结合嵌套表解释这个语法

    首先建立嵌套表

     

    create or replace type emp_type

    as object

    (empno       number(4),

     ename       varchar2(10),

     job         varchar2(9),

     mgr         number(4),

     hiredate    date,

     sal         number(7, 2),

     comm        number(7, 2)

    );

     

    /

    create or replace type emp_tab_type

    as table of emp_type

    /

    create table dept_and_emp

    (deptno number(2) primary key,

     dname     varchar2(14),

     loc       varchar2(13),

     emps      emp_tab_type

    )

    nested table emps store as emps_nt;

    alter table emps_nt add constraint

    emps_empno_unique unique(empno)

    /

     

    alter table emps_nt add constraint mgr_fk

    foreign key(mgr) references emps_nt(empno);

     

     

    接下来用emp和dept(scott用户下的表)来填充这个dept_and_emp表(其中emps为嵌套表)

     

     

     

    insert into dept_and_emp

    select dept.*,

       CAST( multiset( select empno, ename, job, mgr, hiredate, sal, comm

                         from SCOTT.EMP

                         where emp.deptno = dept.deptno ) AS emp_tab_type )

      from SCOTT.DEPT

    /

    现在可以通过这条语句来理解CAST和MULTISET这个语法

    MULTISET关键字用于告诉ORACLE:这个子查询返回的是多行(select列表中的子查询不加multiset限制为返回一行)。

    CAST关键字用于指示ORACLE要把返回的结果集处理为一个集合,在这里我们将MULTISET强制转换(CAST)为一个EMP_TAB_TYPE。

    CAST是一个通用的例程,并不仅限于在集合中使用。例如,如果想从EMP中将EMPNO列获取为VARCHAR2(20)而不是NUMBER(4),可以使用下面的查询:SELECT CAST(EMPNO AS VARCHAR2(20)) E FROM EMP。

    现在可以查询这个dept_and_emp表了,看下结果

     

    select deptno, dname, loc, d.emps AS employees

    from dept_and_emp d

    where deptno = 10

    /

     

     

     

        DEPTNO DNAME          LOC

    ---------- -------------- -------------

    EMPLOYEES(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM)

    ----------------------------------------------------------------------------------------------------

            10 ACCOUNTING     NEW YORK

    EMP_TAB_TYPE(EMP_TYPE(7782, 'CLARK', 'MANAGER', 7839, '09-6月 -81', 2450, NULL), EMP_TYPE(7839, 'KIN

    G', 'PRESIDENT', NULL, '17-11月-81', 5000, NULL), EMP_TYPE(7934, 'MILLER', 'CLERK', 7782, '23-1月 -8

    2', 1300, NULL))

    所有的数据都放在一个列里,大多数的应用都不能处理这个特殊的列,除非是专门针对对象关系特性编写的,因此oracle提供了一个方法,可以取消集合的嵌套,把它当做是一个关系表来处理: select d.deptno, d.dname, emp.* from dept_and_emp D, table(d.emps) emp /     DEPTNO DNAME               EMPNO ENAME      JOB              MGR HIREDATE              SAL ---------- -------------- ---------- ---------- --------- ---------- -------------- ----------       COMM ----------         10 ACCOUNTING           7782 CLARK      MANAGER         7839 09-6月 -81           2450         10 ACCOUNTING           7839 KING       PRESIDENT            17-11月-81           5000         10 ACCOUNTING           7934 MILLER     CLERK           7782 23-1月 -82           1300         20 RESEARCH             7369 SMITH      CLERK           7902 17-12月-80            800         20 RESEARCH             7566 JONES      MANAGER         7839 02-4月 -81           2975         20 RESEARCH             7788 SCOTT      ANALYST         7566 19-4月 -87           3000         20 RESEARCH             7876 ADAMS      CLERK           7788 23-5月 -87           1100         20 RESEARCH             7902 FORD       ANALYST         7566 03-12月-81           3000         30 SALES                7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30 SALES                7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30 SALES                7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30 SALES                7698 BLAKE      MANAGER         7839 01-5月 -81           2850         30 SALES                7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30 SALES                7900 JAMES      CLERK           7698 03-12月-81            950 已选择14行。

     

    table()可以把一个集合强制转换成一个表,而且会自然的为我们完成连接,这里不需要连接条件。

    转载请注明原文地址: https://ju.6miu.com/read-1288155.html
    最新回复(0)