2016-07-11 39 views
0

Ich habe 10 Funktionen und jede Funktion gibt eine Tabelle aus der Verwendung von dblinks zurück.ORA-02080: Datenbankverbindung wird verwendet

Die Struktur ist wie

function declare 
. 
. 
. 
begin 
. 
if 
for i in (select * from [email protected]) 

loop 

i. 
i. 
i. 

--return tble 
pipe row(obj); 

end loop; 
end if; 
--close dblink statement.. 
execute immediate 'ALTER SESSION CLOSE DATABASE LINK TEST_LINK'; 

end; 

Alle Funktionen wie diese nur sind.

Ich habe versucht, Rollbacks und begehen innen vor db Link zu schließen, aber es gibt einen Fehler wie:

ORA-14552: kann eine DDL nicht ausführen, begehen oder in einer Abfrage oder DML Rollback

Ich möchte den DBlink schließen.

Ich denke, das Problem bezieht sich auf Cursor, die nicht ordnungsgemäß geschlossen wurden. Wie schließen Sie diese Typen anonymer expliziter Cursor?

+0

Willkommen bei Stack Overflow. Bitte lesen Sie [stackoverflow.com/help/how-to-ask](http://stackoverflow.com/help/how-to-ask) für Richtlinien zum Schreiben von Fragen. Für Anfänger: 1. Bitte formatieren Sie Ihren Code. 2. Fügen Sie Ihrer Frage mehr Code hinzu, damit wir sie besser verstehen und dass zukünftige Leser von dieser Frage profitieren können. 3. Suchen Sie nach anderen Fragen, die Ihnen bereits helfen könnten. 4. Formatieren Sie Ihren Text und geben Sie uns ein funktionierendes Beispiel. – abarisone

+0

Ich habe ein wenig Ihre Frage um einige Tippfehler korrigiert, aber ich empfehle Ihnen, den Code-Abschnitt zu verbessern – abarisone

Antwort

0

PL/SQL versucht Cursor zu cachen, was bedeutet, dass sie nicht wirklich geschlossen werden. Sie sollten in der Lage sein, alter session zu verwenden, um zu sagen, dass es nicht zwischengespeichert werden soll, und schließen Sie dann den Link.

execute immediate 'ALTER SESSION SET SESSION_CACHED_CURSORS = 0'; 
dbms_session.CLOSE_DATABASE_LINK('####'); 
execute immediate 'ALTER SESSION SET SESSION_CACHED_CURSORS = 50';