您的位置:首页 > 数据库 > Oracle

【转】 oracle cast multiset table 语法演示

2016-01-16 22:32 501 查看
来自: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()可以把一个集合强制转换成一个表,而且会自然的为我们完成连接,这里不需要连接条件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: