Necesito ejecutar un montón de (hasta ~ 1000000) sentencias sql en una base de datos Oracle. Estas declaraciones deberían dar como resultado un estado referencialmente consistente al final, y todas las declaraciones deberían revertirse si ocurre un error. Estas declaraciones no vienen en un orden referencial. Por lo tanto, si las restricciones de clave externa están habilitadas, una de las sentencias puede causar una violación de clave externa, aunque esta violación se solucionará con una sentencia que se ejecutará más adelante.Oracle DDL en transacción autónoma
He intentado desactivar primero las claves foráneas y habilitarlas después de que se hayan ejecutado todas las instrucciones. Pensé que sería capaz de retroceder cuando haya una violación real de clave externa. Aunque me equivoqué, descubrí que cada declaración DDL en Oracle comenzaba con una confirmación, por lo que no había forma de deshacer las declaraciones de esta manera. Aquí está mi script para desactivar las claves externas:
begin
for i in (select constraint_name, table_name from user_constraints
where constraint_type ='R' and status = 'ENABLED')
LOOP execute immediate 'alter table '||i.table_name||' disable constraint
'||i.constraint_name||'';
end loop;
end;
Después de algunas investigaciones, descubrí que se recomendó para ejecutar sentencias DDL, como en este caso, en una transacción autónoma. Así que traté de ejecutar sentencias DDL en una transacción autónoma. Esto dio como resultado el siguiente error:
ORA-00054: El recurso ocupado y adquirir con NOWAIT especificado
estoy conjeturando que esto es debido a que la transacción principal todavía tiene bloqueo DDL en las mesas.
¿Estoy haciendo algo mal aquí, o hay alguna otra forma de hacer que este escenario funcione?
Acabo de enterarme del truco "ESTABLECER LIMITACIONES" y vine a responder mi propia pregunta y vi su respuesta :). Gracias. – swamplord