Mutando tabla en Oracle 11 causada por una función

Recientemente hemos actualizado de Oracle 10 a Oracle 11.2. Después de la actualización, comencé a ver un error en la tabla de mutaciones causado por una función en lugar de un desencadenante (que nunca he visto antes). Es un código antiguo que funcionaba en versiones anteriores de Oracle.

Aquí hay un escenario que causará el error:

create table mutate (
    x NUMBER,
    y NUMBER
);

insert into mutate (x, y)
values (1,2);

insert into mutate (x, y)
values (3,4);

He creado dos filas. Ahora, duplicaré mis filas llamando a esta declaración:

insert into mutate (x, y)
select x + 1, y + 1 
from mutate;

Esto no es estrictamente necesario para duplicar el error, pero ayuda con mi demostración más adelante. Entonces el contenido de la tabla ahora se ve así:

X,Y
1,2
3,4
2,3
4,5

Todo está bien. Ahora viene la parte divertida

create or replace function mutate_count
return PLS_INTEGER
is
    v_dummy PLS_INTEGER;
begin
    select count(*) 
    into v_dummy
    from mutate;

    return v_dummy;
end mutate_count;
/

He creado una función para consultar mi tabla y devolver un recuento. Ahora, combinaré eso con una instrucción INSERT:

insert into mutate (x, y)
select x + 2, y + 2
from mutate
where mutate_count() = 4;

¿El resultado? Este error

ORA-04091: table MUTATE is mutating, trigger/function may not see it
ORA-06512: at "MUTATE_COUNT", line 6

Así que sé qué causa el error, pero tengo curiosidad sobre lapor qu. ¿Oracle no está realizando SELECT, recuperando el conjunto de resultados ylueg realizando una inserción masiva de esos resultados? Solo esperaría un error de tabla mutante si los registros ya se estuvieran insertando antes de que finalizara la consulta. Pero si Oracle hizo eso, ¿no sería la declaración anterior:

insert into mutate (x, y)
select x + 1, y + 1 
from mutate;

comenzar un bucle infinito?

ACTUALIZAR

A través del enlace de Jeffrey encontré esto enthe Oracle docs:

Por defecto, Oracle garantiza la coherencia de lectura a nivel de declaración. El conjunto de datos devueltos por una sola consulta es coherente con respecto a un único punto en el tiempo.

También hay un comentario del autor enhis post:

One podría argumentar por qué Oracle no garantiza esta 'consistencia de lectura a nivel de declaración' para llamadas repetidas a funciones que aparecen dentro de una declaración SQL. Podría considerarse un error en lo que a mí respecta. Pero esta es la forma en que funciona actualmente.

¿Estoy en lo cierto al suponer que este comportamiento ha cambiado entre las versiones 10 y 11 de Oracle?

Respuestas a la pregunta(4)

Su respuesta a la pregunta