MySQL储存过程

什么是存储过程?

        简单来说,就是为以后的使用而保存的一条或者多条MySQL语句的集合.

        可以将其视为批文件,虽然他们的作用不仅限于批处理


为什么要使用存储过程?

1.通过把处理封装在容易使用的单元中,简化复杂的操作

2.由于不要求反复建立一系列处理步骤,保证了数据的完整性.如果所有开发人员和应用程序都使用同一(测验和测试)存储过程,则说使用的代码都是相同的.(这一点的延伸就是防止错误.需要执行的步骤越多,出错的可能性就越大.防止错误就保证了数据的一致性)

3.简化对变动的管理.如果表名,列名或者业务逻辑(或者别的内容)有变化,只需要更改储存过程的代码.使用它的人员甚至不需要知道这些变化.(这一点的延伸就是安全性.通过储存过程限制对基础数据的访问减少了数据讹误的机会)

4.提高性能.因为使用储存过程比使用单独的SQL语句要快

5.存在一些只能用在单个请求中的MySQL元素和特性,储存过程可以使用它们来编写功能更强大更灵活的代码

简单来说,使用储存过程有3个主要的好处.即简单,安全,高性能.

储存过程的缺点

1.一般来说,储存过程的编写比基本SQL语句复杂,编写储存过程需要更高的技能,更丰富的经验

2.你可能没有创建储存过程的安全访问权限,许多数据库管理员限制储存过程的创建权限,允许用户使用储存过程,但是不允许他们创建储存过程

3.每个数据库的存储过程语法几乎都不一样,十分难以维护(不通用)

4.业务逻辑放在数据库上,难以迭代

创建储存过程

CREATE  PROCEDURE productpricing()
BEGIN
	 SELECT avg(good_price) as priceaverage
	 from products;
end;

注意:



使用储存过程

call productpricing();


删除存储过程

drop procedure productpricing;



使用创建带参数的储存过程




使用带参数的储存过程


mysql数据备份储存过程

12-09

mysql中有一张表,每天的新增数据量大概5000条记录,现在要将一个月前的所有记录存放到另一张表中,rn将数据存放到另一张表后,就删除已经存放的记录,rn我写一个储存过程如下rnbeginrn-- 定义循环时的idrn declare rid int default null;rn declare stop int default 1;rn-- 定义游标rn declare rowid CURSOR FORrn(select clid from chargelog where DATE_FORMAT(CHARGETIME,'%Y-%m-%d') >= ADDDATE(NOW(), INTERVAL -31 DAY) );rn-- 发生错误时,设置rid为-1rndeclare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop = -1;rn-- 打开游标rnopen rowid;rn-- 读取第一行数据,并赋值给ridrnFETCH rowid INTO rid;rn-- 循环游标rn-- WHILE (rid is not null ) DOrnWHILE (stop > 0) DOrn -- 开启事务rn -- start transaction;rn -- 插入数据rn insert into chargelog_his (select * from chargelog where clid = rid);rn -- insert into chargelog_his (clid,nwid) values (rid,rid+20);rn -- 删除已经插入的数据rn delete from chargelog where clid = rid;rn -- rid = -1 表示有异常,则回滚rn -- IF(rid = -1)rn -- THENrn -- rollback;rn -- END IF;rn -- 无异常,提交事务rn -- IF(rid != -1)rn -- THENrn -- commit;rn -- END IF;rn FETCH rowid INTO rid;rnEND WHILE;rnCLOSE rowid;rnendrnrn本来我是想用两条sql语句就完成所有的数据存放,和删除,但是老大说,为了防止在删除的时候出现异常,rn要的存放一条,删除一条。如果有异常就回滚,没有异常就提交事务rn于是就只能写成上面的样子。现在我还没有添加事务,5000条整个过程需呀100秒左右,rn但是用我下面写的rnbeginrninsert into chargelog_his (select * from chargelog where DATE_FORMAT(CHARGETIME,'%Y-%m-%d') >= ADDDATE(NOW(), INTERVAL -31 DAY));rndelete from chargelog where DATE_FORMAT(CHARGETIME,'%Y-%m-%d') >= ADDDATE(NOW(), INTERVAL -31 DAY);rnendrn几秒钟就搞定。rnrn大家给点意见吧,我们老大是个死脑筋,rn感觉屁都不懂,要求还多的很,我靠

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试