1

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

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

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

BEGIN 

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

  RETURN OUTPUT;

END;

しかし、Java Code からこの関数を呼び出すと、ORA-24338: statement handle not executedエラーが発生します。ここに私のリモート機能があります:

CREATE OR REPLACE FUNCTION GETEMPLOYEE ( IN_ID IN VARCHAR2 ) 
RETURN TYPES.RECORD_CURSOR AS

  RESULT_CURSOR TYPES.RECORD_CURSOR;

BEGIN

   OPEN RESULT_CURSOR FOR 
     SELECT ID, NAME, ADDRESS  
       FROM EMPLOYEE 
      WHERE ID = IN_ID; 

  RETURN RESULT_CURSOR;

END GETEMPLOYEE;

ここに私のJavaコードがあります:

String fncall = "{call ? :=  schema.LocalGetEmployee(?)}";

CallableStatement stm = con.prepareCall(fncall);
stm.registerOutParameter(1, Types.CURSOR);
stm.setInt(2, 123);
stm.execute();

ResultSet rs = (ResultSet) stm.getObject(1);
while(rs.next()) {
  ......
}
4

1 に答える 1

1

リモート データベースで作成された refcursor を使用しても意味がありません。dblink 参照は、リモート インスタンスでセッションを開き、カーソルを作成し、リモート関数呼び出しが終了するとすぐに消えます。したがって、ローカル インスタンスでの ORA-24338 エラー - refcursor は有効なものを指していません。

リモート セッションを開いたままにしておくことができたとしても、refcursor は何を指しているのでしょうか? リモート データベースの一部のメモリ領域ですか?

于 2011-05-07T04:50:41.550 に答える