侧边栏壁纸
博主头像
LiaoDev's Blog 博主等级

行动起来,活在当下

  • 累计撰写 15 篇文章
  • 累计创建 0 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Oracle EBS 踩坑实录:采购申请自动转单 ORA-01403 报错的“隐藏”日期逻辑

luke
2026-06-16 / 0 评论 / 0 点赞 / 1 阅读 / 0 字

在 Oracle EBS 的采购自动转单业务中,ORA-01403: 未找到任何数据 是一个极其高频的报错。解决这个问题的难点并不在于看懂报错,而在于如何在海量数据中精准定位“究竟是哪一条数据、不满足哪一段标准逻辑”。

最近遇到一个非常经典的案例:同一个物料、同一类业务,后续新建的 PR(采购申请)都能成功转单,唯独某一张 PR 始终顽固报错。表面看是标准包 PO_INTERFACE_S.create_documents 抛出的异常,但经过抽丝剥茧,真正的根因却藏在协议来源字段日期校验分支的联动逻辑里。

一、 案发现场与初步排查

当并发程序 XXC1072DFM: 采购申请自动创建采购订单 执行失败时,查看日志通常会得到如下核心信息:

  • 正在处理:某个 BPA(一揽子采购协议)号。

  • 进度:PR 行已成功插入接口表。

  • 异常抛出创建一揽子发放订单出错,程序包 PO_INTERFACE_S 过程 create_documents 中出现错误 ORA-01403: 未找到任何数据 at location 100

  • 线索:日志中打印了 interface_header_id

面对这个报错,常规的怀疑方向通常是:接口表没数据?供应商不对?标准包 Bug?或者是协议失效了?

带着这些疑问,我们可以通过 SQL 结合日志里的请求号和参数(如 PR 单号)进行反查。

SQL

-- 查找并发请求基本信息与参数
SELECT r.request_id,
       p.user_concurrent_program_name,
       r.argument_text,
       r.actual_start_date,
       r.phase_code,
       r.status_code
  FROM fnd_concurrent_requests  r,
       fnd_concurrent_programs_vl p
 WHERE r.concurrent_program_id = p.concurrent_program_id
   AND r.program_application_id = p.application_id
   AND instr(nvl(r.argument_text, ' '), '你的PR单号') > 0
 ORDER BY r.request_id DESC;

关键发现:拿着日志里的 interface_header_id 去查 po_headers_interfacepo_lines_interface,发现接口表中并没有数据。这说明标准逻辑在执行中途发生了回滚。因此,排查重心必须前移,回到原始的业务数据上来。

二、 关键转折:异常与正常数据的正面交锋

排查疑难杂症,最有效的手段是控制变量法。我们提取了同物料、同组织下,报错 PR 与近期成功转单的 PR,进行关键字段的比对。

检查维度

报错的 PR

成功转单的 PR

结论

reqs_in_pool_flag

Y

N

报错 PR 仍在采购池中

line_location_id

空值

已有值

报错 PR 未生成对应发运行

blanket_po_header_id

空值

已有值

报错 PR 未带出来源协议

blanket_po_line_num

空值

已有值

报错 PR 未带出来源协议行

通过对比,现象昭然若揭:失败的 PR 根本没有成功寻源到目标协议行。 这个结论非常致命,因为后续标准包的判断逻辑,正是严格依赖于“PR 行是否已经来源到当前协议行”这一前置条件的。

三、 探究根因:标准包的“两副面孔”

进一步比对日期时,我们发现了一个令人困惑的现象:

无论是报错的 PR,还是后续成功的 PR,它们的“需求日期”都晚于“协议行到期日”。

既然大家都“过期”了,凭什么有的能成功,有的就报 01403?答案就藏在标准包 PO_INTERFACE_S 的内部逻辑中。它对日期的校验并不是一刀切的,而是根据寻源状态分流处理

场景 A:PR 行未寻源到当前协议(包含为空的情况)

  • 校验逻辑(严格):协议到期日 >= PR 需求日期

  • 结果:由于报错 PR 落在该分支,且其需求日期大于协议到期日,校验失败,无法匹配到有效行,最终抛出 ORA-01403

场景 B:PR 行已寻源到当前协议

  • 校验逻辑(宽松):协议到期日 >= 当前系统日期 (SYSDATE)

  • 结果:成功的 PR 虽然需求日期较晚,但已经明确了来源协议,走入了宽松分支。只要系统当前时间还没过协议到期日,就能成功转成 Release。

四、 实战排查 SOP 与总结

如果你在现场遇到类似的自动转单报错,建议不要一开始就深陷接口表代码中,可以遵循以下四步验证法:

  1. 看日志抓线索:提取 request_id、PR 编号以及 interface_header_id

  2. 查采购池状态:确认对应 PR 行的 reqs_in_pool_flag 是否仍为 Yline_location_id 是否为空。

  3. 确认寻源结果:检查 PR 行的 blanket_po_header_idblanket_po_line_num 是否已带出。如果为空,说明即将面临严格的日期校验。

  4. 复核时间节点:结合前面的寻源结果,对比 协议行到期日、PR 需求日期 与 系统当前日期,判断其倒在了哪一个校验分支上。

本次排查最大的价值,不在于单纯发现了一个“日期过期”的低级错误,而是理清了 EBS 底层的联动逻辑:PR 是否已寻源到当前协议,直接决定了系统是拿“需求日期”还是“系统日期”去作为校验标尺。

下次再遇到转单失败,别只顾着问“协议过期了吗?”,记得多问一句:“这条 PR,到底有没有真正匹配上那条协议行?”

0

评论区