Commit In循环给出了错误的输出?

时间:2010-04-10 18:05:41

标签: oracle plsql

我试图在表消息中插入除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;

中选择*

2 个答案:

答案 0 :(得分:8)

如果您不使用ORDER BY,则应假设结果显示的顺序未定义。结果通常与插入的顺序相同,但不能保证。

最重要的是,如果您希望结果按特定顺序排列,请使用ORDER BY

答案 1 :(得分:0)

正如Matti所说,您需要明确的order by子句来保证正确返回排序。

当您有待处理的更改(即未提交的更改)时,您是唯一能够看到它们(通常是......)的人,因为它们尚未添加到其他数据所在的数据存储中。 Oracle维护一个单独的挂起更改列表,用于更改从主数据存储中获取的结果。在您的示例中,从此列表中进行的更改恰好按顺序返回,因为示例中的数据非常少,Oracle可能不需要以任何方式拆分待处理数据以优化其存储。

提交数据后,它将进入主数据库存储,并根据表和分区的设置方式以任意数量的方式进行排序。

简而言之,数据来自提交之前和之后的两个不同的地方,它恰好是以不同的顺序返回,但不依赖它们并不总是表现得那样。