简体   繁体   English

使用休眠调用存储过程

[英]Calling stored procedure using hibernate

I have a stored procedure defined in a package. 我在包中定义了一个存储过程。 The procedure accepts two parameters, one is a cursor: 该过程接受两个参数,一个是游标:

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

I am calling the procedure like this: 我正在这样调用程序:

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

It is returning the following error: 它返回以下错误:

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

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

And the exception states "Could not extract resultSet". 并且异常状态为“无法提取resultSet”。

I have tried to execute the procedure in SQL Developer but it failed. 我试图在SQL Developer中执行该过程,但是失败了。 It seems the problem is I am executing the procedure with only one parameter but it also has an IN OUT parameter. 似乎问题是我仅使用一个参数来执行过程,但是它也具有IN OUT参数。

Please help how can I invoke this procedure. 请帮助我如何调用此过程。

Regards, Anirban. 问候,阿尼班。

As per hibernate documentation , correct way to call a stored procedure is - 根据休眠文档 ,调用存储过程的正确方法是-

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");

For executing Oracle stored procedure with cursor refer following example - 要使用游标执行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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM