【问题标题】:Calling stored procedure using hibernate使用休眠调用存储过程
【发布时间】:2018-06-18 06:47:50
【问题描述】:

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

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 错误 [org.hibernate.engine.jdbc.spi.SqlExceptionHelper](默认任务 3)ORA-00900:无效 SQL 语句

并且异常状态为“无法提取结果集”。

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

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

问候, 阿尼尔班。

【问题讨论】:

    标签: java oracle hibernate stored-procedures


    【解决方案1】:

    根据休眠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();
    

    【讨论】:

    • 但是如何将游标传递给存储过程?
    • 按照您的建议实施后出现以下错误,方言 [org.hibernate.dialect.OracleDialect] not known to support REF_CURSOR parameters
    • 你的休眠版本是什么?
    • 我使用的是 Hibernate 4.3.11.Final。
    • 你的输出参数不应该是SYS_REFCURSOR而不是STATUSCURSOR吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2014-08-08
    • 1970-01-01
    • 2014-03-02
    • 2012-12-06
    • 2015-10-14
    相关资源
    最近更新 更多