循环调用问题

【 使用环境 】linux centos 7
【 OB or 其他组件 】OceanBase
【 使用版本 】5.7.25-OceanBase_CE-v4.2.4.0
【问题描述】
运行SQL:
UPDATE sys_dept a
INNER JOIN (SELECT dept_id, GET_ANCESTORS(dept_id) ancestors FROM sys_dept) b ON a.dept_id=b.dept_id
SET a.ancestors=b.ancestors;
其中自定义GET_ANCESTORS()函数涉及到查询sys_dept表中字段具体如下:
CREATE DEFINER=root@% FUNCTION GET_ANCESTORS(DEPTID VARCHAR(64)) RETURNS varchar(200) CHARSET utf8
BEGIN
SET @now_dept_id = DEPTID;
SET @result = ‘’;
REPEAT
SET @result = CONCAT(@now_dept_id, ‘,’, @result);
SELECT parent_id INTO @now_dept_id FROM sys_dept WHERE dept_id = @now_dept_id;
UNTIL @now_dept_id=0 END REPEAT;
SET @result = SUBSTR(@result,1,LENGTH(@result)-1);
RETURN @result;
END
执行SQL过程中发生了循环调用异常:1442 - Can’t update table ‘sys_dept’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
此语句在mysql5.7.18中完美运行.
经分析,此语句update和自定义函数中查询的表为同一个表,但update列和自定义函数查询的列非同一列,因此怀疑是OB的循环调用限制级别只做到了表级别,未做到列级别,导致非同列同时操作查询时导致报此异常
请技术老师查看此问题,如有必要请对OB进行优化开发

1 个赞

你可以看看ob的函数怎么创建 有些地方和mysql不太一样

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001053177

你好 这个问题 已经解决了么