Oracle之嵌套表(了解)

嵌套表(了解)
   嵌套表:在一个表中还包含另外一个子表
   例如:现在有如下一种情况,一个部门可能承接多个项目,如果此时,按照最原始的方法设计
   要定义两张表: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); 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值