我知道两者的基本区别和用途。但是,我正在寻找的答案是,为什么要引入 VARRAY ?
因为,我们可以使用 NESTED TABLE 做同样的事情,这可以使用 VARRAY 完成,反之亦然,在某些情况下是不可能的。另外,我注意到人们提到的一些地方 VARRAY 存储元素in-line。这是什么意思 ?谁能解释两者的内部存储和处理?
我知道两者的基本区别和用途。但是,我正在寻找的答案是,为什么要引入 VARRAY ?
因为,我们可以使用 NESTED TABLE 做同样的事情,这可以使用 VARRAY 完成,反之亦然,在某些情况下是不可能的。另外,我注意到人们提到的一些地方 VARRAY 存储元素in-line。这是什么意思 ?谁能解释两者的内部存储和处理?
总而言之,您将在以下情况下使用可变大小数组(又名VARRAY ) :
例如,VARRAY 声明为:
TYPE varray_emp IS VARRAY(14) OF emp%ROWTYPE;
emp_rec varray_emp;
所以,你看到UPPER BOUND 是固定的,在上面的例子中是 14。
有关更多详细信息,请参阅文档。
关于在数据库中存储 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
黑白嵌套表和可变数组的区别:
将为嵌套表创建单独的表空间,而不是父表的表空间。如果 varray 大小小于 4 KB,则将其存储在作为列的表内,否则存储在表外但在同一表空间中。
可以对嵌套表的单个元素执行更新、删除。
无法对 Varray 中的单个元素执行更新和删除。有关更多说明,请通过下面的链接。 http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/05_colls.htm