mysql 存储过程递归_MySQL用存储过程实现递归查询(二)

I have only recently started working heavily

with stored procedures and functions in MySQL. After years in the

Oracle world with advanced stored procedures, functions and packages,

I’ve had to come to grips with the shortcomings of MySQL. One of those

is recursive functions. MySQL allows recursive stored procedures, but

not recursive stored functions. Here is my workaround…

First create your main logic as a stored procedure with an OUT variable:

DELIMITER |

CREATE PROCEDURE my_recursive_proc(a_some_parameter INTEGER, OUT a_result INTEGER)

BEGIN

DECLARE v_my_number INTEGER DEFAULT 0;

-- Have to set max_sp_recursion_depth inside the stored procedure

SET max_sp_recursion_depth := 20;

SET v_my_number := v_my_number + a_some_parameter;

IF v_my_number < 100 THEN

CALL my_recursive_proc(10, v_my_number);

END IF;

SET a_result := v_my_number;

END |

DELIMITER ;

So now I have a recursive procedure that calls itself adding 10 to

the initial number until we get to 100. In the real world we'd be doing

something serious like descending through related child records until we

find some search result. What I really want now is a function I can

call in a WHERE clause somewhere.

Here's all we have to do:

CREATE FUNCTION my_recursive_func(a_some_parameter INTEGER)

RETURNS INTEGER

BEGIN

DECLARE v_result INTEGER DEFAULT 0;

CALL my_recursive_proc(a_some_parameter, v_result);

RETURN v_result;

END |

DELIMITER ;

Now in my SELECT statements I can do:

SELECT * FROM my_table WHERE my_recursive_func(some_column) = 100;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 存储过程是一种在 MySQL 数据库中存储并执行 SQL 语句的方法。MySQL 存储过程可以使用递归技术来处理一些需要对同一数据进行多次处理的问题,比如树形结构的遍历、图形结构的遍历等。下面是一个使用 MySQL 存储过程实现递归的示例: 首先,我们需要创建一个表,用于存储树形结构的数据。假设这个表名为 `tree`,包含如下字段: ``` id INT PRIMARY KEY, name VARCHAR(255), parent_id INT ``` 其中,`id` 是节点的唯一标识符,`name` 是节点的名称,`parent_id` 是节点的父节点标识符。如果一个节点没有父节点,则其 `parent_id` 为 NULL。 接下来,我们可以创建一个存储过程,用于从指定的节点开始遍历整个树形结构。这个存储过程包含两个参数:起始节点的 `id` 和当前节点的深度。 ``` CREATE PROCEDURE traverse_tree (IN start_id INT, IN depth INT) BEGIN DECLARE done INT DEFAULT FALSE; DECLARE cur_id INT; DECLARE cur_depth INT; -- 创建一个游标,查询当前节点的所有子节点 DECLARE cur CURSOR FOR SELECT id FROM tree WHERE parent_id = start_id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 遍历所有子节点 OPEN cur; read_loop: LOOP FETCH cur INTO cur_id; IF done THEN LEAVE read_loop; END IF; -- 处理当前节点 SET cur_depth = depth + 1; SELECT CONCAT(REPEAT(' ', depth), name) FROM tree WHERE id = cur_id; -- 递归处理当前节点的子节点 CALL traverse_tree(cur_id, cur_depth); END LOOP; CLOSE cur; END; ``` 这个存储过程使用游标查询当前节点的所有子节点,并递归调用自己处理子节点。它还使用了一个 `depth` 参数,用于记录当前节点的深度,以便输出时缩进一定的空格。 我们可以调用这个存储过程,从指定的节点开始遍历树形结构。 ``` CALL traverse_tree(1, 0); ``` 其中,`1` 是起始节点的 `id`,`0` 是起始节点的深度(根节点的深度为 0)。这个存储过程将会输出整个树形结构的层次结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值