java - 从具有多个引用光标的 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
) 的输出。
任何帮助,将不胜感激。
提前致谢
解决方案
看来还是不行。但是,这是通过从 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);
}
}
}
});
推荐阅读
- sql - 满足条件时的 SQL Express concat
- javascript - Cordova 应用签署 apk 后需要 CORS
- symfony - 坚持使用 onFlush Symfony
- android-studio - 在 android studio 中跟踪位置 (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
- c# - 找不到与配置中未设置的版本匹配的程序集告诉它存在不同的版本
- sql - 选择过去 10 天的数据
- node.js - 在 npm 中将工件上传到 nexus
- html - 怎么做
将像这样在页面顶部附近 - java - 如何从我从 JavaClass 创建的 EditText 中获取文本
- javascript - 使用 ajax 从弹出窗口发布时,输入值始终为空