调用Oracle EBS存储过程失败:对象版本号错误
调用Oracle EBS存储过程更新per_all_assignments_f时,硬编码Object Version Number仍报ORA-20001错误
我尝试调用存储过程更新Oracle EBS的per_all_assignments_f表,这段代码在SQL Developer中执行正常,但在Eclipse中运行时,即使硬编码了Object Version Number,还是报错。
代码片段
Statement stmt = connection.prepareStatement(selectQuery); stmt.setInt(1, personId); rs = stmt.executeQuery(); rs.next(); int objectVersionNumber = rs.getInt(1); int asgId = rs.getInt(2); rs.close(); stmt.close(); log.error("objectVersionNumber from the assignment table: " + objectVersionNumber); String thirdProcCall = "{call hr_assignment_api.update_emp_asg_criteria(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}"; CallableStatement thirdStmt = connection.prepareCall(thirdProcCall); int pId = asgId; int onum = 1; String jId = getAttributeRequestValue(account,"JOB_ID"); int jobId = Integer.parseInt(jId); String pgId = getAttributeRequestValue(account,"PEOPLE_GROUP_ID"); int peopleGroupId = Integer.parseInt(pgId); thirdStmt.setString(1, getAttributeRequestValue(account,"EFFECTIVE_START_DATE")); thirdStmt.setString(2, "CORRECTION"); thirdStmt.setInt(3, pId); thirdStmt.setInt(4, onum); thirdStmt.setInt(5, jobId); thirdStmt.setInt(6, peopleGroupId); thirdStmt.registerOutParameter(7, java.sql.Types.INTEGER); thirdStmt.registerOutParameter(8, java.sql.Types.VARCHAR); thirdStmt.registerOutParameter(9, java.sql.Types.DATE); thirdStmt.registerOutParameter(10, java.sql.Types.DATE); thirdStmt.registerOutParameter(11, java.sql.Types.BOOLEAN); thirdStmt.registerOutParameter(12, java.sql.Types.BOOLEAN); thirdStmt.registerOutParameter(13, java.sql.Types.BOOLEAN); thirdStmt.registerOutParameter(14, java.sql.Types.VARCHAR); thirdStmt.registerOutParameter(15, java.sql.Types.BOOLEAN); thirdStmt.execute(); connection.commit();
错误信息
java.sql.SQLException: ORA-20001: HR对象无效 原因:尝试锁定的HR对象与HR Schema中的对应对象不一致。 操作:使用正确的对象版本号重试操作。 ORA-06512: 在"APPS.HR_ASSIGNMENT_API", line 17464 ORA-06512: 在"APPS.HR_UTILITY", line 949 ORA-06512: 在"APPS.PER_ASG_SHD", line 220 ORA-06512: 在"APPS.HR_ASSIGNMENT_API", line 16388 ORA-06512: 在"APPS.HR_ASSIGNMENT_API", line 15757 ORA-06512: 在"APPS.HR_ASSIGNMENT_API", line 15542 ORA-06512: 在"APPS.SP_HR_ASSIGNMENT_API", line 22 ORA-06512: 在line 1
解决建议
- 保证事务原子性:查询
object_version_number和调用存储过程必须在同一个事务中执行,避免中间有其他会话修改目标记录。不要在查询后关闭连接或提交事务,直到存储过程执行完成。 - 修正硬编码的版本号:你当前硬编码了
onum=1,但实际查询到的版本号可能不是这个值,应该直接使用查询得到的objectVersionNumber,而不是硬编码:thirdStmt.setInt(4, objectVersionNumber); - 优化日期参数传递:不要用字符串传递日期参数,将
EFFECTIVE_START_DATE转换为java.sql.Date类型后用setDate方法传入,避免格式不匹配导致的API验证失败。 - 查询时锁定记录:在查询版本号的SQL中添加
FOR UPDATE子句,锁定目标记录,防止并发修改:SELECT object_version_number, assignment_id FROM per_all_assignments_f WHERE person_id = ? FOR UPDATE - 核对API参数顺序:仔细核对
hr_assignment_api.update_emp_asg_criteria的官方参数文档,确保你设置的参数顺序、类型完全匹配,参数顺序错误是EBS API调用失败的常见原因。 - 统一执行环境:确认Eclipse中使用的数据库连接用户、EBS职责配置和SQL Developer完全一致,不同的环境配置可能导致API执行逻辑差异。
内容的提问来源于stack exchange,提问作者Chandra Mohan
相关产品推荐
相关产品推荐

