首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过数据库链接获取ResultSet/RefCursor

通过数据库链接获取ResultSet/RefCursor
EN

Stack Overflow用户
提问于 2010-03-31 07:32:11
回答 1查看 7.1K关注 0票数 3

从对calling a stored proc over a dblink的回答来看,如果您正在通过远程DB链接进行SP调用,则似乎不可能调用存储过程并取回结果集/引用指针。我们也在使用Oracle 10g。

我们可以成功地跨链路获得单值结果,并且可以成功调用SP并在本地获得结果,但从远程数据库读取ResultSet时,我们得到相同的'ORA-24338:语句柄未执行‘错误。

我的问题是,使用存储过程有什么变通方法吗?共享视图是更好的解决方案吗?管道行?

示例存储过程:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
 Connection conn = DBConnectionManagerFactory.getDBConnectionManager().getConnection();
    CallableStatement cstmt = null;
    ResultSet rs = null;
    String community = "EXAMPLE";

    try
    {
        cstmt = conn.prepareCall("{call example_SP.get_terminals@remote_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" ));
        }

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-31 08:36:21

选项1.使用从Java到远程数据库的直接连接,而不是通过本地数据库。更简单,但这取决于应用程序来协调这两个单独的事务。如果一个数据库只用于读而不是写,我会走这条路。

可以与直接查询或存储过程和引用游标一起使用。除非有充分的理由添加存储过程层,否则我通常会选择前者。

选项2.使用数据库链接在本地数据库中进行直接查询。

选项3.AS (2),但将查询隐藏在存储在本地数据库上的视图(或同义词)中。

选项4.如果结果集足够小,您可以让本地数据库上的过程调用远程数据库上的过程。远程过程将以XML或结构化CLOB (例如JSON)的形式返回结果,这些结果可以由本地过程或java层“解码”。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2549417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档