注册
达梦适配jpa调用存储过程返回游标异常问题排查解决
技术分享/ 文章详情 /

达梦适配jpa调用存储过程返回游标异常问题排查解决

意志 2022/09/26 1898 0 0

原代码如下:
@Test
public void dm_cursor_test() throws Exception {

    StoredProcedureQuery query = entityManager
            .createStoredProcedureQuery("PAC_DM_TEST.DM_LIST");
   // query.registerStoredProcedureParameter(1, DmdbType.class, ParameterMode.REF_CURSOR);
    query.registerStoredProcedureParameter(1, Void.class, ParameterMode.REF_CURSOR);

    query.execute();
    //query.executeUpdate();

    List resultList = query.getResultList();
    log.info("resultList == {}", resultList);
}

执行报错:java.lang.IllegalStateException: Session/EntityManager is closed;
经过查阅资料发现,当createquery之后,只能执行一次查询,如果在执行第二次查询后需要重新createquery。
把代码修改为如下:
@Test
public void dm_cursor_test() throws Exception {

    StoredProcedureQuery query = entityManager
            .createStoredProcedureQuery("PAC_DM_TEST.DM_LIST");
   // query.registerStoredProcedureParameter(1, DmdbType.class, ParameterMode.REF_CURSOR);
    query.registerStoredProcedureParameter(1, Void.class, ParameterMode.REF_CURSOR);

    //query.execute();
    //query.executeUpdate();

    List resultList = query.getResultList();
    log.info("resultList == {}", resultList);
}

直接注释代码query.execute();解决该问题,因为调用存储过程返回游标时不需要执行query.execute();在调用普通存储过程时需要执行query.execute();这也是经过多番测试才发现的规律。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服