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

标签 oracle collections user-defined-types

在 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/

    相关文章:

    sql - Oracle SQL - 将 select count(*) 转换为零或一

    oracle - Oracle 11g 中的版本$

    oracle - 如何在 Oracle PLSQL 中提交单个事务

    c# - 以键和值作为类类型并使用键和索引访问值的数据结构

    sql-server - 将 SQL Server CLR UDT 编写为 `struct` 或 `class` 的相对优点是什么?

    来自 URL 的正则表达式子字符串

    C# - 将集合与自身进行比较以查找重复项的最快方法

    c# - 编写代码以遍历数组所有元素的最快方法

    c++ - 用户定义类型的 std::map 在检索值时使程序崩溃

    sql-server - SQL Server : UDT versus UDDT?