0

正如标题中所说,我想知道是否可以将多个引用游标(在 Oracle 存储过程中)分配给一个:像下面的代码:...。

    create or replace procedure assign_ref_cursor(result_cur out sys_refcursor)
    as
    cursor1 sys_refcursor;
    cursor2 sys_refcursor;
    cursor3 sys_refcursor;
    
    -- expected result:
    result_cur[0] = cursor1
    result_cur[1] = cursor2
    result_cur[2] = cursor3
...
return  result_cur;

...好吧,这将是一件好事,它将每个 ref_cursor 的全部结果合二为一。

这样做的原因是因为我正在使用 Spring 数据 JPA 从存储过程中检索数据(多个引用游标)。但显然没有使用 javax.persistence.storedprocedurequery 检索多个引用光标的解决方案......尽管谷歌搜索了几天......

因此,我设想了将 Oracle 存储过程更改为仅返回一个 ref_cursor 的解决方案,即“聚合”不同的 ref_cursor。

继亚历克斯的问题之后,这是一个更新

我尝试使用以下方法调用三个 OUT ref 游标参数:

StoredProcedureQuery proc = entityManager.createStoredProcedureQuery("myStoredProc");
proc.registerStoredProcedureParameter("cursor1", void.class, ParameterMode.REF_CURSOR);
proc.registerStoredProcedureParameter("cursor2", void.class, ParameterMode.REF_CURSOR);
...
List<Object[]> listOfObjects =  proc.getResultList();

但是listOfObjects只包含cursor1的内容 没办法获取cursor2的内容...

4

2 回答 2

1

如果您目前有类似的东西:

open cursor1 for <query1>;
open cursor2 for <query2>;
open cursor3 for <query3>;

然后您可以将它们组合为一个结果中的游标表达式:

open result_cur for
  select cursor(<query1>) as cursor1,
         cursor(<query2>) as cursor2,
         cursor(<query3>) as cursor3
  from dual;

如果您要返回其他数据,您也可以包含更多“普通”列,并针对真实表而不是对偶表进行主查询,当然。

于 2020-08-05T18:03:51.917 回答
0

这可能会有所帮助:

解决方法是从 Hibernate EntityManager 获取连接,然后使用 CallableStatement。

// Session = org.hibernate.Session
// entityManager = javax.persistence.EntityManager
Session session = entityManager.unwrap(Session.class);
session.doWork(new Work() {
@Override
public void execute(Connection con) throws SQLException {
    // do something useful
    try (CallableStatement cs = con.prepareCall("{CALL TEST_PACKAGE.GETCURSORS(?,?,?)}")) {
        cs.setInt(1, 1);
        cs.registerOutParameter(2, OracleTypes.CURSOR);
        cs.registerOutParameter(3, OracleTypes.CURSOR);
        cs.execute();
        ResultSet rs = (ResultSet) cs.getObject(2);
        ResultSet rs1 = (ResultSet) cs.getObject(3);
        while (rs.next()) {
            int a = rs.getInt(1);
            System.out.println(a);
        }
        while (rs1.next()) {
            int b = rs1.getInt(1);
            System.out.println(b);
        }
    }
}
于 2021-06-22T04:24:27.443 回答