MYSQL数据库学习十四 存储过程和函数的操作
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数据库学习十四 存储过程和函数的操作的更多相关文章
- MYSQL数据库学习十六 安全性机制
16.1 MYSQL数据库所提供的权限 16.1.1 系统表 mysql.user 1. 用户字段 Host:主机名: User:用户名: Password:密码. 2. 权限字段 以“_priv”字 ...
- MYSQL数据库学习十八 数据库维护和性能提高
18.1 数据备份 可能造成数据损失的原因有: 存储介质故障:保存数据库文件的磁盘设备损坏,用户没有数据库备份导致数据彻底丢失. 用户的错误操作:如误删了某些重要数据,甚至整个数据库. 服务器的彻底瘫 ...
- MYSQL数据库学习十五 事务
15.1 事务概述 当多个用户访问同一份数据,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据库记录的更新从一个一致性状态变为另一个一致性状态,使用事务处理是非常必要的. 事务有以 ...
- MYSQL数据库学习十 单表数据记录查询
10.1 简单数据记录查询 SELECT field1,field2,...fieldn FROM table_name; “*” ——查询所有记录 SELECT * FROM table_name; ...
- MYSQL数据库学习十二 使用MySQL运算符
12.1 算术运算符 + - * /(DIV) %(MOD) 12.2 比较运算符 > < = <=> != <> >= <= BETWEEN AND ...
- Mysql 数据库学习笔记03 存储过程
一.存储过程:如下 通过 out .inout 将结果输出,可以输出多个值. * 调用存储过程: call 存储名称(参数1,参数2,...); 如指定参数不符合要求,返回 Emp ...
- MYSQL初级学习笔记四:查询数据的操作DQL(SELECT基本形式)(26-35)
知识点六:查询数据的操作DQL(SELECT基本形式)(26-35) CREATE DATABASE IF NOT EXISTS cms DEFAULT CHARACTER SET utf8; USE ...
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
随机推荐
- 对HI3531的GPIO使用的再分析
在一个嵌入式系统中使用最多的莫过于 通用输入输出 GPIO口.看到论坛中经常有朋友问海思为什么没有提供GPIO驱动.其实不然. 在海思SDK xxx/osdrv/tools/board_tools/ ...
- 网页版Rstudio︱RStudio Server多人在线协作开发
网页版Rstudio︱RStudio Server多人在线协作开发 想了解一下RStudio Server,太给力的应用,可以说成是代码分布式运行,可以节省时间,放大空间. RStudio是一个非常优 ...
- 基于am3358的蜂鸣器测试
#include <sys/ioctl.h> #include<stdio.h> #include <fcntl.h> #include <sys/types ...
- Java面试题积累
持续积累中... 1.Java支持的数据类型有哪些?什么是自动拆装箱? 数据类型分为两大种,基本类型和引用类型. 基本类型有8种:byte short int long char float doub ...
- 一个2D平面游戏,的碰撞引擎实现
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); i ...
- 【NOI2002】银河英雄传说(并查集)
[NOI2002]银河英雄传说 题面 题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军 ...
- JAVA面试一
ORACLE分页 -- 要求根据年龄排序后的 第三 行到第6 行的数据 (?) 分页语句 select t.* from ( select t1. *, rownum num from ( selec ...
- Hadoop 安装流程
前言:因项目中需要数据分析,因而使用hadoop集群通过离线的方式分析数据 参考着网上的分享的文章实施整合的一篇文章,实施记录 安装流程: 1.设置各个机器建的ssh 无密码登陆 2.安装JDK 3. ...
- react实战第一步--搭建项目
使用 create-react-app 快速构建 React 开发环境 1.cnpm install -g create-react-app 2.create-react-app react2(rea ...
- redis笔记总结之redis介绍
一.Redis介绍: redis的发展历史简单的理解为因为使用类似MySql这类关系型数据库不方便进而开发的开源的.轻量级的.非关系型的,直到现在一直不断完善的一款NoSql数据库.具体的介绍大家可以 ...