为了账号安全,请及时绑定邮箱和手机立即绑定

从具有多个引用游标的 Hibernate 调用存储过程

从具有多个引用游标的 Hibernate 调用存储过程

千万里不及你 2021-09-15 16:56:57
我正在尝试从存储过程中检索值。这个存储过程有两个引用游标。下面是SP:create or replace PROCEDURE "EMP_JOB" (    p_job           VARCHAR2,    p_emp_refcur    IN OUT SYS_REFCURSOR,    p_sal_refcur    IN OUT SYS_REFCURSOR)ISBEGIN    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)的输出。任何帮助,将不胜感激。
查看完整描述

2 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

好像还是没办法。但是,这是通过从 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-09-15
  • 2 回答
  • 0 关注
  • 212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信