14.1 为什么使用存储过程和函数

一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句。

存储过程和函数的优点

  • 允许标准组件式编程,提高了SQL语句的重用性、共享性和可移植性。
  • 实现较快的执行速度,减少网络流量。
  • 可以被作为一种安全机制来利用。

存储过程和函数的缺点

  • 编写比单句SQL复杂,需要用户具有更高的技能和更丰富的经验。
  • 在编写存储过程和函数时,需要创建这些数据库对象的权限。

14.2 创建存储过程和函数

14.2.1 创建存储过程

CREATE PROCEDURE procedure_name([procedure_parameter[,...]])
[characteristic...] routine_body
  • procedure_name:所要创建的存储过程的名字。
  • procedure_parameter:存储过程的参数。
  • characteristic:表示存储过程的特性。
  • routine_body:表示存储语句的SQL语句代码,可以用BEGIN...END来标志SQL语句的开始和结束。

procedure_parameter
中每个参数的语法是:

[IN|OUT|INOUT] parameter_name type

[IN|OUT|INOUT]:IN表示输入参数;OUT表示输出参数; INOUT表示既可以是输入,也可以是输出。 parameter_name:表示存储过程的参数名。 type:表示参数类型,可以是MySQL所支持的任意一个数据类型。 

characteristic
参数的取值为:
  • LANGUAGE SQL:说明routine_body部分是由SQL语言的语句组成,这也是数据库系统默认的语言。
  • [NOT] DETERMINISTIC:指明存储过程的执行结果是否是确定的。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是非确定的,相同的输入可能得到不同的输出。默认情况下,结果是非确定的。
  • {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}:指明子程序使用SQL语句的限制。CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;NO SQL表示子程序中不包含SQL语句;READS SQL DATA表示子程序中包含读数据的语句;MODIFIES SQL DATA表示子程序中包含写数据的语句。默认情况下,系统会指定为CONTAINS SQL。
  • SQL SECURITY { DEFINER | INVOKER }:指明谁有权限来执行。DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行。默认情况下,系统指定的权限是DEFINER。
  • COMMENT 'string':注释信息。

【示例14-1】

    mysql> DELIMITER &&
mysql> CREATE PROCEDURE num_from_employee
(IN emp_id INT, OUT count_num INT )
-> READS SQL DATA
-> BEGIN
-> SELECT COUNT(*) INTO count_num
-> FROM employee
-> WHERE d_id=emp_id ;
-> END &&
Query OK, 0 rows affected (0.09 sec)
mysql> DELIMITER ;

说明:MySQL中默认的语句结束符为分号(;)。存储过程中的SQL语句需要分号来结束。为了避免冲突,首先用"DELIMITER &&"将MySQL的结束符设置为&&。最后再用"DELIMITER ;"来将结束符恢复成分号。这与创建触发器时是一样的。

14.2.2 创建存储函数

CREATE FUNCTION function_name([function_parameter[,...]])
RETURNS type
[characteristic...] routine_body
  • function_name:存储函数的名称。
  • function_parameter:存储函数的参数。
  • RETURNS type:返回值的类型。
  • characteristic:表示存储函数的特性。
  • routine_body:表示存储语句的SQL语句代码,可以用BEGIN...END来标志SQL语句的开始和结束。
function_parameter中每个参数的语法是:
parameter_name type

parameter_name:表示存储函数的参数名。

type:表示参数类型,可以是MySQL所支持的任意一个数据类型。

characteristic参数的取值与存储过程中的取值是一样的。

 

14.3 关于存储过程和函数的表达式

14.3.1 操作变量

1. 声明变量

DECLARE var_name[,...] type [DEFAULT NAME]

var_name参数是变量的名称,这里可以同时定义多个变量;type参数用来指定变量的类型;DEFAULT value子句将变量默认值设置为value,没有使用DEFAULT子句时,默认值为NULL。

2. 赋值变量

关键字 SET

SET var_name=expr[,...]

var_name参数是变量的名称;expr参数是赋值表达式。一个SET语句可以同时为多个变量赋值,各个变量的赋值语句之间用逗号隔开。

关键字 SELECT INTO

SELECT  field_name[,…]  INTO  var_name[,…]
FROM table_name
WHERE condition

