一、嵌套表
所谓嵌套表,简单地说就是把一个表作为另一个表的字段。
而众所周知,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中的一些核心概念和技术,包括对象类型定义、嵌套表类型、变长数组类型、创建表及插入数据的基本语法等。这些知识点对于学习Oracle数据库管理和开发非常重要。通过这些示例,读者可以更好地...
关联数组是一种可变大小的集合,其索引可以是任意类型,通常是数字或字符串。关联数组非常适合存储无序的数据。 **定义关联数组** ```sql TYPE t_assoc IS TABLE OF NUMBER INDEX BY PLS_INTEGER; t_assoc_var t_...
5. 集合类型:如VARRAY(固定大小数组)和NESTED TABLE(嵌套表)。 三、创建表 使用CREATE TABLE语句创建新表,指定字段名、数据类型和其他约束,例如: ```sql CREATE TABLE Employees ( ID NUMBER PRIMARY KEY,...
- 嵌套表与变长数组 - **定义集合类型**: - 定义与PL/SQL集合类型等价的SQL类型 - **声明PL/SQL集合变量**: - 如何声明集合变量 - **初始化与引用集合**: - 初始化集合 - 引用集合中的元素 - **集合的赋值**: ...
在 12c 版本之前,如果想要从集合中选择数据,则必须在模式级别定义类型,并且只能是嵌套表或可变数组。但在 12c 中,可以将类型定义在程序包规范中,且可以是 index-by 表类型。此外,负载也可以是记录类型,但记录...
嵌套表是一种可变长度的数组,可以存储任意数量的元素,以连续的数字作为下标索引。与Index_by表相比,嵌套表支持DML操作,因此可以方便地进行插入、更新和删除等操作。 **语法** 嵌套表的定义语法如下: ```sql ...
- **类型**: Oracle 支持两种集合类型: VARRAY (变长数组) 和 NESTED TABLE (嵌套表)。 - **用途**: 用于存储一组相同类型的元素。 #### 三、单行函数和组函数 **3.1 单行函数** - **定义**: 每次只能处理一行...
其三、职业方向多:Oracle数据库管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等方向。 四、 如何学习 认真听课、多思考问题、多动手操作、有问题一定要问、多参与讨论、多帮组同学 五、 体系结构 ...
- RECORD(记录类型,常用)、TABLE(表格类型,常用)、VARRAY(变长数组,较少用)。 - **引用类型**: - REFCURSOR(游标)、REF object_type。 - **LOB (Large Object)**: 大对象类型,用于存储大量数据,如...
5.2.3 形参长度可变的方法 120 5.2.4 递归方法 121 5.2.5 方法重载 123 学生提问:为什么方法的返回值类型不能用于区分重载的方法? 124 5.3 成员变量和局部变量 124 5.3.1 成员变量和局部变量 125 5.3.2 成员...
`final`关键字用于声明不可变的变量、不可重写的类和方法。 **9. 抽象类** 抽象类不能被实例化,它主要用于提供一个包含抽象方法和具体方法的模板。 **10. 抽象类的体现-模板模式** 模板模式允许子类扩展抽象类的...
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 ...
本题提到了在ORACLE数据库中常用的两种分页方法,分别是通过截取ID方法和三层嵌套方法实现。 14. 计算效率问题:对于2乘以8这类简单数学运算,直接计算即可得出结果。题目可能是考察学生对简单问题的思考方式。 15...
- **StringBuilder类**:可变字符串类,非线程安全,性能优于`StringBuffer`。 - **基本数据类型包装类**:如`Integer`、`Double`等,用于将基本数据类型包装成对象形式。 - **BigInteger和BigDecimal**:用于处理...
- 尽量使用final修饰符声明不可变的常量。 - 合理使用访问控制符,保护内部数据的安全。 **5.2 包** - 每个项目或模块应有自己的包结构。 **5.3 类、接口** - 类和接口声明应该清晰地表明它们的作用和用途。 **...
- **文档模型**:MongoDB 使用文档模型来存储数据,每个文档可以包含复杂的嵌套结构,这使得存储和查询复杂数据变得更加简单。 - **动态模式**:MongoDB 支持动态模式,允许开发者在不修改数据库结构的情况下,灵活...
- **final**:用于指定不可变的实体。 - **接口和抽象类** - **接口**:定义了一组行为规范。 - **抽象类**:不能被实例化,但可以包含具体方法和抽象方法。 #### 异常 异常处理是Java中非常重要的一个概念。 -...