You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:29:53