field_name表示查询的字段名称;var_name参数是变量的名称;table_name参数指表的名称;condition参数指查询条件。

14.3.2 操作条件

1. 定义条件

DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE[VALUE] sqlstate_value|mysql_error_code

condition_name参数表示条件的名称;condition_value参数表示条件的类型;sqlstate_value参数和mysql_error_code参数用来设置条件的错误。

2. 定义处理程序

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type:
CONTINUE
| EXIT
| UNDO
condition_value:
SQLSTATE [VALUE] sqlstate_value
|condition_name
|SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mysql_error_code

handler_type参数指明错误的处理方式,该参数有3个取值。

  CONTINUE表示遇到错误不进行处理,继续向下执行;

  EXIT表示遇到错误后马上退出;

  UNDO表示遇到错误后撤回之前的操作,MySQL中暂时还不支持这种处理方式。

注意:通常情况下,执行过程中遇到错误应该立刻停止执行下面的语句,并且撤回前面的操作。但是,MySQL中现在还不能支持UNDO操作。因此,遇到错误时最好执行EXIT操作。如果事先能够预测错误类型,并且进行相应的处理,那么可以执行CONTINUE操作。

condition_value参数指明错误类型,该参数有6个取值。

  sqlstate_value和mysql_error_code与条件定义中的是同一个意思。

  condition_name是DECLARE定义的条件名称。

  SQLWARNING表示所有以01开头的sqlstate_value值。

  NOT FOUND表示所有以02开头的sqlstate_value值。

  SQLEXCEPTION表示所有没有被SQLWARNING或NOT FOUND捕获的sqlstate_value值。

sp_statement表示一些存储过程或函数的执行语句。

14.3.3 使用游标

游标可以看做一种数据类型,可以用来遍历结果集,相当于指针,或数组的下标。处理结果集的方法可以通过游标定位到结果集的某一行,从当前结果集的位置搜索一行或一部分行或者对结果集中的当前行进行数据修改。

1. 声明游标

DECLARE cursor_name CURSOR FOR select _statement;

2. 打开游标

OPEN cursor_name

注意打开一个游标时,游标并不指向第一条记录,而是指向第一条记录的前边。

3. 使用游标

FETCH cursor_name INTO var_name[,var_name] ...

当第一使用游标时,此时游标指向结果集的第一条记录。

4. 关闭游标

CLOSE cursor_name

14.3.4 使用流程控制

1. 条件控制语句

关键字 IF

IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF

关键字 CASE

CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE

2. 循环控制语句

关键字 LOOP

[begin label:] LOOP
statement_list
END LOOP [end_label]
LEAVE label  //退出正在执行的循环体

关键字 WHILE

[begin label:] WHILE search_condition DO
statement_list
END WHILE[end_label]

关键字 REPEAT

[begin label:] REPEAT search_condition DO
statement_list
END REPEAT[end_label]

14.4 查看存储过程和函数

1. 查看存储过程

SHOW PROCEDURE STATUS [LIKE 'pattern'] \G

2. 查看函数

SHOW FUNCTION STATUS [LIKE 'pattern'] \G

3. 在系统数据库information_schema中存在一个存储所有存储过程和函数信息的系统表routines,因此查询该表格的记录也可以实现查看存储过程和函数功能。

USE information_schema;
SELECT * FROM routines
  [WHERE SPECIFIC_NAME='procedure_name'] \G

4. 查看存储过程定义信息

SHOW CREATE PROCEDURE proce_name \G

5. 查看函数定义信息

SHOW CREATE FUNCTION func_name \G

14.5 修改存储过程和函数

1. 修改存储过程

