从Java调用oracle函数

时间:2011-05-06 23:30:39

标签: sql oracle function jdbc ora-24338

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

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()) {
  ......
}

1 个答案:

答案 0 :(得分:1)

使用在远程数据库中创建的refcursor是没有意义的。 dblink引用将在远程实例上打开一个会话,创建游标,并在远程函数调用终止时立即消失。因此,本地实例上的ORA-24338错误 - refcursor指向无效的任何内容。

即使你可以让远程会话保持打开状态,refcursor会指向什么?远程数据库上的某些内存区域?