首批通过分布式安全可靠测评,为关键业务系统打造
Decode 函数中包含 UDF 时报 ORA-01476: divisor is equal to zero
更新时间:2026-05-29 08:46
问题现象
同样逻辑的语句,当不涉及 udf (用户自定义函数)时,结果正常,但涉及 udf 时,报错如下。
ORA-01476: divisor is equal to zero
重现问题的示例如下。
创建测试表。
obclient > CREATE TABLE TEST_DECODE_TAB ( "ID" NUMBER(12) NOT NULL, "NUMA" NUMBER(5,2), "NUMB" NUMBER(5,2), CONSTRAINT "PK_TEST_DECODE_TAB" PRIMARY KEY ("ID")); Query OK, 0 rows affected (0.524 sec)插入测试数据。
obclient > insert into TEST_DECODE_TAB values(1,0,0); Query OK, 1 row affected (0.135 sec)提交插入数据。
obclient > commit; Query OK, 0 rows affected (0.009 sec)自定义函数。
obclient > create or replace function abs_again (i_num number) return number is o_num number; begin o_num:=abs(o_num); return o_num; end; / Query OK, 0 rows affected (0.174 sec)正常执行的语句。
obclient > select id,numa,numb,nvl(decode(abs(NUMB),0,0,NUMA/NUMB),0) val from TEST_DECODE_TAB ;输出结果如下。
+----+------+------+-----+ | ID | NUMA | NUMB | VAL | +----+------+------+-----+ | 1 | 0 | 0 | 0 | +----+------+------+-----+ 1 row in set (0.033 sec)obclient > select id,numa,numb,nvl(decode(NUMB,0,0,NUMA/NUMB),0) val from TEST_DECODE_TAB;输出结果如下。
+----+------+------+-----+ | ID | NUMA | NUMB | VAL | +----+------+------+-----+ | 1 | 0 | 0 | 0 | +----+------+------+-----+ 1 row in set (0.024 sec)执行报错的语句。
obclient > select id,numa,numb,nvl(decode(abs_again(NUMB),0,0,NUMA/NUMB),0) val from TEST_DECODE_TAB; ORA-01476: divisor is equal to zero
问题原因
OceanBase 数据库表达式含udf的时候,即使不需要计算除以 0,计算的时候不能忽略除以 0 的错误,因此报错。
适用版本
OceanBase 数据库 V3.x 版本。
解决方法
仅能通过修改业务逻辑,例如改用 case when 解决。