首批通过分布式安全可靠测评,为关键业务系统打造
Oracle 租户执行递归 CTE 报错:-4016,内部错误
更新时间:2026-05-26 09:46
问题描述
Oracle 租户执行递归 CTE 报错-4016:
ORA-00600: internal error code, arguments: -4016, Internal error
创建测试表。
obclient [SYS]> create table tb(id varchar(3) , pid varchar(3) , name varchar(10)); Query OK, 0 rows affected (0.030 sec)插入测试数据。
obclient [SYS]> insert into tb values('002' , 0 , '浙江省'); Query OK, 1 row affected (0.004 sec)obclient [SYS]> insert into tb values('001' , 0 , '广东省'); Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('003' , '002' , '衢州市'); Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('004' , '002' , '杭州市') ; Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('005' , '002' , '湖州市'); Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('006' , '002' , '嘉兴市') ; Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('007' , '002' , '宁波市'); Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('008' , '002' , '绍兴市') ; Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('009' , '002' , '台州市'); Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('010' , '002' , '温州市') ; ues('012' , '002' , '金华Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('011' , '002' , '丽水市'); Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('012' , '002' , '金华市') ; Query OK, 1 row affected (0.000 sec) ```shell obclient [SYS]> insert into tb values('013' , '002' , '舟山市'); Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('014' , '004' , '上城区') ; Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('015' , '004' , '下城区'); Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('016' , '004' , '拱墅区') ; Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('017' , '004' , '余杭区') ; Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('018' , '011' , '金东区') ; Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('019' , '001' , '广州市') ; Query OK, 1 row affected (0.000 sec)obclient [SYS]> insert into tb values('020' , '001' , '深圳市') ; Query OK, 1 row affected (0.000 sec)提交插入数据
obclient [SYS]> commit; Query OK, 0 rows affected (0.001 sec)执行递归 CTE 语句。
obclient [SYS]> with RECURSIVE cte as (select a.id,a.name,a.pid from tb a where id='002' union all select k.id,k.name,k.pid from tb k inner join cte c on c.id = k.pid)select id,name from cte order by id;
MySQL 租户正常支持递归 CTE:
执行如下 递归 CTE 语句。
obclient [mysql]> with RECURSIVE cte as ( select a.id,a.name,a.pid from tb a where id='002' union all select k.id,k.name,k.pid from tb k inner join cte c on c.id = k.pid )select id,name from cte order by id;输出结果如下:
+------+-----------+ | id | name | +------+-----------+ | 002 | 浙江省 | | 003 | 衢州市 | | 004 | 杭州市 | | 005 | 湖州市 | | 006 | 嘉兴市 | | 007 | 宁波市 | | 008 | 绍兴市 | | 009 | 台州市 | | 010 | 温州市 | | 011 | 丽水市 | | 012 | 金华市 | | 013 | 舟山市 | | 014 | 上城区 | | 015 | 下城区 | | 016 | 拱墅区 | | 017 | 余杭区 | | 018 | 金东区 | +------+-----------+ 17 rows in set (0.008 sec)
问题原因
OceanBase Oracle 租户不支持 WITH 递归语法。
适用版本
OceanBase 数据库 V2.x,V3.x 版本。
解决方法
Oracle 租户需要使用 CONNECT BY 语法修改,具体修改SQL 如下:
obclient [SYS]> select id,name from tb start with tb.id = '002' connect by prior tb.id = tb.pid order by id;
输出结果如下:
+------+-----------+
| ID | NAME |
+------+-----------+
| 002 | 浙江省 |
| 003 | 衢州市 |
| 004 | 杭州市 |
| 005 | 湖州市 |
| 006 | 嘉兴市 |
| 007 | 宁波市 |
| 008 | 绍兴市 |
| 009 | 台州市 |
| 010 | 温州市 |
| 011 | 丽水市 |
| 012 | 金华市 |
| 013 | 舟山市 |
| 014 | 上城区 |
| 015 | 下城区 |
| 016 | 拱墅区 |
| 017 | 余杭区 |
| 018 | 金东区 |
+------+-----------+
17 rows in set (0.003 sec)