`
liu86th
  • 浏览: 117922 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[mysql]mysql存储过程的

 
阅读更多

最近公司的项目里,有个要统计每个分类的商品的数量的需求,本来用php连接mysql传递sql去统计的,后面发现老是出问题,最后换成了使用mysql的存储过程去实现,以前听过存储过程,但是从来没有动手去写过,所以今天学习了一下,统计品牌代码如下:

 

begin
  declare num int default 0;
  declare cid int default 0;
  declare tip int default 0;
  declare cursor_goods cursor for select count(*) as c,category_id as i from goods group by category_id;
  declare continue handler for SQLSTATE '02000' set tip=1;
  #reset
  update brand set number=0;
  #update
  open cursor_goods;
  repeat
    fetch cursor_goods into num,cid;
		update brand set number=num where id=cid;
  until tip end repeat;
  close cursor_goods;
end
begin
  declare num int default 0;
  declare tip int default 0;
  declare cid int default 0;
  declare lii int default 0;
  declare lee int default 0;
  declare len int default 0;

  declare sid varchar(250) default '';
  declare tmp varchar(250) default '';
  declare yii varchar(250) default '';
  
  declare cursor_goods cursor for select count(*) as c,category_id as i from goods group by category_id;
  declare continue handler for sqlstate '02000' set tip=1;
  #reset
  update category set number=0;
  #update
  open cursor_goods;
  repeat
    set sid='';
	  set num=0;
    fetch cursor_goods into num,cid;
    select sorder into sid from category where id=cid limit 1;

    if(sid!='') then
      set len=length(sid);
      set sid=substr(sid,2);
			set lee=1;
      set yii = sid;
      while lee<len do
				set tmp = substr(sid,lee,1);
				if(tmp=',') then
					set lii = substring_index(yii,',',1);
					update category set number=number+num where id = lii;
					set yii = substr(sid,lee+1);
				end if;
				set lee=lee+1;
      end while;
    end if;

  until tip end repeat;
  close cursor_goods;
end

3.预处理,因为存储过程不支持in参数的传递执行,可以用预处理解决类似的代码段2的出现,不用循环字符串,传递的参数的时候可以是这样的 - ‘1,2,3,4’(加上单引号即可)

 

drop procedure if exists `proc_test_prepare` 

create definer = `root`@`%` procedure `proc_test_prepare`(c text) 
begin
	#test
	declare pre_select varchar(250);
	
	#select
	set @testsql = concat('select * from product_category where id in(', c, ')');
	prepare pre_select from @testsql;
	execute pre_select;
end;

4.哈,再加上定时器就能够定时执行了统计任务了

 

CREATE EVENT `event_count_brand` ON SCHEDULE EVERY 2 HOUR STARTS '2013-01-03 11:40:10' ON COMPLETION NOT PRESERVE ENABLE DO call proc_count_brand

5.可以加上想要的定时执行效果

 

#从现在开始每隔九天定时执行  
CREATE  EVENT EVENT1  
  
ON SCHEDULE EVERY 9 DAY STARTS NOW()  
ON COMPLETION PRESERVE ENABLE  
DO  
    BEGIN  
       CALL TOTAL();  
    END  

  
#每个月的一号凌晨1 点执行  
CREATE  EVENT EVENT2     
  
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 

MONTH),INTERVAL 1 HOUR)  
ON COMPLETION PRESERVE ENABLE  
DO  
    BEGIN  
        CALL STAT();  
    END  
  
  
  
#每个季度一号的凌晨2点执行  
  
CREATE  EVENT TOTAL_SEASON_EVENT  
  
ON SCHEDULE EVERY 1 QUARTER STARTS DATE_ADD(DATE_ADD(DATE( CONCAT(YEAR(CURDATE()),'-',ELT(QUARTER(CURDATE

()),1,4,7,10),'-',1)),INTERVAL 1 QUARTER),INTERVAL 2 HOUR)  
ON COMPLETION PRESERVE ENABLE  
DO  
    BEGIN  
        CALL SEASON_STAT();  
    END  
  
  
  
  
#每年1月1号凌晨四点执行  
CREATE  EVENT TOTAL_YEAR_EVENT  
  
ON SCHEDULE EVERY 1 YEAR STARTS DATE_ADD(DATE(CONCAT(YEAR(CURDATE()) + 1,'-',1,'-',1)),INTERVAL 4 HOUR)  
ON COMPLETION PRESERVE ENABLE  
DO  
    BEGIN  
        CALL YEAR_STAT();  
   

5.定时器的开启和关闭

 

#开启DROP PROCEDURE IF EXISTS `proc_count_attribure`;
alter
event event_count_brand on completion preserve enable;
#关闭
alter
 event event_count_brand on completion preserve disable;

6.mysql函数

 

DROP FUNCTION IF EXISTS `proc_count_attribure`;

CREATE DEFINER = `root`@`%` FUNCTION `proc_count_attribure`(sid int)
 RETURNS varchar(250) CHARSET utf8
begin
	#return count mark attrite
	declare iid int default 0;
	declare iname varchar(250) default '';
	declare iscore int default 0;
	declare iflag int default 0;
	declare istring varchar(250) default '';
	declare cursor_attribute cursor for select item_id,item_name,sum(score) as item_score from shop_assess_attribute where shop_id=sid group by item_id;
	declare continue handler for sqlstate '02000' set iflag=1;

	open cursor_attribute;
	repeat
		fetch cursor_attribute into iid,iname,iscore;
		set istring = concat(istring,iid,',',iname,',',iscore,'|');
	until iflag end repeat;  
	close cursor_attribute;

	return substr(istring,1,char_length(istring)-1);
end;

 

分享到:
评论

相关推荐

    mysql存储过程教程

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

    mysql经典教程+mysql存储过程讲解

    本教程结合"mysql经典教程+mysql存储过程讲解"的主题,将深入探讨MySQL的基础知识以及核心特性——存储过程。 首先,我们需要理解什么是数据库。数据库是一个组织和存储数据的系统,允许用户以结构化方式访问和管理...

    Mysql存储过程常用语句模板

    Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三...

    MySQL存储过程的异常处理方法

    本实例展示了如何在MySQL存储过程中实现异常处理,以捕获并处理可能出现的错误。 首先,我们注意到在创建存储过程`myProc`时,使用了`delimiter $$`来改变MySQL客户端的语句分隔符,这是为了在存储过程中使用多个...

    c++实现调mysql存储过程

    c++实现调mysql存储过程,实现存储过程的出参入参,可以支持查询多数据返回,还有存储过程的复杂数据的增删改等

    mysql中文手册+mysql命令大全+mysql存储过程

    最后,"mysql存储过程.pdf"专注于MySQL的存储过程。存储过程是预编译的SQL语句集合,可以提高数据库操作的性能,减少网络流量,并增强数据安全。在PDF文档中,你将学习如何定义、调用和管理存储过程,以及如何使用...

    mysql存储过程之返回多个值的方法示例

    本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下: mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的...

    MySQL存储过程学习

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列的SQL语句,形成一个可重复使用的代码块,以提高数据处理的效率和应用程序的性能。在这个"MySQL存储过程学习"的主题中,我们将深入探讨...

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

    本篇文章将深入探讨MySQL中的分页存储过程及其代码调用方法。 首先,理解分页的基本概念。在网页或应用程序中,我们通常会看到“上一页”、“下一页”这样的导航,这就是分页的表现形式。分页查询通过设置每页显示...

    Java实现调用MySQL存储过程详解

    总的来说,Java通过JDBC调用MySQL存储过程涉及到连接数据库、创建`CallableStatement`、执行存储过程和处理结果。这使得开发者能够在Java应用中灵活地利用数据库提供的强大功能,实现更高效的数据处理。

    mysql存储过程——用于数据库的备份与还原

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许程序员或数据库管理员预编译一系列SQL语句,形成一个可重用的程序单元。在本场景中,我们关注的是如何利用存储过程进行数据库的备份与还原,这在数据管理中至...

    mysql存储过程调试工具

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者编写一系列复杂的SQL语句,并作为一个单元进行执行,提高代码复用性和效率。然而,与普通的编程语言一样,存储过程的调试同样至关重要,因为错误的存储...

    MySQL存储过程编程.pdf

    MySQL 存储过程编程 MySQL 存储过程编程是指在 MySQL 数据库中使用存储过程来实现业务逻辑的编程技术。存储过程是一种可以在数据库中存储和执行的程序单元,它可以实现复杂的业务逻辑和数据处理操作。 在 MySQL ...

    MySQL 存储过程入门到精通

    MySQL存储过程是数据库管理系统中的一个重要特性,它允许程序员或数据库管理员预先定义一组SQL语句,形成一个可重用的逻辑单元。在这个“MySQL存储过程入门到精通”资料中,你将深入理解存储过程的原理、创建、调用...

    mysql存储过程实例

    MySQL 存储过程实例 MySQL 存储过程实例详细介绍了 MySQL 存储过程的开发步骤,本节将通过具体的实例讲解 PHP 是如何操纵 MySQL 存储过程的。 创建存储过程 存储过程的创建是 MySQL 存储过程的基础,MySQL 5.0 ...

    mySQL存储过程调用

    ### MySQL存储过程 存储过程是一种在数据库服务器上预先编译好的SQL脚本,它可以在服务器端执行复杂的业务逻辑,提供了一种高效、安全的方式进行数据操作。MySQL自5.0版本起引入了存储过程功能,这使得开发者能够...

    MySQL数据库存储过程

    同时,`mysql存储过程教程.pdf`很可能是一个详细的指南,涵盖了存储过程的基础概念、语法、高级特性以及实例。通过阅读这份教程,读者可以学习如何创建、修改、删除存储过程,理解如何在存储过程中使用变量、游标、...

    mysql触发器+存储过程

    文件“MySQL存储过程.pdf”和“OReilly.MySQL.Stored.Procedure.Programming.rar”可能会提供关于如何创建、调用和管理MySQL存储过程的详细指南,而“MySQL触发器.rar”则可能包含触发器的创建、使用和优化方面的...

Global site tag (gtag.js) - Google Analytics