2011-05-06 86 views
1

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

getEmployee,我试图返回游标与员工数据。(表:雇员(ID,姓名,地址)):

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

BEGIN 

    OUTPUT := [email protected](ID) ;  

    RETURN OUTPUT; 

END; 

但是,当我从Java调用代码这个功能,它给出了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()) { 
    ...... 
} 
+0

你能发布你的Java代码吗? – 2011-05-06 23:45:58

+0

@Trevor将Java代码添加到我原来的帖子中。 – 2011-05-07 00:06:53

+1

ORA错误意味着你有数据库的麻烦 - 在函数运行之前不值得看Java。 – 2011-05-07 00:44:08

回答

1

这是没有意义的,我用在远程数据库中创建一个指针。 dblink引用将在远程实例上打开会话,创建光标,并在远程函数调用终止时立即离开。因此,你的本地实例上的ORA-24338错误 - refcursor不指向任何有效的东西。

即使您可以将远程会话打开,refcursor将指向什么?远程数据库上的某些内存区域?