基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
Oracle 模式 TO_NUMBER() 执行报错 ORA-01722
更新时间:2026-05-18 09:11
适用版本
OceanBase 数据库 V2.x、V3.x 版本。
问题现象
当 SQL 中包含 TO_NUMBER(column) 且 column 中包含非数字字符串,即使这些非数字字符串的行并不会出现在结果集中,OceanBase 数据库依然会报 invalid number 错误。而在 Oracle 数据库中,则不会报错。
示例如下。
CREATE TABLE "COM" ( "ID" NUMBER, "ST" VARCHAR2(120) DEFAULT NULL );
insert into "COM"("ID","ST") values(11,'222');
insert into "COM"("ID","ST") values(22,'eee');
OceanBase 数据库 V3.2.4 下的执行结果如下。
obclient [TEST]> select (SELECT TO_NUMBER(a.st) FROM dual where rownum = 0) as aaa,11 from com a where a.id=11;
+------+------+
| AAA | 11 |
+------+------+
| NULL | 11 |
+------+------+
1 row in set (0.006 sec)
obclient [TEST]> select (SELECT TO_NUMBER(a.st) FROM dual where rownum = 0) as aaa,22 from com a where a.id=22;
ORA-01722: invalid number
OceanBase 数据库 V4.2.1 下的执行结果如下。
obclient [TEST]> select (SELECT TO_NUMBER(a.st) FROM dual where rownum = 0) as aaa,11 from com a where a.id=11;
+------+------+
| AAA | 11 |
+------+------+
| NULL | 11 |
+------+------+
1 row in set (0.006 sec)
obclient [TEST]> select (SELECT TO_NUMBER(a.st) FROM dual where rownum = 0) as aaa,22 from com a where a.id=22;
+------+------+
| AAA | 22 |
+------+------+
| NULL | 22 |
+------+------+
1 row in set (0.006 sec)
问题原因
OceanBase 数据库 V2.x 和 V3.x 版本会最大化抽取 EXEC_PARAM,TO_NUMBER('eee') 不满足函数要求,因此报错。而 Oracle 数据库以及 OceanBase 数据库 V4.x 版本均最小化抽取 EXEC_PARAM,且包含恒 false 条件的子查询会被改写为 Null,因此不会报错。
解决方法
在 OceanBase 数据库 V2.x、V3.x 版本中,可以通过修改 SQL,将 TO_NUMBER 从子查询中移动到主查询的方式来绕过该问题。
obclient [TEST]> select TO_NUMBER((select a.st from dual where rownum=0)) as aaa,22 from com a where a.id=22;
+------+------+
| AAA | 22 |
+------+------+
| NULL | 22 |
+------+------+
1 row in set (0.004 sec)