mysql 存过过程 递归查询

递归查询

-- 是否包含该函数 
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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值