Każdy rozproszony SQL, nawet wybrany, otworzy transakcję, która musi zostać zamknięta, zanim będzie można zamknąć łącze do bazy danych. Musisz wycofać lub zatwierdzić przed wywołaniem ALTER SESSION CLOSE DATABASE LINK.
Ale wygląda na to, że masz już coś innego do obsługi Twoich transakcji. Jeśli nie jest możliwe ręczne wycofanie lub zatwierdzenie, powinieneś spróbować zwiększyć liczbę otwartych linków. OPEN_LINKS parametr to maksymalna liczba linków na sesję. Liczba potrzebnych linków nie zależy tak naprawdę od obciążenia, powinna być oparta na maksymalnej liczbie odrębnych zdalnych baz danych.
Edytuj:
Sytuacja, którą opisujesz w swoim komentarzu, nie powinna mieć miejsca. Nie rozumiem wystarczająco twojego systemu, aby wiedzieć, co naprawdę dzieje się z transakcjami. W każdym razie, jeśli nie możesz dokładnie określić, co robi system, możesz zastąpić "zmianę łącza do bazy danych zamknięcia sesji" taką procedurą:
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;
/
Prawdopodobnie będziesz potrzebować tego grantu:
grant select on v_$dblink to [relevant user];