gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:45:17 25 4
gpt4 key购买 nike

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

我们可以通过链接成功获取单值结果,并且可以成功调用 SP 并在本地获取结果,但是当从远程 DB 读取 ResultSet 时,我们会遇到相同的“ORA-24338:语句句柄未执行”错误。

我的问题 - 使用存储过程是否有任何解决方法?共享 View 是更好的解决方案吗?管道行?

示例存储过程:

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

}

最佳答案

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

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

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

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

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

关于oracle - 通过数据库链接获取 ResultSet/RefCursor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2549417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com