我试图在表消息中插入除1和10之外的1到10个数字,但是当我从表mesages1中获取它时,输出按此顺序排列 4 五 7 9 10 1 2 3 它应该是这样的 1 2 3 4 五 7 9 10 根据逻辑,当我省略提交或将其放在其他地方时,它工作正常, 请解释一下为什么会这样? 这是我的代码。
BEGIN
FOR i IN 1..10
LOOP
IF i<>6 AND i<>8
THEN
INSERT INTO messages1
VALUES (i);
END IF;
commit;
END LOOP;
END;
从messages1;
中选择*答案 0 :(得分:8)
如果您不使用ORDER BY
,则应假设结果显示的顺序未定义。结果通常与插入的顺序相同,但不能保证。
最重要的是,如果您希望结果按特定顺序排列,请使用ORDER BY
。
答案 1 :(得分:0)
正如Matti所说,您需要明确的order by子句来保证正确返回排序。
当您有待处理的更改(即未提交的更改)时,您是唯一能够看到它们(通常是......)的人,因为它们尚未添加到其他数据所在的数据存储中。 Oracle维护一个单独的挂起更改列表,用于更改从主数据存储中获取的结果。在您的示例中,从此列表中进行的更改恰好按顺序返回,因为示例中的数据非常少,Oracle可能不需要以任何方式拆分待处理数据以优化其存储。
提交数据后,它将进入主数据库存储,并根据表和分区的设置方式以任意数量的方式进行排序。
简而言之,数据来自提交之前和之后的两个不同的地方,它恰好是以不同的顺序返回,但不依赖它们并不总是表现得那样。