mysql 存过过程 递归查询

it2025-01-26  32

递归查询

-- 是否包含该函数 DROP FUNCTION IF EXISTS queryChildrenAreaInfo; DELIMITER ;; -- 申明函数 CREATE FUNCTION easybuy_product_category(areaId INT) RETURNS VARCHAR(4000) -- 开始函数 BEGIN DECLARE sTemp VARCHAR(4000); -- 申明变量 大小 DECLARE sTempChd VARCHAR(4000); -- 申明变量 大小 SET sTemp='$'; -- 变量赋值 SET sTempChd = CAST(areaId AS CHAR); -- 变量赋值 cast转换类型 WHILE (sTempChd IS NOT NULL) DO -- 拼接参数 SET sTemp= CONCAT(sTemp,',',sTempChd); -- 将查询的结果集 GROUP_CONCAT(id) 输入给 sTempChd SELECT GROUP_CONCAT(id) INTO sTempChd FROM easybuy_product_category WHERE FIND_IN_SET(parentId,sTempChd)>0; END WHILE; RETURN sTemp; END ;; DELIMITER ; -- 调用函数 SELECT * FROM easybuy_product_category WHERE FIND_IN_SET(parentId,easybuy_product_category(548))

什么是存储过程?

存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。

存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

优点

存储过程可封装,并隐藏复杂的商业逻辑。存储过程可以回传值,并可以接受参数。存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。存储过程可以用在数据检验,强制实行商业逻辑等。

缺点

存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。存储过程的性能调校与撰写,受限于各种数据库系统。

SQL

-- 是否有该储存过程 , 是则删除 DROP PROCEDURE IF EXISTS proc_order_off; DELIMITER ;; -- 创建存储过程 CREATE PROCEDURE proc_order_off(IN off INT) BEGIN DECLARE orderID INT(11); DECLARE orderPic DECIMAL(10,2); DECLARE no_more_order INT(1); -- 查询所有表数据 放入 游标 -- 游标:用来存储查询数据的对象 (类似于java中的集合) -- 申明一个游标 DECLARE allOrders CURSOR FOR SELECT id,totalPrice FROM smbms_bill; -- 申明 DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_order = 1; SET no_more_order = 0; -- 打开游标 OPEN allOrders; REPEAT -- 开启循环 FETCH allOrders INTO orderID,orderPic; -- 逻辑验证 IF (orderID%2 = 0) THEN UPDATE smbms_bill SET totalPrice = totalPrice+500 WHERE id%2 = 0; END IF; UNTIL no_more_order END REPEAT; -- 结束循环 END; CALL proc_order_off(0);
最新回复(0)