ALTER PROCEDURE procedure_name
[charactistic...] charactistic的取值:
|{CONTRAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY {DEFINER|INVOKER}
|COMMENT 'string'

2. 修改函数

ALTER FUNCTION function_name
[charactistic...] charactistic的取值:
|{CONTRAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY {DEFINER|INVOKER}
|COMMENT 'string'

14.6 删除存储过程和函数

1. 删除存储过程

DROP PROCEDURE procedure_name

2. 删除函数

DROP FUNCTION function_name

参考博客:http://www.cnblogs.com/exmyth/p/3303470.html

MYSQL数据库学习十四 存储过程和函数的操作的更多相关文章

  1. MYSQL数据库学习十六 安全性机制

    16.1 MYSQL数据库所提供的权限 16.1.1 系统表 mysql.user 1. 用户字段 Host:主机名: User:用户名: Password:密码. 2. 权限字段 以“_priv”字 ...

  2. MYSQL数据库学习十八 数据库维护和性能提高

    18.1 数据备份 可能造成数据损失的原因有: 存储介质故障:保存数据库文件的磁盘设备损坏,用户没有数据库备份导致数据彻底丢失. 用户的错误操作:如误删了某些重要数据,甚至整个数据库. 服务器的彻底瘫 ...

  3. MYSQL数据库学习十五 事务

    15.1 事务概述 当多个用户访问同一份数据,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据库记录的更新从一个一致性状态变为另一个一致性状态,使用事务处理是非常必要的. 事务有以 ...

  4. MYSQL数据库学习十 单表数据记录查询

    10.1 简单数据记录查询 SELECT field1,field2,...fieldn FROM table_name; “*” ——查询所有记录 SELECT * FROM table_name; ...

  5. MYSQL数据库学习十二 使用MySQL运算符

    12.1 算术运算符 + - * /(DIV) %(MOD) 12.2 比较运算符 > < = <=> != <> >= <= BETWEEN AND ...

  6. Mysql 数据库学习笔记03 存储过程

    一.存储过程:如下           通过 out .inout 将结果输出,可以输出多个值. * 调用存储过程: call 存储名称(参数1,参数2,...); 如指定参数不符合要求,返回 Emp ...

  7. MYSQL初级学习笔记四:查询数据的操作DQL(SELECT基本形式)(26-35)

    知识点六:查询数据的操作DQL(SELECT基本形式)(26-35) CREATE DATABASE IF NOT EXISTS cms DEFAULT CHARACTER SET utf8; USE ...

  8. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  9. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. wpf通过VisualTreeHelper找到控件内所有CheckBox和TextBox并做相应绑定

    #region CheckBox与TextBox绑定 Dictionary<CheckBox, TextBox> CheckTextBoxDic = new Dictionary<C ...

  2. (2018干货系列一)最新Java学习路线整合

    怎么学Java Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征. 话不多说,直接上干货: ...

  3. FusionCharts多数据验证饼图label是否重叠

    昨天,有人问我一个问题:由于饼图的数据太多,label标签上的汉字过多,导致重叠,该怎么解决? 今天我用大量的数据,label标签的字符也很多,但是通过验证没有发现有重叠的情况啊! 1.验证的JSP页 ...

  4. Linux显示以时间生升序显示文件

    Linux显示以时间生升序显示文件 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ls -lnt 总用量 56 -rw-rw-r-- 1 1000 1000 ...

  5. python实现简单排序算法

    算法 递归两个特点: 调用自身 有穷调用 计算规模越来越小,直至最后结束 用装饰器修饰一个递归函数时会出现问题,这个问题产生的原因是递归的函数也不停的使用装饰器.解决方法是,只让装饰器调用一次即可,那 ...

  6. pat1101-1110

    1101 #include<cmath> #include<map> #include<iostream> #include<cstring> #inc ...

  7. iOS - Quartz 2D 二维绘图

    1.Quartz 2D 简介 Quartz 2D 属于 Core Graphics(所以大多数相关方法的都是以 CG 开头),是 iOS/Mac OSX 提供的在内核之上的强大的 2D 绘图引擎,并且 ...

  8. xml文件的规则

    一,规则 1.1,样本 <?xml version="1.0" encoding="utf-8"?> <contactList> < ...

  9. 【BZOJ1009】GT考试(KMP算法,矩阵快速幂,动态规划)

    [BZOJ1009]GT考试(KMP算法,矩阵快速幂,动态规划) 题面 BZOJ 题解 看到这个题目 化简一下题意 长度为\(n\)的,由\(0-9\)组成的字符串中 不含串\(s\)的串的数量有几个 ...

  10. NOIWC2018滚粗记

    Day0 \(THUWC\)刚刚结束..顺利的滚粗了 Day1 整理一下自己咸鱼的心 下午到学校坐车出发 这次队伍浩大THUWC只有4个 又到了雅礼洋湖这个地方 路上突然多了许多有关\(NOI\)的标 ...