问题现象
OceanBase 数据库执行 PL 报错 ORA-20100: XXXXX:插入 TABLE123 失败! SQLCODE=-4374。
关键日志信息如下。
[2024-07-08 15:47:00.457505] WARN [SQL.ENG] convert_skip_null_check (ob_expr_column_conv.cpp:206) [799346][2328][xxxxx-xxxxx-xxxxx-xxxxx] [lt=50] [dc=0] failed to check accuracy(ret=-4374, accuracy={length:-1, precision:12, scale:2}, collation_type=63, res_obj={"DECIMAL":"14765610997.28"})
[2024-07-08 15:47:00.457554] WARN [SQL.ENG] validate_row (ob_table_modify.cpp:1362) [799346][2328][xxxxx-xxxxx-xxxxx-xxxxx] [lt=46] [dc=0] validate row failed(ret=-4374, column_conv_infos_.count()=82, res_type={meta:{type:"DECIMAL", collation:"binary", coercibility:"NUMERIC"}, accuracy:{length:-1, precision:12, scale:2}, flag:0, calc_type:{type:"NULL", collation:"invalid_type", coercibility:"INVALID"}}, i=19, calc_row.get_cell(i)={"DECIMAL":"14765610997.28"}, calc_row.get_count()=82)
[2024-07-08 15:47:00.462171] WARN spi_raise_application_error (ob_spi.cpp:3575) [799346][2328][xxxxx-xxxxx-xxxxx-xxxxx] [lt=13] [dc=0] ORA-20100: COMPENSBT:插入TABLE123失败! SQLCODE=-4374
问题原因
由于 TABLE123 表中存在一个 precision 定义为 12 的列,当向该列插入数值 14765610997.28 时长度超限,导致 SQL 报错 -4374,即值的 precision 大于字段定义的 precision。
问题的风险及影响
业务脚本执行报错。
影响租户
影响 OceanBase 数据库中的 Oracle 租户,对于 SYS 租户和 MySQL 租户无影响。
适用版本
OceanBase 数据库所有版本。
解决方法及规避方式
解决方法:
调整字段定义 precision。
规避方式:
合理定义列的总最大有效位数。