2009-07-13 11 views
4

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

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; 

これを同じDBインスタンスとschema_nameから実行すると、うまく実行できます。しかし、これをデータベース・リンク(ストアド・プロシージャ名などの変更が必要です)で実行すると、Oracleエラーが発生します。ORA-24338:文ハンドルは実行されません。私はREFカーソル・タイプであることを覚えてpackage_name.record_cursorご質問の他から

declare 
     symbol_cursor [email protected]_link_name; 
     symbol_record [email protected]_link_name; 
begin 
     symbol_cursor := [email protected]_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; 
+0

重複したhttp://stackoverflow.com/questions/1119306/execute-immediate-over-databse-link – skaffman

+0

私はこれがその質問の重複であることに同意しません。これはダイナミック*コードの実行に関するものですdblink。 –

答えて

4

dblinkを超えるこのコードの修正版は次のようになります。参照カーソルは、作成されたデータベースでのみ有効なメモリハンドルです。つまり、リモートデータベースに参照カーソルを作成し、そこからローカルデータベースをフェッチしようとすることはできません。

実際にローカルデータベースのデータを処理する必要があり、テーブルがリモートデータベースに残っている必要がある場合は、パッケージ "package_name"をローカルデータベースに移動して、データベースのリンクを介してリモートのdb。

+1

私には意味があります。しかし、(私の無知を赦してください)、jdbcリンクで返されたときにREFカーソルはどのように動作しますか?その場合も別のメモリ空間で使用されていませんか?ありがとう。 – neesh

+1

アプリケーションは、jdbc接続を介してデータベースにアクセスします。アプリケーションは実際にストアドプロシージャから参照カーソルを取得できます。しかし、そのリファレンスカーソルをローカル/アプリケーション側で使用することはありません。代わりに、フェッチ操作のために参照カーソルをデータベースに戻します。あなたは基本的にデータベースに "ここにこのハンドルに関連する結果セットを渡す"と言う。 –

関連する問題