嵌套表(了解)
嵌套表:在一个表中还包含另外一个子表
例如:现在有如下一种情况,一个部门可能承接多个项目,如果此时,按照最原始的方法设计
要定义两张表:department表 project表
CREATE TABLE department(
deptno NUMBER(2) PRIMARY KEY ,
dname VARCHAR(20) NOT NULL
);
CREATE TABLE project(
proid NUMBER(4) PRIMARY KEY ,
proname VARCHAR2(50) NOT NULL,
prodate DATE NOT NULL,
deptno NUMBER(2),
CONSTRAINT department_project_deptno FOREIGN KEY(deptno)
ON DELETE CASCADE
);
以上的操作时最通用的操作,而且本身也是最正确的操作,但是在Oracle
中引入了嵌套表的概念,可以直接将项目表的类型作为一个department表的字段类型
达到嵌套的功能
但是,如果想完成一个嵌套表的制作,则首先要保证一点,因为数据库在创建的时候
都要指定字段的类型,所以嵌套表本身也需要同样指定类型,那么这种类型就
需要单独定义
CREATE TYPE project_ty AS OBJECT(
proid NUMBER(4) ,
proname VARCHAR2(50) ,
prodate DATE
);
/
类型创建成功之后,并不意味着此类型可以直接使用,因为此类型是一个完整过的
类型,所以就要为此类型指定一个名称
CREATE TYPE project_nt AS TABLE OF project_ty;/
以后直接使用project_ne表示project_ty类型,就类似于varchar2表示字符串是一样的
此时可以使用此类型创建department表
CREATE TABLE department(
deptno NUMBER(2) PRIMARY KEY ,
dname VARCHAR(20) NOT NULL,
projects project_nt
) NESTED TABLE projects STORE AS project_nt_tab_temp;
此时一个嵌套表就建好了
对于插入数据而言,需要制定每一个project_ty的类型
INSERT INTO department(deptno,dname,projects) VALUES(1,'技术部',
project_nt(project_ty(1001,'ERP',sysdate),
project_ty(1002,'CRM',sysdate),
project_ty(1003,'OA',sysdate)
));
此时,查询嵌套表,可以返回多个项目
SELECT * FROM department;
以一张内部表的形式显示出来了
此时我们想查询1部门的内部嵌套表的全部信息使用一下语句
SELECT * FROM TABLE (SELECT projects FROM department WHERE deptno=1);
范例:更新项目编号为1001的项目名称为“测试项目”;
UPDATE TABLE (SELECT projects FROM department WHERE deptno=1) pro
SET VALUE(pro)=project_ty('1001','测试项目',TO_DATE('1998-02-12','yyyy-mm-dd'))
WHERE pro.proid=1001; 显示更新一行
再查询嵌套表 可发现记录已经更新
SELECT * FROM TABLE (SELECT projects FROM department WHERE deptno=1);
Oracle之嵌套表(了解)
最新推荐文章于 2024-07-24 18:54:32 发布