使用数据库链接调用oracle函数



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

getEmployee中,我试图返回带有员工数据的游标。(表:Employee (ID, Name, address)):

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

如何获得列名(ID, name, address)的结果集?

根据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:语句句柄未执行"

在远程站点获取Ref Cursor:

假设我们有两个站点参与分布式事务,Server1和Server2。在Server1过程上打开的refcursor不能在Server2站点上获取。如果我们试图获取这个游标,oracle会抛出一个异常:

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

"我们不能在DBLink上使用Ref Cursor "

解决方案:

  1. 使用PL-SQL数据表。或
  2. 在DBLink上提供选择授权和使用选择命令

Source: Distributed transaction in Oracle (Over Oracle DBLink)

据我所知,您的问题实际上不是关于数据库链接的,而是如何从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);

相关内容

  • 没有找到相关文章

最新更新