Есть ли эквивалент для SQL Server CURSOR STATIC?

Нужно обрабатыват данные из таблицы, перебирая циклом текущие записи с помощью курсора. Вновь добавленные записи во время работы с курсором не должны быть видны в цикле.

В SQL Server использую для этого CURSOR STATIC, который делает снапшот результата запроса на момент времени открытия курсора. Но не могу найти эквивалент в Oracle.

Есть ли какой-либо способ добиться этого?


Свободный перевод вопроса Equivalent for SQL Server CURSOR STATIC от участника @Xayris


Ответы (1 шт):

Автор решения: 0xdb

Ожидаемое поведение курсора в вопросе, это поведение в СУБД Oracle по умолчанию.

Результат запроса определяется состоянием данных на момент открытия курсора, и не меняется, пока открыт курсор. Это называется Statement-Level Read Consistency (согласованность чтения на уровне запроса) и описывается в одноименной гл. книги Database Concepts.

Пример, на котором видно, что курсор не видит изменений таблицы, которые были произведенны после его открытия:

create table t (val) as select 1 from dual;

var rc refcursor
var ret refcursor

exec open :rc for select * from t

update t set val=val*10;
insert into t values (2);

declare tab sys.odciNumberList;
begin
    fetch :rc bulk collect into tab;
    open :ret for select * from table (tab);
end;
/
print ret

COLUMN_VALUE
------------
           1

Только новый курсор увидит изменения:

exec open :rc for select * from t
print rc

       VAL
----------
        10
         2
→ Ссылка