你了解Mysql的存储过程吗?

程序员们去IBM面试的时候,几乎每个面试官问到数据库的时候都要问用没用过存储过程,烦人不?大家去面的程序员,又不是 DBA,以前的项目都没有用到存储,不照样运行的好好的?

存储过程真的那么重要吗,它到底有什么好处呢?

1、什么是mysql存储例程?

存储例程是存储在数据库服务器中的一组sql语句,通过在查询中调用一个指定的名称来执行这些sql语句命令。

2、为什么要使用mysql存储过程?

我们都知道应用程序分为两种,一种是基于web,一种是基于桌面,他们都和数据库进行交互来完成数据的存取工作。假设现在有一种应用程序包含了这两种,现在要修改其中的一个查询sql语句,那么我们可能要同时修改他们中对应的查询sql语句,当我们的应用程序很庞大很复杂的时候问题就出现了,不易维 护!另外把sql查询语句放在我们的web程序或桌面中很容易遭到sql注入的破坏。而存储例程正好可以帮我们解决这些问题。

3、存储过程(stored procedure)、存储例程(store routine)、存储函数区别

Mysql存储例程实际包含了存储过程和存储函数,它们被统称为存储例程。

其中存储过程主要完成在获取记录或插入记录或更新记录或删除记录,即完成select insert delete update等的工作。而存储函数只完成查询的工作,可接受输入参数并返回一个结果。

4、创建mysql存储过程、存储函数

create procedure 存储过程名(参数)

下面是存储过程的例子:


mysql> DELIMITER //
mysql> CREATE PROCEDURE proc1(OUT s int)
-> BEGIN
-> SELECT COUNT(*) INTO s FROM user;
-> END
-> //
mysql> DELIMITER ;



注:

(1)这里需要注意的是DELIMITER//和DELIMITER;两句,DELIMITER是分割符的意思,因为MySQL默认以”;”为分隔 符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当 前段分隔符,这样MySQL才会将”;”当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。

(2)存储过程根据需要可能会有输入in、输出out、输入输出inout参数,这里有一个输出参数s,类型是int型,如果有多个参数用”,”分割开。

(3)过程体的开始与结束使用BEGIN与END进行标识。

这样,我们的一个MySQL存储过程就完成了,是不是很容易呢?看不懂也没关系,接下来,我们详细的讲解。


声明分割符

其实,关于声明分割符,上面的注解已经写得很清楚,不需要多说,只是稍微要注意一点的是:如果是用MySQL的Administrator管理工具时,可以直接创建,不再需要声明。

参数

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT。

形式如:

CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形…])
  • IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
  • OUT 输出参数:该值可在存储过程内部被改变,并可返回
  • INOUT 输入输出参数:调用时指定,并且可被改变和返回

5、存储过程的删改查

5.1 调用存储过程

Call sp_name([parameter[,…]]);
  • Sp_name被调用存储过程的名称
  • Parameter:指定调用存储过程所要使用的参数。

5.2 MySQL存储过程的查询

我们可以查看存储过程的详细,但是需要用另一种方法:

SHOWCREATEPROCEDURE 数据库.存储过程名;

就可以查看当前存储过程的详细。

5.3. MySQL存储过程的修改

ALTER PROCEDURE

更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。

5.4 MySQL存储过程的删除

删除一个存储过程比较简单,和删除表一样:

DROP PROCEDURE

从MySQL的表格中删除一个或多个存储过程。

6、存储过程的优点

存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。

存储过程可以重复使用,可减少数据库开发人员的工作量。

安全性高,可设定只有某此用户才具有对指定存储过程的使用权。

7、存储函数

什么是存储函数: 封装一段sql代码,完成一种特定的功能,返回结果。

存储函数的语法:


create function 函数([函数参数[,….]]) Returns 返回类型
Begin
If(
Return (返回的数据)
Else
Return (返回的数据)
end if;
end;

与存储过程返回参数不同的是存储函数在定义时没用直接声明哪个变量是返回参数,而只是使用了returns声明了返回参数所属的数据类型,返回参数是在函数体中使用return返回要返回的数据变量的形式来表示的。这就需要注意的是:
存储函数只支持输入参数,并且输入参数前没有IN或INOUT.

存储函数中的限制

流控制(Flow-of-control)语句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.
变量声明(DECLARE)以及指派(SET)是合法的.
允许条件声明.
异常处理声明也是允许的.
但是在这里要记住函数有受限条件:不能在函数中访问表.因此在函数中使用以下语句是非法的。


ALTER ‘CACHE INDEX’ CALL COMMIT CREATE DELETE
DROP ‘FLUSH PRIVILEGES’ GRANT INSERT KILL
LOCK OPTIMIZE REPAIR REPLACE REVOKE
ROLLBACK SAVEPOINT ‘SELECT FROM table’
‘SET system variable’ ‘SET TRANSACTION’
SHOW ‘START TRANSACTION’ TRUNCATE UPDATE

8、存储函数与存储过程的区别

  • 存储函数有且只有一个返回值,而存储过程不能有返回值。
  • 函数只能有输入参数,而且不能带in, 而存储过程可以有多个in,out,inout参数。
  • 存储过程中的语句功能更强大,存储过程可以实现很复杂的业务逻辑,而函数有很多限制,如不能在函数中使用insert,update,delete,create等语句;存储函数只完成查询的工作,可接受输入参数并返回一个结果,也就是函数实现的功能针对性比较强。
  • 存储过程可以调用存储函数。但函数不能调用存储过程。
  • 存储过程一般是作为一个独立的部分来执行(call调用)。而函数可以作为查询语句的一个部分来调用。