我在包中定义了一个存储过程。该过程接受两个参数,一个是游标:
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。
答案 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();