2016-07-11 30 views
0

10個の関数があり、各関数はdblinksを使用して表を戻します。ORA-02080:データベース・リンクが使用されています

構造は、すべての機能は、この唯一のようなものです

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; 

のようなものです。

私はロールバックを試してみましたが、DBリンクを閉じる前に内部コミットが、それはとしてエラーを返します:

ORA-14552:

を、DDLを実行し、クエリ内のコミットやロールバックまたはDML

することはできません私はdblinkを閉じたいと思う。

私は問題が適切に閉じていなかったカーソルに関連していると思います。これらのタイプの匿名明示カーソルを閉じるにはどうすればよいですか?

+0

ようこそスタックオーバーフロー。質問の書き方については、[stackoverflow.com/help/how-to-ask](http://stackoverflow.com/help/how-to-ask)を参照してください。まずは:1.コードをフォーマットしてください。 2.あなたの質問にもっとコードを追加して、私たちがそれをよりよく理解し、将来の読者がこの質問の恩恵を受けるのを助けてください。 3.あなたを助けるかもしれない他の質問を探してください。 4.テキストを書式設定し、最小限の作業例を与えてください – abarisone

+0

いくつかの誤植を修正してあなたの質問を少し書き直しましたが、コードセクションを改善することをお勧めします – abarisone

答えて

0

PL/SQLはカーソルをキャッシュしようとします。つまり、カーソルを実際に閉じることはありません。 変更セッションを使用して、キャッシュしないようにし、リンクを閉じることができるはずです。

execute immediate 'ALTER SESSION SET SESSION_CACHED_CURSORS = 0'; 
dbms_session.CLOSE_DATABASE_LINK('####'); 
execute immediate 'ALTER SESSION SET SESSION_CACHED_CURSORS = 50'; 
関連する問題