Pode falhar com
ORA-08103: object no longer exists
. Na Oracle, leitores e escritores não se bloqueiam. O que significa que DML e consultas não interferirão entre si, excluindo alguns casos estranhos, como ficar sem espaço UNDO. Mas mover um tablespace, ou qualquer tipo de ALTER ou outra instrução DDL, não é uma gravação normal. O modelo de controle de simultaneidade multiversão é interrompido quando você executa o DDL, pelo menos para os objetos envolvidos, e coisas estranhas começam a acontecer.
Testar uma grande movimentação é difícil, mas você pode reproduzir esses erros fazendo um loop através de várias pequenas alterações e consultas. Caso você ache que isso é apenas uma questão teórica, já vi esses erros ocorrerem na vida real, em um banco de dados de produção.
Aviso:loops infinitos abaixo, pois não posso prever quanto tempo levará para reproduzir esse erro. Mas geralmente leva apenas dezenas de segundos.
--Create sample table.
drop table test1 purge;
create table test1(a number, b number)
partition by list(a) (partition p1 values(1), partition p2 values(2))
nologging tablespace users;
--Session 1
begin
loop
execute immediate '
insert /*+ append */ into test1 select mod(level,2)+1, level
from dual connect by level <= 100000';
commit;
execute immediate 'alter table test1 move partition p1 tablespace users';
end loop;
end;
/
--Session 2: Read from moved partition
declare
v_count number;
begin
loop
select count(*) into v_count from test1 where a = 1;
end loop;
end;
/
--Session 3: Read from unmoved partition
declare
v_count number;
begin
loop
select count(*) into v_count from test1 where a = 2;
end loop;
end;
/
A Sessão 2 acabará por morrer com:
ORA-08103: object no longer exists
ORA-06512: at line 6
A sessão 3 não falhará, não está consultando uma partição alterada. Cada partição tem seu próprio segmento e é um objeto separado que pode potencialmente "não existir mais".