簡體   English   中英

從具有多個引用游標的 Hibernate 調用存儲過程

[英]call a Stored Procedure from Hibernate having multiple ref cursor

我正在嘗試從存儲過程中檢索值。 這個存儲過程有兩個引用游標。 下面是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 )的p_sal_refcur IN OUT SYS_REFCURSOR

任何幫助,將不勝感激。

提前致謝

好像還是沒辦法。 但是,這是通過從 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);
            }
        }
    }
});

已經向 Hibernate 團隊提出的問題:

https://hibernate.atlassian.net/browse/HHH-12596

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM