Cualquier SQL distribuido, incluso una selección, abrirá una transacción que debe cerrarse antes de que pueda cerrar el enlace de la base de datos. Debe retroceder o confirmar antes de llamar ALTER SESSION CLOSE DATABASE LINK.
Pero parece que ya tienes algo más manejando tus transacciones. Si no es posible revertir o confirmar manualmente, debe intentar aumentar la cantidad de enlaces abiertos. OPEN_LINKS El parámetro es el número máximo de enlaces por sesión. La cantidad de enlaces que necesita no depende realmente de la carga, debe basarse en la cantidad máxima de bases de datos remotas distintas.
Editar:
La situación que describes en tu comentario no debería ocurrir. No entiendo lo suficiente acerca de su sistema para saber qué sucede realmente con las transacciones. De todos modos, si no puede averiguar exactamente qué está haciendo el sistema, tal vez pueda reemplazar "alterar el enlace de la base de datos de cierre de sesión" con un procedimiento como este:
create or replace procedure rollback_and_close_db_links authid current_user is
begin
rollback;
for links in (select db_link from v$dblink) loop
execute immediate 'alter session close database link '||links.db_link;
end loop;
end;
/
Probablemente necesitarás esta subvención:
grant select on v_$dblink to [relevant user];