2011-05-06 76 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將指向什麼?遠程數據庫上的某些內存區域?