Есть ли эквивалент для SQL Server CURSOR STATIC?
Нужно обрабатыват данные из таблицы, перебирая циклом текущие записи с помощью курсора. Вновь добавленные записи во время работы с курсором не должны быть видны в цикле.
В SQL Server использую для этого CURSOR STATIC, который делает снапшот результата запроса на момент времени открытия курсора. Но не могу найти эквивалент в Oracle.
Есть ли какой-либо способ добиться этого?
Свободный перевод вопроса Equivalent for SQL Server CURSOR STATIC от участника @Xayris
Ответы (1 шт):
Ожидаемое поведение курсора в вопросе, это поведение в СУБД 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