oracle cast multiset table 语法演示
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()可以把一個集合強制轉換成一個表,而且會自然的為我們完成連接,這里不需要連接條件。
?
總結
以上是生活随笔為你收集整理的oracle cast multiset table 语法演示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用程序连接Oracle rac的URL
- 下一篇: 如何在JAVA程序中使用Struct一次