关于一个简单的mysql存储过程实例

这是一个根据传过来的一个pid  int类型的值来查询别的表的数据然后进行添加操作


CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`(in pid int)
BEGIN
#定义一个INT类型的memberId 
DECLARE memberId INT(11);

#定义一个DECIMAL类型的xpice
DECLARE xprice DECIMAL(10);

#定义一个DECIMAL类型的xs_pice
DECLARE xs_price	DECIMAL(10);

#定义一个DECIMAL类型的xss_pice
DECLARE xss_price	DECIMAL(10);

#将传过来的pid赋值给memberId
SET memberId=pid;

#显示一下(作为校验)
SELECT memberId;

#修改一张表的数据
UPDATE zyx_price_d_free SET num=num-1,end_date=DATE_FORMAT(NOW(),'%Y-%m-%d') WHERE member_id=memberId;

#查询出一张表的数据将查到的列赋值给xprice 这里的赋值只能是查到的结果集为一条
#多个列的情况使用,号隔开max(status), avg(status) into max, avg
SELECT price INTO xprice FROM zyx_price_d_free WHERE member_id=memberId;

#显示一下(作为校验)
SELECT xprice;

#查询出一张表的数据将查到的列赋值给xs_price 
SELECT mem.s_price INTO xs_price FROM (SELECT member_id,s_price FROM zyx_price_d_info WHERE member_id=memberId ORDER BY id DESC) mem GROUP BY mem.member_id; 

#做一个计算求和
SET xss_price=xprice;

#判断是否为空
IF (xs_price is not null) THEN
   SET xss_price=xs_price+xss_price;
END IF;

#插入一条数据
INSERT INTO zyx_price_d_info VALUE(NULL,1,memberId,'每日返回电子积分2%',1,xss_price,xprice,41,NULL,DATE_FORMAT(NOW(),'%Y-%m-%d'),DATE_FORMAT(NOW(),'%Y-%m-%d %T'),0);

END;

这个存储过程是在mysql数据库中添加的,添加的为函数存储过程,下面是截图


下面是一个存储过程加游标的案例,根据查询出来的id的结果集进行循环然后操作


BEGIN
	 #定义一个INT类型的memberId 
   DECLARE memberId INT(11);
	 
	 #定义一个DECIMAL类型的xpice
	 DECLARE xprice DECIMAL(10);

	 #定义一个DECIMAL类型的xs_pice
	 DECLARE xs_price	DECIMAL(10);

	 #定义一个查询结果集的游标,这里只查了一个列
   DECLARE NUMBER_XS CURSOR FOR
     SELECT member_id FROM zyx_price_d_free WHERE adddate!=DATE_FORMAT(NOW(),'%Y-%m-%d');

	 #设置 循环使用 变量 memberId < 0 跳出循环
	 DECLARE CONTINUE HANDLER FOR NOT FOUND SET memberId=0;

	 #打开游标
   OPEN NUMBER_XS;

	 #游标向下走一步---赋值
   FETCH NUMBER_XS INTO memberId;

	 #进行while并设置循环条件
   WHILE (memberId > 0) DO

			#参考上一个存储过程
			UPDATE zyx_price_d_free SET num=num-1,end_date=DATE_FORMAT(NOW(),'%Y-%m-%d') WHERE member_id=memberId;

			SELECT price INTO xprice FROM zyx_price_d_free WHERE member_id=memberId;

			SELECT xprice;

			SELECT mem.s_price INTO xs_price FROM (SELECT member_id,s_price FROM zyx_price_d_info WHERE member_id=memberId ORDER BY id DESC) mem GROUP BY mem.member_id; 

			SET xs_price=xs_price+xprice;

			INSERT INTO zyx_price_d_info VALUE(NULL,1,memberId,'每日返回电子积分2%',1,xs_price,xprice,41,NULL,DATE_FORMAT(NOW(),'%Y-%m-%d'),DATE_FORMAT(NOW(),'%Y-%m-%d %T'),0);

			#游标向下走一步---赋值
			FETCH NUMBER_XS INTO memberId;
	 
	 #结束本次循环
   END WHILE;

	 #关闭游标
   CLOSE NUMBER_XS;

END


根据传过来的表名做为条件去查询tname代表表名

需要用到字符类型的插入或者修改时加上""即可,如下图

BEGIN

DECLARE memberId INT(11);

DECLARE  xzprice FLOAT;

DECLARE  sprice FLOAT;

DECLARE tname VARCHAR(255);

SET memberId = member;

SET tname=tablename;

SET sprice=price;

SET @sjprice=0;

#SELECT type,memberId,remark,title,sprice,tname;

SET @SqlCmd = CONCAT('SELECT  s_price into @sjprice  FROM ' ,tname,' WHERE member_id=',memberId,' AND del=0 ORDER BY addtime DESC LIMIT 0,1');  

PREPARE stmt from @SqlCmd;

EXECUTE stmt;

#SELECT @SqlCmd;
#SELECT @sjprice;

SET xzprice=@sjprice;

IF(xzprice IS NOT NULL) THEN
	IF(type=10) THEN
		SET sprice=xzprice+sprice;
	END IF;
	IF(type=7) THEN
		SET sprice=xzprice-sprice;
	END IF;
END IF;

SET @Sqlins = CONCAT('INSERT INTO ' ,tname,'(type,member_id,title,remark,s_price,price,admin_id,adddate,addtime,del) VALUE(',type,',',memberId,',"',title,'",',remark,',',sprice,',',price,',',adminId,',"',CURDATE(),'","',NOW(),'",',0,')');  

#SELECT @Sqlins;

PREPARE inssql from @Sqlins;

EXECUTE inssql;

#INSERT INTO zyx_price_w_info(type,member_id,title,remark,s_price,price,admin_id,adddate,addtime,del) VALUE(type,memberId,title,remark,sprice,price,41,DATE_FORMAT(NOW(),'%Y-%m-%d'),DATE_FORMAT(NOW(),'%Y-%m-%d %T'),0);
END


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值