我有一个测试类,它扩展了AbstractTransactionalJUnit4SpringContextTests并使用Transactions进行集成测试。其中一个测试方法使用Hibernate从Oracle数据库调用存储过程,使用命名查询。
存储过程更新其中一行中的列的值(默认情况下,STATUS为" 0"),然后提交,然后返回相同的更新值:
create or replace PROCEDURE TEST_PROCEDURE(
p_cursor OUT SYS_REFCURSOR,
p_id IN NUMBER)
AS
BEGIN
UPDATE TABLE_SMPL
SET STATUS = '1'
WHERE REQUEST_ID IN
(SELECT TESTVAR.REQUEST_ID
FROM
(SELECT REQUEST_ID
FROM TABLE_SMPL
WHERE ID = p_id ) TESTVAR);
commit;
OPEN p_cursor FOR
SELECT REQUEST_ID
FROM TABLE_SMPL
WHERE ID = p_id AND STATUS = '1';
END TEST_PROCEDURE;
测试失败。调试我看到调用了存储过程,并更新了数据库中的值。但是Store Procedure的返回值是没有更新值的行(返回的行有STATUS = 0)。
如果我在SQL Developer中调用此存储过程,它可以正常工作。它会更新值,并返回正确的更新行。
如果我在方法中使用Hibernate语句而不是存储过程,它也可以正常工作。
为什么存储过程没有在我的Java方法中返回正确的值?
谢谢和问候。
修改
我觉得有一点奇怪的是,我在调试时得到的结果与运行测试时的结果不同:运行它通常会返回0结果,但在调试模式下它返回一个结果,并带有未更新的值。
修改2
没关系,在正常运行和调试模式下导致结果的差异是因为我在SELECT中引入了另一个失败的条件。