4

我创建了一个getEmployee(id in varchar)在远程数据库中调用的 oracle 函数,我正在尝试使用数据库链接从本地数据库中调用它。

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

在远程站点获取 Ref 光标:

假设我们有两个站点涉及分布式事务,Server1 和 Server2。在 Server1 过程中打开的 Ref Cursor 无法在 Server2 站点获取。如果我们尝试获取此游标,oracle 会引发异常:

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

“我们不能在 DBLink 上使用 Ref 游标”</p>

解决方案:

  1. 使用 PL-SQL 数据表。或者
  2. 从发起者站点提供选择授权并使用 DBLink 选择命令,而不是打开光标。

来源: 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 回答