SQL

在Oracle中使用不同类型的PL / SQL集合的目的

发布于 2021-04-20 22:35:02

在oracle中使用集合的主要目的是什么?

  1. Index by tables

  2. Nested tables

  3. Variable size ARRAY

能否请您解释以上两种类型的收藏之间的区别?

关注者
0
被浏览
103
1 个回答
  • 面试哥
    面试哥 2021-04-20
    为面试而生,有面试问题,就找面试哥。

    让我们从嵌套表开始,它们是最常见的集合形式,因此代表了比较的有用基础。

    嵌套表是一个变量,它可以容纳多个实例,通常是数据库表中的一条记录。可以这样声明它们:

    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记录或用户定义类型的组合。

    最好将“索引依据”表称为“关联数组”(就像文档一样)。这些是带有索引的单个属性的简单集合。嵌套表也有索引,但是它们的索引只是行数。对于关联数组,索引可以是有意义的,即从数据值中获取。因此,它们对于缓存数据值以供以后使用很有用。索引可以是数字,也可以是(自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。

    没有变量数组的已知用例。好的,这有点苛刻,但是几乎所有时候您都将使用嵌套表。与嵌套表相比,VArray的一大优势在于它们可以保证元素的顺序。因此,如果必须按插入元素的顺序取出元素,请使用VArray。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看