Фиксация в цикле дает неправильный вывод? - PullRequest
2 голосов
/ 10 апреля 2010

Я пытаюсь вставить от 1 до 10 чисел, кроме 6 и 8 в табличных сообщениях, но когда я получаю его из таблицы mesages1, вывод идет в следующем порядке 4 5 7 9 10 1 2 3 Так должно быть 1 2 3 4 5 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;

выбрать * из сообщений1;

Ответы [ 2 ]

8 голосов
/ 10 апреля 2010

Если вы не используете ORDER BY, вы должны исходить из того, что порядок появления результатов не определен. Часто результаты находятся в том же порядке, в котором они были вставлены, но это не гарантируется.

Итог, если вы хотите, чтобы ваши результаты были в определенном порядке, используйте ORDER BY.

0 голосов
/ 11 апреля 2010

Как говорит Матти, вам нужен порядок по пункту, чтобы гарантировать, что заказ будет возвращен правильно.

Когда у вас есть ожидающие изменения (то есть незафиксированные), вы единственный, кто может их видеть (обычно ...), потому что они не были добавлены в хранилище данных, где находятся другие данные. Oracle поддерживает отдельный список ожидающих изменений, которые он использует для изменения результатов, которые он получает из основного хранилища данных. В вашем примере изменение из этого списка происходит по порядку, так как в примере очень мало данных, и, по-видимому, Oracle не нужно каким-либо образом разбивать ожидающие данные для оптимизации своего хранилища.

Как только данные будут зафиксированы, они попадут в основное хранилище базы данных и будут упорядочены любым количеством возможных способов в зависимости от того, как настроены таблица и раздел.

Короче говоря, данные поступают из двух разных мест до и после принятия, просто так получается, что они возвращаются в разных порядках, но не полагайтесь на них, не всегда ведя себя так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...