2010-03-30 11 views
3

從答案到calling a stored proc over a dblink似乎無法調用存儲過程並在通過遠程數據庫鏈接進行SP調用時返回ResultSet/RefCursor。我們也在使用Oracle 10g。通過數據庫鏈接獲取ResultSet/RefCursor

我們可以在鏈接上成功獲取單值結果,並且可以成功調用SP並在本地獲取結果,但從遠程數據庫讀取ResultSet時,得到的ORA-24338:語句句柄未執行錯誤。

我的問題 - 是否有使用存儲過程的任何解決方法?共享視圖是更好的解決方案嗎?管子排?

示例存儲過程:

CREATE OR REPLACE PACKAGE BODY example_SP 
IS 

    PROCEDURE get_terminals(p_CD_community IN community.CD_community%TYPE, 
          p_cursor   OUT SYS_REFCURSOR) 
    IS 
    BEGIN 
    OPEN p_cursor FOR 
    SELECT cd_terminal 
    FROM terminal t, community c 
    WHERE c.cd_community = p_CD_community 
    AND t.id_community = c.id_community; 
    END; 

END example_SP; 
/

示例Java代碼在本地而不是遠程工作原理:對於從Java到遠程數據庫的直接連接

Connection conn = DBConnectionManagerFactory.getDBConnectionManager().getConnection(); 
    CallableStatement cstmt = null; 
    ResultSet rs = null; 
    String community = "EXAMPLE"; 

    try 
    { 
     cstmt = conn.prepareCall("{call [email protected]_address(?,?)}"); 
     cstmt.setString(1, community); 
     cstmt.registerOutParameter(2, OracleTypes.CURSOR); 

     cstmt.execute(); 

     rs = (ResultSet)cstmt.getObject(2); 

     while (rs.next()) 
     { 
       LogUtil.getLog().logInfo("Terminal code=" + rs.getString("cd_terminal")); 
     } 

    } 

回答

3

選項1.進入,而不是通過去本地數據庫。更簡單,但協調兩個單獨的交易取決於應用程序。如果一個數據庫只用於讀取而不是寫入,我會走這條路。

您可以使用直接查詢或存儲過程和引用遊標。除非有足夠的理由添加存儲過程層,否則我通常會使用前者。

選項2.使用數據庫鏈接轉到本地數據庫中的直接查詢。

選項3.作爲(2),但將查詢隱藏在存儲在本地數據庫中的視圖(或同義詞)中。

選項4.如果結果集足夠小,您可以讓本地數據庫上的過程調用遠程數據庫上的過程。遠程過程會將結果作爲XML或結構化的CLOB(例如JSON)返回,這可以由本地過程或java層「解碼」。

+0

感謝您的建議 - 我們現在傾向於選項3。 – JonathanJ 2010-03-31 02:58:43