使用 hibernate-ResultSet Return 调用 Oracle Procedure 只有第一行数据 remaing rows data missing
Calling Oracle Procedure using hibernate- ResultSet Return only first row data remaing rows data missing
当我从休眠状态调用存储过程时。结果集 returns 只有一行,但在数据库中 table 有四行数据。
这里我附上了 table 的详细信息和来自数据库的数据。
Table 姓名 : TBL_EMPLOYEES
**Procedure :**
create or replace PROCEDURE "SP_GET_EMPLOYEES" (
ecur OUT sys_refcursor)
AS
BEGIN
OPEN ecur FOR
SELECT *FROM TBL_EMPLOYEES;
END;
Java代码(在Hibernate中调用Oracle存储过程)
Session session = HibernateSessionManager.getSessionFactory()
.openSession();
session.beginTransaction();
try {
session.doWork(new Work() {
public void execute(Connection connection) {
CallableStatement call;
try {
String aProcedureName="SP_GET_EMPLOYEES";
String functionCall = "{call " + aProcedureName + "(?)}";
call = connection.prepareCall( functionCall );
call.registerOutParameter(1, OracleTypes.CURSOR );
call.execute();
ResultSet rs=(ResultSet) call.getObject(1);
if(rs.next()){
System.out.println(rs.getString(1));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// propagate this back to enclosing class
}
});
} catch (Exception e) {
e.printStackTrace();
} finally {
session.getTransaction().commit();
}
o/p:
苏里亚
请帮我解决这个问题。或任何其他从休眠状态到 oracle 存储过程的方法。
在此处更改您的代码:
旧:
if(rs.next()){
System.out.println(rs.getString(1));
}
新:
while(rs.next()){
System.out.println(rs.getString(1));
}
这是因为你没有做循环,所以你只是第一次检查条件。
您只能获得单条记录
使用
ResultSet rs = call.getResultSet();
while(rs.next())
{
sysout(rs.getString(1));
}
而您实际上只检索了一条记录。
感谢您提供代码。
我做了一些小改动,它工作正常。
程序脚本:
create or replace PROCEDURE GET_EMPLOYEES_1 (
ecur OUT sys_refcursor)
AS
BEGIN
OPEN ecur FOR
SELECT * FROM EMPLOYEE;
END;
休眠:
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
try {
session.doWork(new Work() {
public void execute(Connection connection) {
CallableStatement call;
try {
String aProcedureName = "GET_EMPLOYEES_1";
String functionCall = "{call " + aProcedureName + "(?)}";
call = connection.prepareCall(functionCall);
call.registerOutParameter(1, OracleTypesHelper.INSTANCE.getOracleCursorTypeSqlType());
call.execute();
ResultSet rs = (ResultSet) call.getObject(1);
if (rs.next()) {
logger.info("ID:" + rs.getString(1));
logger.info("status" + rs.getString(3));
logger.info("Location" + rs.getString(4));
logger.info("First name" + rs.getString(5));
logger.info("Last name" + rs.getString(6));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// propagate this back to enclosing class
}
});
} catch (Exception e) {
e.printStackTrace();
} finally {
session.getTransaction().commit();
}
当我从休眠状态调用存储过程时。结果集 returns 只有一行,但在数据库中 table 有四行数据。
这里我附上了 table 的详细信息和来自数据库的数据。
Table 姓名 : TBL_EMPLOYEES
**Procedure :**
create or replace PROCEDURE "SP_GET_EMPLOYEES" (
ecur OUT sys_refcursor)
AS
BEGIN
OPEN ecur FOR
SELECT *FROM TBL_EMPLOYEES;
END;
Java代码(在Hibernate中调用Oracle存储过程)
Session session = HibernateSessionManager.getSessionFactory()
.openSession();
session.beginTransaction();
try {
session.doWork(new Work() {
public void execute(Connection connection) {
CallableStatement call;
try {
String aProcedureName="SP_GET_EMPLOYEES";
String functionCall = "{call " + aProcedureName + "(?)}";
call = connection.prepareCall( functionCall );
call.registerOutParameter(1, OracleTypes.CURSOR );
call.execute();
ResultSet rs=(ResultSet) call.getObject(1);
if(rs.next()){
System.out.println(rs.getString(1));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// propagate this back to enclosing class
}
});
} catch (Exception e) {
e.printStackTrace();
} finally {
session.getTransaction().commit();
}
o/p: 苏里亚
请帮我解决这个问题。或任何其他从休眠状态到 oracle 存储过程的方法。
在此处更改您的代码:
旧:
if(rs.next()){
System.out.println(rs.getString(1));
}
新:
while(rs.next()){
System.out.println(rs.getString(1));
}
这是因为你没有做循环,所以你只是第一次检查条件。
您只能获得单条记录
使用
ResultSet rs = call.getResultSet();
while(rs.next())
{
sysout(rs.getString(1));
}
而您实际上只检索了一条记录。
感谢您提供代码。
我做了一些小改动,它工作正常。
程序脚本:
create or replace PROCEDURE GET_EMPLOYEES_1 (
ecur OUT sys_refcursor)
AS
BEGIN
OPEN ecur FOR
SELECT * FROM EMPLOYEE;
END;
休眠:
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
try {
session.doWork(new Work() {
public void execute(Connection connection) {
CallableStatement call;
try {
String aProcedureName = "GET_EMPLOYEES_1";
String functionCall = "{call " + aProcedureName + "(?)}";
call = connection.prepareCall(functionCall);
call.registerOutParameter(1, OracleTypesHelper.INSTANCE.getOracleCursorTypeSqlType());
call.execute();
ResultSet rs = (ResultSet) call.getObject(1);
if (rs.next()) {
logger.info("ID:" + rs.getString(1));
logger.info("status" + rs.getString(3));
logger.info("Location" + rs.getString(4));
logger.info("First name" + rs.getString(5));
logger.info("Last name" + rs.getString(6));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// propagate this back to enclosing class
}
});
} catch (Exception e) {
e.printStackTrace();
} finally {
session.getTransaction().commit();
}