从calling a stored proc over a dblink的答案看来,如果您通过远程数据库链接进行SP调用,则无法调用存储过程并返回ResultSet / RefCursor。我们也在使用Oracle 10g。
我们可以在链接上成功获取单值结果,并且可以成功调用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代码:
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" ));
}
}
答案 0 :(得分:3)
选项1.从Java到远程数据库的直接连接,而不是通过本地数据库。更简单,但由应用程序来协调两个单独的事务。如果一个数据库只用于读取而不是写入,我就会走这条路。
您可以使用直接查询或存储过程并使用引用光标。除非有充分的理由在存储过程层中添加,否则我通常会使用前者。
选项2.使用数据库链接在本地数据库中进行直接查询。
选项3.如(2)所示,但隐藏在本地数据库中存储的视图(或同义词)中的查询。
选项4.如果结果集足够小,您可以让本地数据库上的过程调用远程数据库上的过程。远程过程将结果返回为XML或结构化CLOB(例如JSON),可以由本地过程或java层“解码”。