关于一个简单的mysql存储过程实例
2017-05-31 12:19
846 查看
这是一个根据传过来的一个pid int类型的值来查询别的表的数据然后进行添加操作
下面是一个存储过程加游标的案例,根据查询出来的id的结果集进行循环然后操作
根据传过来的表名做为条件去查询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
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
相关文章推荐
- 存储过程的一个简单实例
- mysql存储过程的一个完整实例
- 关于mysql中设置隔一段事件调用一个存储过程的事件
- 关于MySQL存储过程中遇到的一个错误
- 一个简单例子讲明mysql存储过程是什么
- SpringMVC4+thymeleaf3的一个简单实例(篇五:页面和MySql的数据交互-展示以及存储)
- sql plus创建一个简单的存储过程实例
- SpringMVC4+thymeleaf3的一个简单实例(篇五:页面和MySql的数据交互-展示以及存储)
- mysql 存储过程一个简单的循环遍历操作数据
- MySql存储过程简单实例
- 关于存储过程中一个参数表示多个查询条件使用方法的简单处理
- mysql存储过程之一个简单的存储过程
- 简单的存储过程实例2--对比三个表中的数据,将三个表中金额挑选一个最优值
- 一个简单的mysql存储过程的例子
- MYSQL的存储过程、变量、函数及部分简单优化(非常有用,有存储过程+光标实例)
- SpringMVC4+thymeleaf3的一个简单实例(篇五:页面和MySql的数据交互-展示以及存储)
- MySql存储过程简单实例
- mysql存储过程简单实例 变量赋值 游标遍历
- MYSQL存储过程的一个完整实例
- 一个简单的MYSQL存储过程