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. Unity引擎与C#脚本简介

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 由 QQ会员技术团队 发布在云+社区 1. Unity编辑器基础 从原理上讲,游戏开发就是将一系列变动的场景呈现在玩家面前,并根据玩家的输入 ...

  2. windowsXP下搭建JAVA环境教程

    一.工具准备安装JKD6:传送门:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-w ...

  3. tomcat证书配置

    第一步:为服务器生成证书 1.进入%JAVA_HOME%/bin目录 2.使用keytool为Tomcat生成证书,假定目标机器的域名是"localhost",keystore文件 ...

  4. C#:几种数据库的大数据批量插入

    在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...

  5. 经典面试问题: Top K 之 ---- 海量数据找出现次数最多或,不重复的。

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  6. halcon 模板匹配(最简单)

    模板匹配是机器视觉工业现场中较为常用的一种方法,常用于定位,就是通过算法,在新的图像中找到模板图像的位置.例如以下两个图像.   这种模板匹配是最基本的模板匹配.其特点只是存在平移旋转,不存在尺度变化 ...

  7. windows保留关键字全

    alert 警告 all全部 anchor锚 anchors下锚:集合 area地区 assign 分配指派 blur失去焦点 button按钮 checkbox多选按钮 clearInterval用 ...

  8. 白话讲述Java中volatile关键字

    一.由一段代码引出的问题 首先我们先来看这样一段代码: public class VolatileThread implements Runnable{ private boolean flag = ...

  9. C++标准库bitset类型(简单使用方法)

    转自此人博客 ```cpp #include<bister> using std::bitset; ``` 一句话定义:可自定义位数,用作记录二进制的数据类型. 一,定义和初始化 ```c ...

  10. C#多线程编程(6)--线程安全2 互锁构造Interlocked

    在线程安全1中,我介绍了线程同步的意义和一种实现线程同步的方法:volatile.volatile关键字属于原子操作的一种,若对一个关键字使用volatile,很多时候会显得很"浪费&quo ...