【发布时间】:2014-03-17 18:25:05
【问题描述】:
我正在处理一个包含 {FORALL .. SAVE EXCEPTIONS .. UPDATE} 语句的 PL/SQL 包。
数据(根据业务规则)的有效性通过表上的触发器来检查,该表包含将要更新的数据。此触发器调用一个能够生成错误的过程:
RAISE_APPLICATION_ERROR( -20002, 'message');
因此可能会在 {FORALL .. SAVE EXCEPTIONS .. UPDATE} DML 语句期间生成用户定义的错误。但是,当尝试使用 SQL%BULK_EXCEPTIONS 在异常处理中记录错误时,我观察到以下输出;
SQLCODE: ORA-24381
SQLERRM: ORA-24381: error(s) in array DML
SQL%BULK_EXCEPTIONS(i).ERROR_CODE: 20002
SQLERRM(-(SQL%BULK_EXCEPTIONS(i).ERROR_CODE)): ORA-20002:
请注意,来自 sql%bulk_exceptions 的 error_code 会丢失减号。除了错误代码之外,错误消息也是空的。
这里有两个问题:
- (用户定义的)错误消息不会通过 bulk_exceptions 返回。 (标准错误不是这种情况!例如:FORALL-UPDATE 是否会因为列大小限制而失败,来自 bulk_exceptions 的错误消息可能是:“ORA-12899: value too large for column ",并且不会为空。)
- 引发此异常时,会传递 SQLCODE+SQLERRM“ORA-24381: 数组 DML 中的错误”,而不是实际触发的(用户定义的,-20000)错误代码和消息。
是否可以将来自 RAISE_APPLICATION_ERROR 的消息与用户定义的错误代码联系起来,以便 SQLERRM 显示它?以及如何在不更改为 ORA-24381 错误的情况下传播此错误?
【问题讨论】: