【问题标题】:Getting a ResultSet/RefCursor over a database link通过数据库链接获取 ResultSet/RefCursor
【发布时间】:2011-02-02 17:07:15
【问题描述】:

calling a stored proc over a dblink 的答案看来,如果您通过远程 DB 链接进行 SP 调用,则似乎无法调用存储过程并取回 ResultSet/RefCursor。我们也在使用 Oracle 10g。

我们可以通过链接成功获取单值结果,并且可以成功调用 SP 并在本地获取结果,但是在从远程 DB 读取 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 代码:

 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" ));
        }

    }

【问题讨论】:

    标签: oracle jdbc oracle10g resultset ora-24338


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的建议 - 我们目前倾向于选项 3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多