设为首页 收藏本站
查看: 917|回复: 0

[经验分享] Oracle嵌套表及可变数组概述

[复制链接]

尚未签到

发表于 2016-7-31 07:44:42 | 显示全部楼层 |阅读模式
  一、嵌套表
  所谓嵌套表,简单地说就是把一个表作为另一个表的字段。
  而众所周知,Oracle在创建表时需要指定每个字段的类型,故要使用嵌套表,首先要把被嵌套的表定义为一种类型。
  而需要被定义的类型有两种,简单来看,一种是被嵌套的表的每一行记录的类型,另一种是被嵌套的表本身。
  下面举例说明,以下是一个年级-班级的例子,一个年级下有多个班级。
  定义记录类型的方式如下:
  
 

create type class_type as object(
id number,
class_name varchar2(32)
);
  定义表类型的方式如下:
  
  

create type class_name as table of class_type;
  创建嵌套表:
  
  

create table grade (
id number,
grade_name varchar2(32),
classes class_name
) nested table classes store as ts_classes;
  
  注意以上SQL的结尾部分,与普通表创建不同的是,需要指定“嵌套表的列的存储表”,上例为ts_classes,即将被嵌套的class_name类型的“列表”存储在了名为ts_classes的表中。该SQL执行后,除了创建grade表外,还会创建一个名为ts_classes的表——它是一个存储表——与普通表不同,这种表不能直接select查询,否则会抛出异常"ORA-22812: 无法参考嵌套表列的存储表"。
  并且,创建嵌套表的同时,会自动在嵌套的列上加上一个unique index。如classes列上会有一个唯一索引。
  
  对嵌套表进行各种基本操作的方式如下:
  

insert into grade values(1,
'一年级',
class_name(
class_type(1, '1班'),
class_type(2, '2班'),
class_type(3, '3班')
)
);
update table (select classes from grade where id = 1) t
set value(t) = class_type(3, '4班') where t.id = 3;
delete from table (select classes from grade where id = 1) t
where t.id = 3;

  二、可变数组
  可变数组的使用跟嵌套表很相似,也需要类型定义。
  下面以工厂-工人为示例。

create type worker_type as object (
id number,
name varchar2(32)
);
create type worker_list as varray(20) of worker_type;
create table factory (
id number,
name varchar2(32),
workers worker_list
);
insert into factory values(1,
'工厂1 ',
worker_list(
worker_type(1, '张三'),
worker_type(2, '李四'),
worker_type(3, '王五')
)
);

  可见,与嵌套表不同的有如下几点:
  1. 把定义表类型的语句替换成了定义数组的语句;
  2. 不需要指定数组列的存储位置;
  3. 数组列不会自动添加唯一索引。
  
  附:
  嵌套表和可变数组的表在select查询时,在PL/SQL中,嵌套表列或数组列会以Collection列的形式显示并不展示其内容,可点击查看内容;不能以编辑形式查询(笔者用的PL/SQL9.0)。
  但可以如下查询将其内容一并展示:

select t.id, t.grade_name, c.* from grade t , table(t.classes) c;
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-251450-1-1.html 上篇帖子: Oracle,SQl,MySql实现分页查询 下篇帖子: Oracle高级查询之GROUP BY
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表