1.什么是MySQL存储程序?
存放在MySQL服务器端,供重复使用的对象叫做存储程序。存储程序分为以下四种:
(1)存储过程:不直接返回一个计算结果,但可以用来完成一般的运算或是生成一个结果集并传递回客户端。
一条SQL语句如果比作一行java代码,存储过程就相当于一个java方法,可以包含许多SQL语句,进行更复杂的操作。
(2)存储函数:返回一个计算结果,该结果可以用在表达式里。
就相当于自定义MySQL函数一样,它的作用和MySQL函数类似,只不过需要我们自己去定义。
(3)触发器:与数据表相关联,当那个数据表被INSERT、DELETE或UPDATE语句修改时,触发器将自动执行。
如果表关联了触发器,当表数据有修改操作时,触发器将自动执行,至于做什么是自己定义的。
(4)事件:根据时间表在预定时刻自动执行。
比如,可以自己定一个开始时间点,然后让它每隔指定的时间段重复做某些事情。
【###】存储例程(stored routine)又是什么?
指的是存储过程和存储函数两者。
2 .存储程序有那些优点
(1)存储程序对象的可执行部分可以用复合语句(可以包括 局部变量、代码块、循环、条件语句)来编写,对SQL语法进行了扩展。
(2)存储程序都保存在服务端,定义他们的代码只需要在创建它们的时候通过网络传递一次,而不是每次执行都要传递一次,大大减少了开销。
(3)把复杂的计算封装为程序单元,通过简单的程序单元的名字调用他们。
(4)可以把一组存储程序打包成一个“函数库”,供其他应用程序调用,让其他程序以相同的方式完成操作。
(5)提供了一种错误处理机制。
(6)可以提高数据库安全性,可以限制存储程序的访问权限。
3.最简单的存储程序
存储程序不一定非得用复合语句来写,一个存储程序可以只包含一条SQL语句。例如,下面这个存储过程:
CREATE PROCEDURE my_proc1() SELECT * FROM user;
【注意】要以分号(英文的分号)结束SQL语句。
调用上面的存储过程:
CALL my_proc1;
或
CALL my_proc1();
显示一个结果集(存储过程没有返回值)。
4.如何编写复合语句
上面说过,存储程序对象的可执行部分可以用复合语句来编写。但是如何编写复合语句呢,它的语法是怎么样的?
(1)复合语句的语法
【###】由 BEGIN 开头,END 结束。在其中可以写任意数量的SQL语句,从 BEGIN 到 END 构成了一个语句块。
因为BEGIN和END之间可以有多条SQL语句,那么问题就来了: 学过MySQL的都知道,通常一条MySQL语句是以分号结束的,然后你这样写:
CREATE PROCEDURE my_proc2()
BEGIN
SELECT * FROM USER;
SELECT * FROM TEST;
....
END;
然后就尴尬了,还没到END呢,第一个分号就给你结束了。结果就是一个存储过程被分号给五马分尸,第一句就变成了:
CREATE PROCEDURE my_proc1() BEGIN SELECT * FROM USER;
这条语句当然变成什么都不是了,一执行就会报错,剩下的尸块就不管了...