【发布时间】:2015-06-29 13:03:29
【问题描述】:
我知道两者的基本区别和用途。但是,我正在寻找的答案是,为什么要引入 VARRAY ?
因为,我们可以使用 NESTED TABLE 做同样的事情,而使用 VARRAY 可以做同样的事情,反之亦然,在某些情况下是不可能的。另外,我注意到人们提到的一些地方 VARRAY 存储元素in-line。这是什么意思 ?谁能解释两者的内部存储和处理?
【问题讨论】:
标签: oracle plsql nested-table varray
我知道两者的基本区别和用途。但是,我正在寻找的答案是,为什么要引入 VARRAY ?
因为,我们可以使用 NESTED TABLE 做同样的事情,而使用 VARRAY 可以做同样的事情,反之亦然,在某些情况下是不可能的。另外,我注意到人们提到的一些地方 VARRAY 存储元素in-line。这是什么意思 ?谁能解释两者的内部存储和处理?
【问题讨论】:
标签: oracle plsql nested-table varray
总而言之,您将在以下情况下使用 可变大小数组 又名 VARRAY:
例如,VARRAY 声明为:
TYPE varray_emp IS VARRAY(14) OF emp%ROWTYPE;
emp_rec varray_emp;
所以,您会看到 UPPER BOUND 是固定的,在上面的示例中是 14。
有关详细信息,请参阅documentation。
更新关于在数据库中存储VARRAY
引用上述文档链接:
每个 varray 都存储为单个对象,或者在 它是一列(如果 varray 小于 4KB)或在 表但仍在同一个表空间中(如果 varray 大于 4KB)。您必须在 同时,这在执行某些操作时最合适 所有元素一次。但是您可能会发现存储不切实际 并以这种方式检索大量元素。
关于在线存储:
varray 通常存储在行中,即在同一个表空间中 作为其行中的其他数据。如果它足够大,Oracle 将其存储为 BLOB
【讨论】:
有两个主要的重要区别:
VARRAY 声明中需要最大元素数(限制)。 在嵌套的 TABLE 类型集合中无法进行限制。
可以在 VARRAY 中进行内联存储(嵌套的 TABLE 总是脱线)
如果集合类型被用作数据库中的普通表列类型:
离线-嵌套表数据存储在不同的数据库段中 比主表行。 对于嵌套表段类型是 NESTED TABLE。
内联 - 存储在主表行中的嵌套行。
用于 VARRAY CLOB。 数据库将在表列中存储少于 +-4000 字节数据的 LOB。 https://docs.oracle.com/cd/B28359_01/appdev.111/b28393/adlob_tables.htm#i1010742
【讨论】:
b/w 嵌套表和可变数组的区别:
将为其他嵌套表创建单独的表空间 比父表的表空间。 如果 varray 大小小于 4 KB,则将其存储在作为列的表内,否则,将存储在表外但在同一表空间中。
可以对嵌套表的单个元素执行更新、删除。
无法对 Varray 中的单个元素执行更新和删除。 有关更多说明,请通过下面的链接。 http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/05_colls.htm
【讨论】: