赋料扬雄敌,诗看子建亲。这篇文章主要讲述PL/SQL集合(table)嵌套表操作实例讲解实例相关的知识,希望能为你提供帮助。
集合是一个有序组具有相同的数据类型的元素。每个元素进行标识的唯一标表示其在集合中的位置。
PL/SQL提供了三种集合类型:索引表或关联数组、嵌套表、可变大小的数组或变长数组
Oracle文档提供了每种类型的集合的以下特征:
集合类型 | 元素数量 | 下标类型 | 密集或稀疏 | 在哪里创建 | 可以是对象类型属性 |
关联数组(或索引表) | 无界 | 字符串或整数 | 两种都可以 | 只有在PL/SQL块 | No |
嵌套表 | 无界 | 整数 | 开始密集,可以变得稀疏 | 无论是在PL/SQL块或模式级别 | Yes |
可变大小的数组(变长数组) | 有界 | 整数 | 总是密集 | 无论是在PL/SQL块或模式级别 | Yes |
嵌套表
嵌套表是就像一个一维数组的元素的数量。然而,嵌套表不同于在以下几方面的数组:
- 数组具有元素的声明的数量,但嵌套表不用声明大小。嵌套表的大小可以动态地增加。
- 数组总是密集的,也就是说,它总是有连续的下标。嵌套数组初始是致密,但是删除它的元素时就会变成稀疏。
TYPE type_name IS TABLE OF element_type [NOT NULL];
table_name type_name;
这个声明是类似声明的索引表中,但没有INDEX BY子句。嵌套表可以被存储在数据库中的列,所以它可用于简化在那里加入一个较大的表中的单个列,使用SQL操作。关联数组不能存储在数据库中。嵌套表的元素也可以是任何数据库表字段%TYPE和任何数据库表或%ROWTYPE。
集合方法
PL/SQL提供,使集合更容易使用内置集合方法。下表列出了这些方法和用途:
S.N. | 方法名称及用途 |
1 | EXISTS(n) 返回TRUE,如果一个集合中的第n个元素的存在; 否则返回FALSE |
2 | COUNT 返回集合当前包含的元素数量 |
3 | LIMIT 检查集合的最大尺寸 |
4 | FIRST 返回在使用整数下标集合的第一个(最小的)索引号 |
5 | LAST 返回在使用整数下标集合的最后一个(最大的)索引号 |
6 | PRIOR(n) 返回集合中索引n前面的索引号 |
7 | NEXT(n) 返回索引n的下一个索引号 |
8 | EXTEND 追加1个空元素到集合 |
9 | EXTEND(n) 追加n个空元素到集合 |
10 | EXTEND(n,i) 追加的第i个元素的集合的n个拷贝 |
11 | 【PL/SQL集合(table)嵌套表操作实例讲解实例】TRIM 移除集合的末尾一个元素 |
12 | TRIM(n) 移除一个集合末尾的n个元素 |
13 | DELETE 移除一个集合中的所有元素,设置计数为0 |
14 | DELETE(n) 移除关联数组用数字键或嵌套表中的第n个元素。如果关联数组有一个字符串键,对应于该键的值的元素将被删除。如果n为空,DELETE(N)什么都不做 |
15 | DELETE(m,n) 移除关联数组或嵌套表范围m..n所有元素。如果m大于n或如果m大于或n是零,DELETE(M,N)什么也不做 |
集合异常 | 引发情况 |
COLLECTION_IS_NULL | 尝试在一个原子空(null)的集合操作 |
NO_DATA_FOUND | 下标指定被删除的元素,或关联数组的一个不存在的元素 |
SUBSCRIPT_BEYOND_COUNT | 下标超过了一个集合的元素数 |
SUBSCRIPT_OUTSIDE_LIMIT | 下标超出了允许的范围 |
VALUE_ERROR | 下标为空(null)或不可转换的键类型。如果该键被定义为PLS_INTEGER范围,下标是在该范围之外可能会出现这样的异常 |
嵌套表操作实例:
-- Created on 2018/4/2 by E.WANG
/*
集合是一个有序组具有相同的数据类型的元素。
每个元素进行标识的唯一标表示其在集合中的位置。
PL/SQL提供了三种集合类型:索引表或关联数组、嵌套表、可变大小的数组或变长数组。
嵌套表是就像一个一维数组的元素的数量。然而,嵌套表不同于在以下几方面的数组:
数组具有元素的声明的数量,但嵌套表不用声明大小。嵌套表的大小可以动态地增加。
数组总是密集的,也就是说,它总是有连续的下标。嵌套数组初始是致密,但是删除它的元素时就会变成稀疏。
使用以下语法创建一个嵌套表:
TYPE type_name IS TABLE OF element_type [NOT NULL];
table_name type_name;
这个声明是类似声明的索引表中,但没有INDEX BY子句。
*/
declare
--创建一个游标
cursor emp_cursor isselect ename from emp;
--创建一个嵌套表
type emp_table is table of emp.ename%type;
--声明并初始化表
empTable emp_table:=emp_table();
--用来保存key
keyValue integer:=0;
begin
--打开并获取游标数据
--数据获取完关闭游标
for tmp in emp_cursor loop
--是key值加一
keyValue:=keyValue+1;
--EXTEND:追加1个空元素到集合
empTable.extend;
--给索引表赋值
empTable(keyValue):=tmp.ename;
end loop;
--FIRST:返回在使用整数下标集合的第一个(最小的)索引号
keyValue := empTable.FIRST;
--当键不为空时进行下一个循环
WHILE keyValue IS NOT null LOOP
dbms_output.put_line
(Emp name:|| TO_CHAR(empTable(keyValue) ||The emp index:|| keyValue));
--返回索引keyValue的下一个索引号
keyValue := empTable.NEXT(keyValue);
END LOOP;
--LAST:返回在使用整数下标集合的最后一个(最大的)索引号
keyValue:= empTable.LAST;
end;
运行结果截图:
推荐阅读
- PL/SQL 用户自定义异常操作实例
- PL/SQL系统定义的异常操作实例讲解
- PL/SQL包(package)操作实例讲解
- PL/SQL字符串声明字符串函数和操作符实例源码说明
- 测试点先发散后收敛思考
- Jmeter操作oracle简单示例
- Dockerpyresttest的dockerfile调整,增加时区
- u-boot启动流程详解-基于iTop4412开发板
- ORACLE 12的ORA-01033问题操作过程