首页 > 解决方案 > 从具有多个引用光标的 Hibernate 调用存储过程

问题描述

我正在尝试从存储过程中检索值。这个存储过程有两个引用游标。下面是SP:

create or replace PROCEDURE "EMP_JOB" (
    p_job           VARCHAR2,
    p_emp_refcur    IN OUT SYS_REFCURSOR,
    p_sal_refcur    IN OUT SYS_REFCURSOR
)
IS
BEGIN
    OPEN p_emp_refcur FOR 
    SELECT empno, ename 
    FROM emp 
    WHERE job = p_job;

    OPEN p_sal_refcur FOR 
    SELECT sal 
    FROM emp 
    WHERE job = p_job;
END;

这是我的java代码:

StoredProcedureQuery query = entityManager.createStoredProcedureQuery("EMP_JOB")
                .registerStoredProcedureParameter(1, String.class, ParameterMode.IN)
                .registerStoredProcedureParameter(2,  Class.class, ParameterMode.REF_CURSOR)
                .registerStoredProcedureParameter(3,  Class.class, ParameterMode.REF_CURSOR)        
                .setParameter(1, "CLERK");

query.execute();
Iterator queryIterator = query.getResultList().iterator();
ArrayList<Object> vinArray= new ArrayList<Object>();

while(queryIterator.hasNext()){
     Object st= (Object)queryIterator.next();
     vinArray.add(st);
}

我可以检索参数 2( p_emp_refcur IN OUT SYS_REFCURSOR) 的输出。

如何获取参数 3( p_sal_refcur IN OUT SYS_REFCURSOR) 的输出。

任何帮助,将不胜感激。

提前致谢

标签: javaspringhibernatejpastored-procedures

解决方案


看来还是不行。但是,这是通过从 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);
            }
        }
    }
});

推荐阅读