4

リモート データベースで呼び出される Oracle 関数を作成し、getEmployee(id in varchar)データベース リンクを使用してローカル データベースから呼び出そうとしています。

ではgetEmployee、従業員データを含むカーソルを返そうとしています。 (テーブル: 従業員 (ID、名前、住所)):

SELECT schema.getEmployee@dblink(id) 
  FROM DUAL;

列名 (ID、名前、アドレス) で結果セットを取得するにはどうすればよいですか?

Contrad によると、ローカル関数を次のように変更しました。

FUNCTION LocalGetEmployee(ID in varchar2)
RETURN Schema.SomeRefCursor
AS  

OUTPUT Schema.SomeRefCursor;

BEGIN 

  OUTPUT := schema.getEmployee@dblink(ID);

  RETURN OUTPUT;
END;  

しかし、Java コードからこの関数を呼び出すと、次のエラーが発生します。

「ORA-24338: 文ハンドルが実行されていません」

4

2 に答える 2

6

リモート サイトでの参照カーソルの取得:

Server1 と Server2 という 2 つのサイトが分散トランザクションに関与しているとします。Server1 プロシージャで開かれた Ref Cursor は、Server2 サイトでフェッチできません。このカーソル oracle を取得しようとすると、例外が発生します。

[ORA-02055: distributed update operation failed; rollback required
 ORA-24338: statement handle not executed]

「DBLink では Ref Cursor を使用できません」</p>

ソリューション:

  1. PL-SQL データ テーブルを使用します。また
  2. カーソルを開く代わりに、select grant を提供し、イニシエータ サイトから DBLink を介して select コマンドを使用します。

出典: Oracle の分散トランザクション (Oracle DBLink 経由)

于 2011-10-17T06:26:59.687 に答える
0

私が知る限り、あなたの質問は実際にはデータベース リンクに関するものではなく、Java クライアントからカーソルを返す関数を呼び出し、そのカーソルからデータを取得する方法です。Javaでこれを行う唯一の方法は、関数呼び出しを「手続き型」コードでラップすることだと思います。目の前に Oracle がないので、これは当て推量です。

String fncall = "begin ? :=  schema.getEmployee@dblink(?) end";
CallableStatement stm = con.prepareCall(fncall);
stm.registerOutParameter(1, Types.CURSOR);
stm.setInt(2, 123);
stm.execute();
ResultSet rs = (ResultSet) stm.getObject(1);
于 2011-05-06T02:49:22.587 に答える