TABLE 函数返回的行的顺序是不是保证与 VARRAY 元素的存储顺序相同?
Posted
技术标签:
【中文标题】TABLE 函数返回的行的顺序是不是保证与 VARRAY 元素的存储顺序相同?【英文标题】:Is the order of the rows returned by the TABLE function guaranteed to be identical to the order in which the elements of the VARRAY are stored?TABLE 函数返回的行的顺序是否保证与 VARRAY 元素的存储顺序相同? 【发布时间】:2018-02-18 16:46:45 【问题描述】:我正在使用以下类型的绑定变量执行删除语句:
CREATE OR REPLACE TYPE "VAR_ARR" AS
VARRAY ( 5000 ) OF VARCHAR2(20)
delete 语句如下所示:
DELETE FROM ins_test
WHERE
( id,
name ) IN (
SELECT
t1.id,
t2.name
FROM
(
SELECT
column_value id,
ROWNUM r
FROM
TABLE (:1 )
) t1
FULL JOIN (
SELECT
column_value name,
ROWNUM r
FROM
TABLE (:2 )
) t2 ON t1.r = t2.r
)
该语句依赖TABLE
函数以与存储在VARRAY
中相同的顺序返回元素。 TABLE 函数返回的行的顺序是否保证与 VARRAY 元素的存储顺序相同?
它已经在例如How do I get the index of VARRAY items after converting to a table,但我找不到任何确凿的信息。
【问题讨论】:
这有什么关系?在 DELETE 的情况下,此顺序无关紧要。数据库会按照数据库方便的顺序删除记录,不适合你,比如表有没有分区,这个列有没有索引,用什么方法对表的访问将由优化器(全表扫描、索引扫描、哈希连接、排序连接等)和许多其他我们完全没有影响的标准来选择。 @krokodilko 这很重要,因为 where 子句必须正确;第一个 id 必须与名字结合,第二个 id 必须与第二个名字结合,依此类推。当然,我不在乎删除行的顺序。 【参考方案1】:是的,对于 VARRAY,请参阅 Varrays (Variable-Size Arrays)
当您从数据库中存储和检索 varray 时,它的索引和元素顺序保持稳定。
请注意,Nested Tables 的情况正好相反:
当您在数据库中存储和检索嵌套表时,嵌套表的索引和行顺序可能不会保持稳定。
【讨论】:
感谢您的贡献!您确定检索包含 TABLE 函数吗?不仅是逐个元素的程序检索吗? 我假设每当您使用select ... from ...
时,除非您指定ORDER BY
子句,否则永远不会确定顺序。
是的,我倾向于答案是否定的。没有保证。
@user2672165 - 最近在 OTN (community.oracle.com) 上对此进行了讨论。普遍的观点是(1)TABLE 操作符至少在某些情况下确实可能会扰乱顺序,即使在“简单”测试用例中它不会; (2) Oracle 文档没有说明在通过 TABLE 运算符时将保留元素的顺序(即使它也没有说相反的内容,并且没有人知道当顺序为不安)。 community.oracle.com/thread/4119842以上是关于TABLE 函数返回的行的顺序是不是保证与 VARRAY 元素的存储顺序相同?的主要内容,如果未能解决你的问题,请参考以下文章