使用hibernate调用存储过程

时间:2018-01-09 09:12:14

标签: java oracle hibernate stored-procedures

我在包中定义了一个存储过程。该过程接受两个参数,一个是游标:

create or replace PACKAGE TESTPACKAGE IS
TYPE STATUSCURSOR IS REF CURSOR;
PROCEDURE TestProcedure(cId IN VARCHAR2,
StatusCursonVal IN OUT STATUSCURSOR);
END;

我正在调用这样的程序:

String sql = "EXEC TESTPACKAGE.TestProcedure('testId')";
Query query = session.createSQLQuery(sql);
        List list = query.list();

返回以下错误:

13:03:25,338 INFO [stdout](默认任务-3)休眠:EXEC TESTPACKAGE .TestProcedure('testId')

13:03:25,749 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper](默认任务-3)SQL错误:900,SQLState:42000 13:03:25,750 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper](默认任务-3)ORA-00900:无效的SQL语句

异常说明“无法提取结果集”。

我曾尝试在SQL Developer中执行该过程,但失败了。似乎问题是我只使用一个参数执行该过程,但它也有一个IN OUT参数。

请帮助我如何调用此程序。

此致 Anirban。

1 个答案:

答案 0 :(得分:0)

根据hibernate documentation,调用存储过程的正确方法是 -

StoredProcedureQuery query = entityManager.createStoredProcedureQuery( "sp_count_phones");
query.registerStoredProcedureParameter( "personId", Long.class, ParameterMode.IN);
query.registerStoredProcedureParameter( "phoneCount", Long.class, ParameterMode.OUT);

query.setParameter("personId", 1L);

query.execute();
Long phoneCount = (Long) query.getOutputParameterValue("phoneCount");

对于使用游标执行Oracle存储过程,请参阅以下示例 -

StoredProcedureQuery query = entityManager.createStoredProcedureQuery( "sp_person_phones" );
query.registerStoredProcedureParameter( 1, Long.class, ParameterMode.IN );
query.registerStoredProcedureParameter( 2, Class.class, ParameterMode.REF_CURSOR );
query.setParameter( 1, 1L );

query.execute();
List<Object[]> postComments = query.getResultList();