4

データベース リンクを介してストアド プロシージャを呼び出そうとしています。コードは次のようになります。

declare
       symbol_cursor  package_name.record_cursor;
       symbol_record  package_name.record_name;
begin
       symbol_cursor := package_name.function_name('argument');
loop
       fetch symbol_cursor into symbol_record;
       exit when symbol_cursor%notfound;
       -- Do something with each record here, e.g.:
       dbms_output.put_line( symbol_record.field_a );
end loop;

CLOSE symbol_cursor;

package_name が属する同じ DB インスタンスとスキーマからこれを実行すると、問題なく実行できます。ただし、データベース リンクを介してこれを実行すると (ストアド プロシージャ名などに必要な変更を加えて)、Oracle エラーが発生します: ORA-24338: ステートメント ハンドルが実行されませんでした。

dblink 上のこのコードの修正版は次のようになります。

declare
       symbol_cursor  package_name.record_cursor@db_link_name;
       symbol_record  package_name.record_name@db_link_name;
begin
       symbol_cursor := package_name.function_name@db_link_name('argument');
loop
       fetch symbol_cursor into symbol_record;
       exit when symbol_cursor%notfound;
       -- Do something with each record here, e.g.:
       dbms_output.put_line( symbol_record.field_a );
end loop;

CLOSE symbol_cursor;
4

1 に答える 1

4

別の質問から、package_name.record_cursorがrefカーソルタイプであることを覚えています。参照カーソルは、それが作成されたデータベースでのみ有効なメモリハンドルです。つまり、リモートデータベースに参照カーソルを作成して、そこからローカルデータベースをフェッチすることはできません。

ローカルデータベースのデータを本当に処理する必要があり、テーブルをリモートデータベースに残しておく必要がある場合は、パッケージ「package_name」をローカルデータベースに移動し、リモートデータベースのテーブルに対してクエリを実行することができます。データベースリンク。

于 2009-07-13T22:38:43.573 に答える