mysql死磕7天第五天

第一章:MySQL存储程序介绍

  存储程序包含存储过程,函数和触发器。正确使用存储程序也有助于加强数据库的安全性和完整性以及改善你的应用程序的性能和易维护性。

1.1 什么是存储程序

  一种被数据库服务器所存储和执行的计算机程序,存储程序的源代码可能是二进制编译版本,几乎总是占据着数据库服务器系统的表空间,程序总是位于其数据库服务器的进程或线程的内存地址中被执行。

  存储过程:是能够接受数个输入和输出参数并且能够在请求是被执行的程序单元;

  存储函数:它的执行结果会返回一个值。允许有效的扩展SQL语言的能力;

  触发器:用来相应激活或者数据库行为,事件的存储程序,常用来作为DML(数据库操纵语言)的响应而被调用,可以用来作为数据校验和自动反向格式化。

1.1.1 为什么使用存储程序

  可提高数据库的安全性,以使你的数据库更安全;

  避免代码的冗余 ,提供数据访问的抽象机制,能够该少代码在底层数据结构演化过程中的易维护性;

  更快的速度,降低网络拥阻,因为属于数据库服务器的内部数据,相比在网上传输数据要快的多;

  可以替多种使用不同架构的外围应用实现共享的访问历程,无论这些架构是基于数据库服务器外部还是内部;

  以数据为中心的逻辑可以被独立的放置于存储程序中,可为程序员带来更高,更为独特的数据库编程体验;

  可以该少应用程序的可移植性;


1.1.3 MySQL 存储过程,函数和触发器

  存储程序语言包含了大量人们熟知的命令。包括变量操纵,条件语句的实现方式,迭代编程和错误处理等,很好的适应数据库编程的常规需求。

 

1.2 快速浏览

  MySQL存储程序结构和功能的基本要点的简单示例。

1.2.1 和SQL集成

  一个非常重要的方面就是和SQL的紧密集合,不需要借助于像ODBC或JDBC这样的软件粘合剂来为你的存储程序创建独立的SQL语句,只要简单的将UPDATE、INSERT和SELECT语句直接写进你的存储程序代码中。

1.2.2 控制和条件逻辑

  IF 和 CASE 语句

  完整的循环和迭代控制:包含简单循环,WHILE循环和REPEAT UNTIL循环。

1.2.3 存储函数

  存储函数是能够返回一个值的存储程序,也可以当做內建函数一样对待(调用)。

1.2.4 当发生错误时

  提供处理错误的强大机制,如果存在错误,错误将被捕获并且按照程序进行处理,如果没有错误处理,存储程序将被终止执行,并且错误将被返回给它的调用程序。

1.2.5 触发器

  用来响应数据库事件是自动回调的存储程序,触发器将在特定表的DML(数据库操纵语言)激活时被回调。触发器是个特定的存储过程,它的执行不是由程序调用也不是手工启动而是由事件来触发。

触发器的优点

1、触发器可以检查或者修改将被插入或者用来更新数据行的新数据值,这意味着可以利用触发器来实现数据完整性及过滤性

2、触发器可以把表达式的结果赋值给数据列作为其默认值。

3、触发器可以在删除或修改数据前先检查它当前的内容,这种能力做很多事情,如可以把对数据的修改存在一个日记里。

触发器的限制

1、触发器不能调用数据返回客户端的存储过程,也不能使用采用call语句的动态sql(允许通过存储过程将参数返回触发器)

2、触发器不能使用以显式或者隐式方式开始或结束事务的语句,如start transcation,coomit 或callback

自定义函数

use blog;

delimiter $$
create function SayHello(name varchar(50))
returns varchar(100)
begin
return concat(name,'说,很高兴认识大家');
end$$
delimiter ;
SELECT SayHello('yongliu');




存储过程 样例1 2 

use blog;#使用数据库
delimiter $$
create procedure pro()
begin
 SELECT 'Hello,World!';
end$$
delimiter ;
call pro()

use blog;
drop procedure pro2;
delimiter $$
create procedure pro2()
begin
  declare num int default 1;
  label1:LOOP
  IF num < 6 THEN
   select num;
   set num = num + 1;
   iterate label1;
   END IF;
 LEAVE label1;
 END LOOP label1;
end$$
delimiter ;
call pro2()


//触发器

delimiter $$
create TRIGGER delUser2 BEFORE DELETE on user for each ROW 
BEGIN 
DELETE from user_info where user_info.user_id=old.id limit 1;
END$$
delimiter ;