Как обновление или вставка при циклическом просмотре набора результатов влияет на сам набор результатов? - PullRequest
0 голосов
/ 16 февраля 2012

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

Как это влияет на набор результатов? Я склонен думать, что, поскольку Заявление, которое извлекло этот RS, было выполнено ранее в этом процессе, этот RS теперь будет скрывать изменения, сделанные моими подготовленными утверждениями.

Псевдокод:

Preapare Statement ps1
execute ps1 -> get Result Set rs1
loop through rs1
    {
     Update or delete records using other prepared statements
    }

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

Непротиворечивость чтения

Oracle гарантирует, что набор данных, видимых оператором, соответствует одному моменту времени и не изменяется во время выполнения оператора (операторасогласованность на уровне чтения)

Вот почему, если у вас есть запрос, такой как

insert into t
select * from t;

Oracle просто продублирует все строки, не заходя в бесконечный цикл или не вызывая ошибку.

Из-за этого есть и другие последствия.

1) Oracle считывает данные из сегмента отката, чтобы предоставить вам непротиворечивое изображение ваших данных.Таким образом, если ваши сегменты отката имеют неправильный размер или вы фиксируете между выборками, вы получите ошибку «Снимок слишком старый», поскольку ваши данные отката больше не доступны.

Хорошо, такесли это так, можно ли обновить его при обновлении?Я имею в виду не только обновление курсора, но и использование встроенных функций набора результатов.

2) Каждый запрос видит данные в момент времени, когда начался .Если под обновлением вы подразумеваете повторное выполнение запроса, то данные, которые вы видите, могут снова отличаться, если вы делаете коммиты в теле pl / sql или в цикле pl / sql, или если в вашей системе одновременно выполняются другие транзакции.

0 голосов
/ 16 февраля 2012

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

...