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