`
canofy
  • 浏览: 829752 次
  • 性别: Icon_minigender_1
  • 来自: 北京、四川
社区版块
存档分类
最新评论

mysql存储过程总结

阅读更多
mysql存储过程的例子:
DELIMITER $$

DROP PROCEDURE IF EXISTS `cn_games`.`proc_pay_fill_rule`$$

CREATE DEFINER=`root`@`%` PROCEDURE `proc_pay_fill_rule`(IN strdate varchar(10))
BEGIN
declare done int;
DECLARE price float;
DECLARE cpid varchar(10);
DECLARE producttype varchar(10);
DECLARE startvalue bigint(20);
DECLARE endvalue bigint(20);
DECLARE cppercent float;
/*通用规则*/
DECLARE pay_rule_cursor cursor for SELECT cp_id,product_type, start_value,end_value,cp_percent from t_cp_percent 
WHERE EXTRACT(YEAR_MONTH from start_date)<=EXTRACT(YEAR_MONTH from strdate)
and EXTRACT(YEAR_MONTH from end_date)>=EXTRACT(YEAR_MONTH from strdate)
and cp_id='0' and product_type='';
/*特殊cp的支付规则*/
DECLARE special_pay_rule_cursor cursor for SELECT cp_id,product_type, start_value,end_value,cp_percent from t_cp_percent 
WHERE EXTRACT(YEAR_MONTH from start_date)<=EXTRACT(YEAR_MONTH from strdate)
and EXTRACT(YEAR_MONTH from end_date)>=EXTRACT(YEAR_MONTH from strdate)
and cp_id!='0';

/*特殊cp的productType(产品类型)支付规则*/
DECLARE special_pt_pay_rule_cursor cursor for SELECT cp_id,product_type, start_value,end_value,cp_percent from t_cp_percent 
WHERE EXTRACT(YEAR_MONTH from start_date)<=EXTRACT(YEAR_MONTH from strdate)
and EXTRACT(YEAR_MONTH from end_date)>=EXTRACT(YEAR_MONTH from strdate)
and cp_id!='0' and product_type!='';

declare continue handler for not found set done=1;

drop table if exists TMP_t_pay_month;

CREATE TEMPORARY TABLE `TMP_t_pay_month` (              
               `stat_date` varchar(15) default NULL,                         
               `cp_id` varchar(10) default NULL,                                
               `product_type` varchar(10) default NULL,                         
               `stat_num` varchar(20) default NULL, 
	       `stat_totle_fee` varchar(20) default NULL,
               `stat_finally_fee` varchar(20) default NULL,                             
               `cp_percent` float default NULL                                          
             ) type heap;



if strdate is not null THEN
	/*对第二次出帐进行限制*/
	if exists (select id from t_pay_month where left(stat_date,7)=left(strdate,7) limit 0,1) then
		select "1";
	else
		/*把数据导入到临时表中*/
		insert into TMP_t_pay_month (stat_date,cp_id,product_type,stat_num,stat_totle_fee,stat_finally_fee,cp_percent)
		select 	left(stat_date,7),cp_id,product_type,sum(orders),sum(income),0,0
		from t_cp_report
		group by  left(stat_date,7),cp_id,product_type;
		/*通用的支付规则开始循环*/
		set done=0;
		open pay_rule_cursor;
		loop1:loop	
		/*把值插入到变量中*/
		fetch pay_rule_cursor into cpid,producttype,startvalue,endvalue,cppercent;
		if done=1 then
			leave loop1;
		end if;
			/*更新临时表中的比值*/
			update TMP_t_pay_month set cp_percent=cppercent
			where stat_totle_fee>=startvalue and stat_totle_fee<endvalue;			
		end loop loop1;
		close pay_rule_cursor;

		/*特殊cp的支付规则开始循环*/
		set done=0;
		open special_pay_rule_cursor;
		loop2:loop
		fetch special_pay_rule_cursor into cpid,producttype,startvalue,endvalue,cppercent;
		if done=1 then
			leave loop2;
		end if;
			update TMP_t_pay_month set cp_percent=cppercent
			where stat_totle_fee>=startvalue and stat_totle_fee<endvalue
			and cp_id=cpid;
		end loop loop2;
		CLOSE special_pay_rule_cursor;
		
		/*特殊cp的产品的支付规则开始循环*/
		set done=0;
		open special_pt_pay_rule_cursor;
		loop3:loop
		fetch special_pt_pay_rule_cursor into cpid,producttype,startvalue,endvalue,cppercent;
		if done=1 then
			leave loop3;
		end if;
			update TMP_t_pay_month set cp_percent=cppercent
			where stat_totle_fee>=startvalue and stat_totle_fee<endvalue
			and cp_id=cpid and product_type=producttype;
		end loop loop3;
		CLOSE special_pt_pay_rule_cursor;
		
		/*更新临时表中的最终支付的字段的值*/
		update TMP_t_pay_month set stat_finally_fee=ROUND(stat_totle_fee*cp_percent);

		/*把数据由临时表插入到正式表中,目前因为测试把cp_percent字段的值为总金额*/
		insert into t_pay_month (stat_date,cp_id,product_type,stat_num, stat_fee,cp_percent, pass_status, pay_status, create_date)
		select stat_date,cp_id,product_type,stat_num,stat_finally_fee,cp_percent,0,0,now()
		from TMP_t_pay_month;
	end if;
end if;
    END$$

DELIMITER ;


一.创建存储过程
1.基本语法:
CREATE DEFINER=`root`@`%` PROCEDURE `proc_pay_fill_rule`(IN strdate varchar(10))
begin
.........
end
2.参数传递
`proc_pay_fill_rule`(IN strdate varchar(10))
strdate参数从调用的时候传入,例如:call proc_pay_fill_rule('2009-02-01')
二.调用存储过程
1.基本语法:call sp_name()
注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递
三.删除存储过程
1.基本语法:
drop procedure sp_name//
2.注意事项
(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
四.区块,条件,循环
1.区块定义,常用
begin
......
end;
也可以给区块起别名,如:
lable:begin
...........
end lable;
可以用leave lable;跳出区块,执行区块以后的代码
2.条件语句
if 条件 then
statement
else
statement
end if;
如:
	if exists (select id from t_pay_month where left(stat_date,7)=left(strdate,7) limit 0,1) then
		statement
	else
		statement
	


是判断某一个数据库是否有数据。

3.循环语句
1)首先定义游标,语法如:DECLARE ... CURSOR FOR SELECT ... FROM ... 例子如下:
		DECLARE pay_rule_cursor cursor for SELECT cp_id,product_type, start_value,end_value,cp_percent from t_cp_percent 
		WHERE EXTRACT(YEAR_MONTH from start_date)<=EXTRACT(YEAR_MONTH from strdate)
		and EXTRACT(YEAR_MONTH from end_date)>=EXTRACT(YEAR_MONTH from strdate)
		and cp_id='0' and product_type='';
		

2)声明一个游标使用的变量,(用处不是很明白,在打开游标之前还要set done=0;好像是用于跳出循环用的,)如:declare continue handler for not found set done=1;
2)打开游标,open ...;如:open pay_rule_cursor.
3)开始循环,name:loop 如:loop1:loop
4)把游标的值插入到声明的变量中去,语法:fetch ...(游标名) into ....(变量名列表),如:
fetch pay_rule_cursor into cpid,producttype,startvalue,endvalue,cppercent;

5)接着加上
			if done=1 then
				leave loop1;
			end if;
		

好像是跳出循环用。
6)接着就是执行需要的操作,如:
			update TMP_t_pay_month set cp_percent=cppercent
			where stat_totle_fee>=startvalue and stat_totle_fee<endvalue;
		

7)结束循环,如:end loop loop1;
8)关闭游标,如:CLOSE pay_rule_cursor;

我是采用了这个流程才正确执行了循环。

五.其他常用命令
1.show procedure status
显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
2.show create procedure sp_name
显示某一个存储过程的详细信息

参考文章:http://blog.csdn.net/crazy_rain/archive/2007/07/06/1680799.aspx
分享到:
评论

相关推荐

    MYSQL存储过程总结[定义].pdf

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者编写包含一系列SQL语句的可重复使用的代码块。在MySQL 5及以上版本中,存储过程极大地提高了数据库操作的效率和灵活性。下面将对存储过程的几个关键...

    mysql存储过程教程

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列SQL语句并封装成一个可重复使用的单元,从而提高数据处理的效率和代码的复用性。本教程将深入探讨MySQL存储过程的创建、调用以及相关概念...

    mysql存储过程调试工具

    总结来说,"Debugger for MySQL"这样的工具是MySQL存储过程开发和维护的有力助手,它提供了断点调试、变量查看等核心功能,使得复杂存储过程的调试工作变得更加简单和高效。熟练掌握这类工具的使用,将极大地提升...

    mysql存储过程实现分页

    ### MySQL存储过程实现分页 #### 背景与需求 在数据库操作中,分页是一种常见的需求,尤其是在处理大量数据时。通过分页技术,可以有效地减少每次查询的数据量,提高系统的响应速度和用户体验。MySQL作为一种广泛...

    MySql 分页存储过程以及代码调用

    总结来说,MySQL的分页存储过程提供了一种高效、可复用的方式来处理分页查询,减少了直接使用OFFSET可能导致的性能问题。通过创建存储过程并在应用程序中调用,我们可以更好地控制分页逻辑,提高查询速度,提升用户...

    MySQL存储过程基础教程.pdf

    ### MySQL存储过程基础知识点 #### 1. 存储过程的定义和示例 存储过程是存储在MySQL服务器上的预编译的SQL代码段,它能够接受参数、执行一系列的SQL语句和流程控制语句。存储过程可以提高数据库操作的效率,同时...

    Mysql存储过程和函数

    ### MySQL存储过程与函数详解 #### 一、概述 MySQL是一种广泛使用的开源关系型数据库管理系统,在数据管理和存储方面提供了强大的支持。其中,存储过程和函数是MySQL提供的两种重要的编程特性,它们可以帮助开发者...

    php中调用MySQL存储过程

    ### PHP中调用MySQL存储过程 #### 背景与目的 在Web开发中,PHP是一种广泛使用的服务器端脚本语言,它与MySQL数据库结合得非常紧密,为开发者提供了强大的功能来处理数据。存储过程是预编译好的SQL代码块,它们...

    MySQL存储过程完整版使用代码示例

    资源包中囊括了MySQL数据库中的存储过程的...该资源下所有内容都是本人的日常软件开发经验总结,对于初学者使用MySQL存储过程的程序员具有重要参考价值,问大家要10分是不过分的,用过就知道了,欢迎大家下载参考及使用

    mysql存储过程简单应用编写

    在本篇总结文档中,我们将探讨MySQL存储过程的简单应用,包括循环结构、创建临时表、删除数据、分页查询以及动态存储过程的编写。 首先,让我们了解一下什么是存储过程。存储过程是一组为了完成特定功能的SQL语句集...

    MySQL实现创建存储过程并循环添加记录的方法

    总结一下,MySQL中的存储过程是执行重复任务和复杂逻辑的强大工具。通过创建存储过程并结合循环结构,可以实现批量添加记录的功能。理解并熟练掌握这一技术,对于数据库管理和开发工作来说是非常有价值的。

    kettle批量导出mysql存储过程

    总结来说,Kettle批量导出MySQL存储过程涉及到的关键知识点有:Kettle的数据流设计、MySQL的存储过程、数据库元数据获取、循环控制、文件生成和命令行脚本的创建。熟练掌握这些技能,将有助于我们在数据库管理和维护...

    mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法

    MySQL存储过程是数据库中一种非常实用的功能,它允许开发者封装一系列SQL语句成一个可重复使用的单元,便于管理和执行复杂的数据库操作。本篇文章将详细探讨如何在MySQL中创建存储过程、调用存储过程以及声明和赋值...

    Mysql 存储过程(输入,返回),函数,临时表

    Mysql 存储过程,函数,临时表 存储过程包括输入返回,可供项目中遇到难题的人解决一下,我曾为此费了好大精力,最后总结出来共大家分享

    MySQL 存储过程

    ### MySQL存储过程详解 #### 一、MySQL存储过程概述 MySQL 存储过程是一种预编译的 SQL 代码块,可以包含复杂的逻辑控制结构。它能够接收输入参数、设置输出参数,并通过调用来执行一系列数据库操作。存储过程提高...

Global site tag (gtag.js) - Google Analytics