`

Oracle嵌套表及可变数组概述

阅读更多

  一、嵌套表

  所谓嵌套表,简单地说就是把一个表作为另一个表的字段。

  而众所周知,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;

 

  

 

 

分享到:
评论

相关推荐

    《oracle 11g 完全指导手册》实验用详尽表(sql)

    以上内容概述了Oracle 11g中的一些核心概念和技术,包括对象类型定义、嵌套表类型、变长数组类型、创建表及插入数据的基本语法等。这些知识点对于学习Oracle数据库管理和开发非常重要。通过这些示例,读者可以更好地...

    Oracle PLSQL集合

    关联数组是一种可变大小的集合,其索引可以是任意类型,通常是数字或字符串。关联数组非常适合存储无序的数据。 **定义关联数组** ```sql TYPE t_assoc IS TABLE OF NUMBER INDEX BY PLS_INTEGER; t_assoc_var t_...

    oracle 简明语法教程

    5. 集合类型:如VARRAY(固定大小数组)和NESTED TABLE(嵌套表)。 三、创建表 使用CREATE TABLE语句创建新表,指定字段名、数据类型和其他约束,例如: ```sql CREATE TABLE Employees ( ID NUMBER PRIMARY KEY,...

    关于oracle的PLSQL用户指南与参考

    - 嵌套表与变长数组 - **定义集合类型**: - 定义与PL/SQL集合类型等价的SQL类型 - **声明PL/SQL集合变量**: - 如何声明集合变量 - **初始化与引用集合**: - 初始化集合 - 引用集合中的元素 - **集合的赋值**: ...

    12c 的新 PLSQL 功能

    在 12c 版本之前,如果想要从集合中选择数据,则必须在模式级别定义类型,并且只能是嵌套表或可变数组。但在 12c 中,可以将类型定义在程序包规范中,且可以是 index-by 表类型。此外,负载也可以是记录类型,但记录...

    pl/sql学习

    嵌套表是一种可变长度的数组,可以存储任意数量的元素,以连续的数字作为下标索引。与Index_by表相比,嵌套表支持DML操作,因此可以方便地进行插入、更新和删除等操作。 **语法** 嵌套表的定义语法如下: ```sql ...

    oracle数据库技术文档

    - **类型**: Oracle 支持两种集合类型: VARRAY (变长数组) 和 NESTED TABLE (嵌套表)。 - **用途**: 用于存储一组相同类型的元素。 #### 三、单行函数和组函数 **3.1 单行函数** - **定义**: 每次只能处理一行...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其三、职业方向多:Oracle数据库管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等方向。 四、 如何学习 认真听课、多思考问题、多动手操作、有问题一定要问、多参与讨论、多帮组同学 五、 体系结构 ...

    PL/SQL存储过程编程

    - RECORD(记录类型,常用)、TABLE(表格类型,常用)、VARRAY(变长数组,较少用)。 - **引用类型**: - REFCURSOR(游标)、REF object_type。 - **LOB (Large Object)**: 大对象类型,用于存储大量数据,如...

    疯狂JAVA讲义

    5.2.3 形参长度可变的方法 120 5.2.4 递归方法 121 5.2.5 方法重载 123 学生提问:为什么方法的返回值类型不能用于区分重载的方法? 124 5.3 成员变量和局部变量 124 5.3.1 成员变量和局部变量 125 5.3.2 成员...

    java初级知识

    `final`关键字用于声明不可变的变量、不可重写的类和方法。 **9. 抽象类** 抽象类不能被实例化,它主要用于提供一个包含抽象方法和具体方法的模板。 **10. 抽象类的体现-模板模式** 模板模式允许子类扩展抽象类的...

    javaSE代码实例

    17.1.5 可变尺寸线程池的使用 378 17.1.6 延迟线程池的使用 380 17.1.7 使用自定义参数的线程池 381 17.2 有返回值的线程调用 384 17.2.1 Callable接口简介 384 17.2.2 Future接口简介 384 17.2.3 ...

    Java机试相关题目34题

    本题提到了在ORACLE数据库中常用的两种分页方法,分别是通过截取ID方法和三层嵌套方法实现。 14. 计算效率问题:对于2乘以8这类简单数学运算,直接计算即可得出结果。题目可能是考察学生对简单问题的思考方式。 15...

    Java基础整理

    - **StringBuilder类**:可变字符串类,非线程安全,性能优于`StringBuffer`。 - **基本数据类型包装类**:如`Integer`、`Double`等,用于将基本数据类型包装成对象形式。 - **BigInteger和BigDecimal**:用于处理...

    Java开发规范(编程风格)

    - 尽量使用final修饰符声明不可变的常量。 - 合理使用访问控制符,保护内部数据的安全。 **5.2 包** - 每个项目或模块应有自己的包结构。 **5.3 类、接口** - 类和接口声明应该清晰地表明它们的作用和用途。 **...

    MongoDB_Architecture_Guide 3.2

    - **文档模型**:MongoDB 使用文档模型来存储数据,每个文档可以包含复杂的嵌套结构,这使得存储和查询复杂数据变得更加简单。 - **动态模式**:MongoDB 支持动态模式,允许开发者在不修改数据库结构的情况下,灵活...

    Java 基础核心总结.md

    - **final**:用于指定不可变的实体。 - **接口和抽象类** - **接口**:定义了一组行为规范。 - **抽象类**:不能被实例化,但可以包含具体方法和抽象方法。 #### 异常 异常处理是Java中非常重要的一个概念。 -...

Global site tag (gtag.js) - Google Analytics