问题描述
OceanBase 数据库 Oracle 模式下 nchar 使用 to_number 函数报 Internal error。
复现场景如下。
创建表。
obclient > create table tzs (id int,realpayamt nchar(16)); ues(7,'362087.67 '); Query OK, 0 rows affected (0.031 sec)插入数据。
obclient [SYS]> insert into tzs values(7,'362087.67 '); Query OK, 1 row affected (0.013 sec)执行查询语句。
obclient > select to_number(NVL(REGEXP_REPLACE(realpayamt ,'[^0-9.]', ''),0)) from tzs where id=7;输出结果如下。
ErrorCode = 600, SQLState = HY000, Details = ORA-00600: internal error code, arguments: -4016, Internal error
适用版本
OceanBase 数据库 V2.x 和 V3.x 版本。
问题原因
新执行引擎下,表达式推进过程中重复加隐式 cast 导致报错。
临时解决方案
使用 cast 规避问题,查询语句如下。
obclient > select to_number(cast(NVL(REGEXP_REPLACE(realpayamt ,'[^0-9.]', ''),0) as varchar(64))) from tzs where id=7;输出结果如下。
+------------------------------------------------------------------------------+ | TO_NUMBER(CAST(NVL(REGEXP_REPLACE(REALPAYAMT,'[^0-9.]',''),0)ASVARCHAR(64))) | +------------------------------------------------------------------------------+ | 362087.67 | +------------------------------------------------------------------------------+ 1 row in set (0.003 sec)使用老引擎,执行如下命令。
obclient> ALTER SYSTEM SET _enable_static_typing_engine = false;注意
使用老引擎操作属于集群设置,风险偏高,若采用此方法请咨询 OceanBase 技术服务。