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

时间:2011-05-05 14:53:59

标签: sql oracle database-link ora-24338

我在远程数据库中创建了一个名为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:语句句柄未执行”

2 个答案:

答案 0 :(得分:6)

在远程站点获取参考光标:

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

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

“我们不能在DBLink上使用Ref Cursor”

解决方案:

  1. 使用PL-SQL数据表。 OR
  2. 提供select grant并使用select命令通过DBLink 启动器站点而不是打开Cursor。
  3. 来源:Distributed transaction in Oracle (Over Oracle DBLink)

答案 1 :(得分: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);