NESTED TABLE和VARRAY之间的区别

时间:2015-04-22 04:48:09

标签: oracle plsql nested-table varray

我知道两者的基本区别和用法。但是,我正在寻找的答案是,为什么要引入VARRAY?

因为,我们可以使用NESTED TABLE做同样的事情,使用VARRAY可以做什么,而在某些情况下反之亦然。另外,我注意到有些人提到VARRAY商店元素内嵌。这是什么意思 ?任何人都可以解释两者的内部存储和处理吗?

3 个答案:

答案 0 :(得分:2)

有两个主要的重要区别:

  1. VARRAY声明中需要最大元素数(限制)。 嵌套的TABLE类型集合中无法限制。

  2. VARRAY中可能的内联存储(嵌套的TABLE总是不在线)

    如果集合类型在数据库中用作普通表列类型:

    离线 - 嵌套表数据存储在不同的数据库段中               比主表行。               对于嵌套表段,类型为NESTED TABLE。

    内联 - 存储在主表行内的嵌套行。

    使用VARRAY CLOB。 数据库将在表列中存储少于+ -4000字节数据的LOB。 https://docs.oracle.com/cd/B28359_01/appdev.111/b28393/adlob_tables.htm#i1010742

答案 1 :(得分:1)

总结一下,您可以在以下情况下使用可变尺寸数组 a.k.a 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的所有元素   同时,这对于执行某些操作最合适   所有的元素一下子。但是你可能会发现存储它是不切实际的   并以这种方式检索大量元素。

关于在行存储:

  

varray通常存储在行中,即存储在同一个表空间中   作为其行中的其他数据。如果它足够大,Oracle   将其存储为BLOB

详细了解Storage Considerations for Varrays

答案 2 :(得分:-1)

差异b / w嵌套表和varray:

  

将为嵌套表创建单独的表空间,这是另一个   比父表的表空间。   如果一个varray大小小于4 KB,它将存储在一个列的表中,否则它将存储在表外但在同一个表空间中。
  可以对嵌套表的各个元素执行更新,删除   无法对Varray中的各个元素执行更新和删除操作。    有关更多说明,请查看以下链接。   http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/05_colls.htm