在 oracle 中使用集合的主要目的是什么?
你能解释一下上述类型的集合之间的区别吗?
最佳答案
让我们从嵌套表开始,它们是最常见的集合形式,因此代表了一个有用的比较基础。
嵌套表是一个变量,它可以保存多个事物的实例,通常是数据库表中的一条记录。他们可以这样声明:
type emp_nt is table of emp%rowtype;
emp_rec_nt emp_nt;
每当我们想要存储多个数据实例时,它们都非常有用,我们想要针对这些实例做同样的事情。经典示例是使用 BULK COLLECT 存储多条记录:
select *
bulk collect into emp_rec_nt
from employees;
这为我们提供了一个可以循环的数据源;至关重要的是,我们可以向后和向前导航,甚至可以跳到结尾或开头,这是我们不能用光标做的事情。嵌套表可以是任何数据类型的集合,包括诸如 PL/SQL 记录或用户定义类型的组合。
Index By 表更好地称为(如文档所做的那样)一个 Associative Array 。这些是带有索引的单个属性的简单集合。嵌套表也有索引,但它们的索引只是行数。对于关联数组,索引可以是有意义的,即源自数据值。因此它们可用于缓存数据值以备后用。索引可以是一个数字,或者(从 9iR2 开始)一个非常有用的字符串。例如,这是一个由员工标识符索引的工资关联数组。
type emp_sal_aa is table of emp.sql%type
index by emp.empno%type;
l_emp_sales emp_sal_aa;
请注意,我可以使用 INDEX BY BINARY_INTEGER 声明该数组,但使用 %TYPE 语法(自记录代码)更清楚。该数组的元素可以由索引值标识,在本例中为 EMPNO:
l_emp_sals(l_emp_no) := l_emp_sal;
除了缓存引用表或类似的查找值之外,关联数组的用例并不多。
变量数组只是对元素数量有预定义限制的嵌套表。所以这个名字可能有误导性:它们实际上是固定数组。我们对 VArray 几乎无能为力,而我们对嵌套表却无能为力(除了限制元素的数量,而且我们很少想这样做)。它们是这样声明的:
type emp_va is varray(14) of emp%rowtype;
emp_rec_va emp_va;
我们可以使用批量收集来填充 VArray ...
select *
bulk collect into emp_rec_va
from employees;
但是,我们必须确定查询最多返回 VArray 声明中指定的元素数量。否则 SELECT 将抛出 ORA-22165。
变量数组没有已知的用例。好吧,这有点苛刻,但几乎所有时间您都将使用嵌套表。 VArrays 相对于嵌套表的一大优势是它们保证了元素的顺序。因此,如果您必须以与插入元素相同的顺序取出元素,请使用 VArray。
PL/SQL 文档用了一整章来介绍集合。 Find out more .
关于oracle - 在 Oracle 中使用不同类型的 PL/SQL 集合的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14934514/