Любой распределенный SQL, даже выборка, откроет транзакцию, которая должна быть закрыта, прежде чем вы сможете закрыть ссылку на базу данных.Вам нужно откатиться или зафиксировать, прежде чем вызывать ALTER SESSION CLOSE DATABASE LINK.
Но, похоже, у вас уже есть что-то еще, обрабатывающее ваши транзакции.Если откат или фиксация вручную невозможны, попробуйте увеличить количество открытых ссылок.Параметр OPEN_LINKS - это максимальное количество ссылок за сеанс.Количество необходимых ссылок не зависит от нагрузки, оно должно основываться на максимальном количестве отдельных удаленных баз данных.
Редактировать:
СитуацияВы описываете в своем комментарии не должно произойти.Я недостаточно разбираюсь в вашей системе, чтобы понять, что на самом деле происходит с транзакциями.В любом случае, если вы не можете точно определить, что делает система, возможно, вы можете заменить «изменить ссылку на закрытие сеанса» на такую процедуру:
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;
/
Возможно, вам понадобится этот грант:
grant select on v_$dblink to [relevant user];