SQL函数和过程

一、存储过程概述

1.1 理解
含义:存储过程的英文是 Stored Procedure 。它的思想很简单,就是一组经过 预先编译 的 SQL 语句 的封装。

执行过程:存储过程预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用 存储过程的命令,服务器端就可以把预先存储好的这一系列 SQL 语句全部执行。

好处:

1、简化操作,提高了sql语句的重用性,减少了开发程序员的压力

2、减少操作过程中的失误,提高效率

3、减少网络传输量(客户端不需要把所有的 SQL 语句通过网络发给服务器)

4、减少了 SQL 语句暴露在 网上的风险,也提高了数据查询的安全性

和视图、函数的对比:

它和视图有着同样的优点,清晰、安全,还可以减少网络传输量。不过它和视图不同,视图是 虚拟表 , 通常不对底层数据表直接操作,而存储过程是程序化的 SQL,可以 直接操作底层数据表 ,相比于面向集 合的操作方式,能够实现一些更复杂的数据处理。 一旦存储过程被创建出来,使用它就像使用函数一样简单,我们直接通过调用存储过程名即可。相较于 函数,存储过程是 没有返回值的。

1.2分类

存储过程的参数类型可以是IN、OUT和INOUT。根据这点分类如下:

1、没有参数(无参数无返回)

2、仅仅带 IN 类型(有参数无返回)

3、仅仅带 OUT 类型(无参数有返 回)

4、既带 IN 又带 OUT(有参数有返回)

5、带 INOUT(有参数有返回)

注意:IN、OUT、INOUT 都可以在一个存储过程中带多个。

二、创建存储过程

语法:

create procedure 存储过程名(in|out|inout 参数名 参数类型,...)
[characteristics...]
begin
存储过程体
end

1.说明:参数类型可以是mysql数据库中任意类型。characteristics表示创建存储过程时指定的对存储过程的约束条件,其取值信息如下:

LANGUAGE SQL |

[NOT] DETERMINISTIC

| { CONTAINS SQL | NO SQL | READS SQL DATA

| MODIFIES SQL DATA }

| SQL SECURITY { DEFINER | INVOKER }

| COMMENT 'string'


        LANGUAGE SQL :说明存储过程执行体是由SQL语句组成的,当前系统支持的语言为SQL。
        [NOT] DETERMINISTIC :指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定 的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是不确定 的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为NOT         DETERMINISTIC。
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } :指明子程序使 用SQL语句的限制。
        CONTAINS SQL表示当前存储过程的子程序包含SQL语句,但是并不包含读写数据的SQL语句;
        NO SQL表示当前存储过程的子程序中不包含任何SQL语句;
        READS SQL DATA表示当前存储过程的子程序中包含读数据的SQL语句;
        MODIFIES SQL DATA表示当前存储过程的子程序中包含写数据的SQL语句。
        默认情况下,系统会指定为CONTAINS SQL。
        SQL SECURITY { DEFINER | INVOKER } :执行当前存储过程的权限,即指明哪些用户能够执 行当前存储过程。
        DEFINER 表示只有当前存储过程的创建者或者定义者才能执行当前存储过程;
        INVOKER 表示拥有当前存储过程的访问权限的用户能够执行当前存储过程。 

2、存储过程体中可以有多条 SQL 语句,如果仅仅一条SQL 语句,则可以省略 BEGIN 和 END 编写存储过程并不是一件简单的事情,可能存储过程中需要复杂的 SQL 语句。

SQL函数和过程_第1张图片

 

 3、需要设置新的结束标记

DELIMITER 新的结束标记

 因为MySQL默认的语句结束符号为分号‘;’。为了避免与存储过程中SQL语句结束符相冲突,需要使用 DELIMITER改变存储过程的结束符。

比如:“DELIMITER //或“DELIMITER$”语句的作用是将MySQL的结束符设置为//或$,并以“END //”或“END &”结束存储过程。存储过程定 义完毕之后再使用“DELIMITER ;”恢复默认结束符。DELIMITER也可以指定其他符号作为结束符。

当使用DELIMITER命令时,应该避免使用反斜杠(‘\’)字符,因为反斜线是MySQL的转义字符。

三、调用和函数使用

SQL函数和过程_第2张图片

SQL函数和过程_第3张图片 

SQL函数和过程_第4张图片

SQL函数和过程_第5张图片

SQL函数和过程_第6张图片 

SQL函数和过程_第7张图片 

 

对比存储过程和函数

SQL函数和过程_第8张图片

 

  存储函数可以放在查询语句中使用,存储过程不行。反之,存储过程的功能更加强大,包括能够 执行对表的操作(比如创建表,删除表等)和事务操作,这些功能是存储函数不具备的。

四、 存储过程和函数的查看、修改、删除

创建完之后,怎么知道我们创建的存储过程、存储函数是否成功了呢?

MySQL存储了存储过程和函数的状态信息,用户可以使用SHOW STATUS语句或SHOW CREATE语句来查 看,也可直接从系统的information_schema数据库中查询。

这里介绍3种方法。

1. 使用SHOW CREATE语句查看存储过程和函数的创建信息 基本语法结构如下:

SHOW CREATE {PROCEDURE | FUNCTION} 存储过程名或函数名

2. 使用SHOW STATUS语句查看存储过程和函数的状态信息 基本语法结构如下:

 SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']

修改
修改存储过程或函数,不影响存储过程或函数功能,只是修改相关特性。使用ALTER语句实现。

ALTER {PROCEDURE | FUNCTION} 存储过程或函数的名 [characteristic ...] 

其中,characteristic指定存储过程或函数的特性,其取值信息与创建存储过程、函数时的取值信息略有 不同。

 删除

删除存储过程和函数,可以使用DROP语句,其语法结构如下:

DROP {PROCEDURE | FUNCTION} [IF EXISTS] 存储过程或函数的名

你可能感兴趣的:(sql,数据库)