【发布时间】:2026-01-20 09:30:01
【问题描述】:
我正在使用以下类型的绑定变量执行删除语句:
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 必须与第二个名字结合,依此类推。当然,我不在乎删除行的顺序。
标签: oracle collections oracle12c