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 元素的存储顺序相同?的主要内容,如果未能解决你的问题,请参考以下文章

指定在MS SQL Server中返回的行的顺序

hive聚合函数

SQL 行返回顺序

PHP判断sql语句是不是执行成功

Flink Table API & SQL 自定义 Table 表函数

从表值函数返回显式 Open XML 结果集