数据库存储过程与存储函数相关(MYSQL)

3/7/2017来源:SQL技巧人气:6333

一. 概述

存储过程是一组为了完成某特定功能的SQL语句集,其实质上就是一段存放在数据库中的代码。他可以由声明式的SQL语句(如CREATE, UPDATE 和SELECT等语句)和过程式(如IF-THEN-ELSE等)组成。 优点: 1. 可增强SQL语言的功能和灵活性。 2. 具有良好的封装性 3. 高性能 4. 可减少网络流量 5. 存储过程可作为一种安全机制来确保数据可的安全性和数据的完整性。

二. 创建存储过程

CREATE PROCEDURE sp_name ([proc_parameter[, …]]) [characteristic…] routine_body 说明如下: Sp_name: 存储过程的名称,默认在房钱数据库中创建。需要在特定数据库中创建存储过程时,则要在名称前面加上数据库的名称 比如:db_name.sp_name; Proc_parameter: 存储过程中的参数列表。其中包括三项:[IN|OUT|INOUT] param_name type. 存储过程支持三种参数,输入参数,输出参数,以及输入输出参数。对应IN OUT INOUT。 输入参数可以使数据传递给一个存储过程。输出参数用于存储过程需要返回一个操作结果的情形。而输入输出参数具有上述两种的特性。下面两项是参数名称和参数类型 Characteristic: 存储过程中的某些特征设定 ,下面分别介绍 1.COMMENT ‘string’: 用于对于存储过程的描述,其中string为描述内容,COMMENT为关键字。此信息可以通过SHOW CREATE PROCEDURE语句显示 2.LANGUAGE SQL: 指明编写此过程的语言为SQL语言,目前而言,MySQL存储过程还无法用外部编程语言来编写,也就是说,这个选项可以不选定。今后MYSQL会对其进行扩展。 3.DETERMINISTIC: 如若设置此参数,则对于同样的输入参数会产生相同的结果。 若设置为NOT DETERMINITIC ,则会产生不确定的结果。默认为后者。 4.CONTAINS SQL | NO SQL | READS SQL DATA |MODIFIES SQL DATA: CONTAINS SQL代表存储过程含读或写的数据。 NO SQL 表示存储过程不包含SQL ,语句, 下面两项分别是只含读或者只含写。 5.SQL SECURITY: 这个特征用来指定存储过程使用创建该存储过程的用户的许可来执行还是使用调用者的许可来执行。默认使用用户。

Routine_body:存储过程的主体部分 其包含了该存储过程中需要执行的SQL语句,以关键字BEGIN开始,以END 结束。这对关键字还可以嵌套使用。

三. 修改结束修饰标志

在服务器处理SQL语句的过程中,因为默认使用;结束,所以在创建存储过程中时,他一定会包含有多条的SQL语句,而如果仍以;结束的话,那么第一条SQL语句的;会作为整个程序的结束符。所以,使用DELIMITER 符号作为临时的结束修饰符 如: DELIMITER $$;

四.存储过程体

在存储过程主体内,可以使用各种SQL语句,也可以使用过程式语句,用来封装数据库中复杂的业务逻辑和处理规则,以实现数据库应用的灵活编程。

1. 声明局部变量 a) 语法: DECLARE var_name [,…] type [DEFAULT value] b) Var_name: 用于指定局部变量的名称 c) Type: 用于声明局部变量的数据类型 d) DEFAULT子句用于为局部变量指定一个默认值,默认为空(NULL) e) 使用说明: i. 局部变量只能在存储过程体内的BEGIN ..END 语句块中声明 ii. 局部变量必须在存储过程体的开头处声明 iii. 其作用范围仅限于声明它的BEGIN …END语句块中,其他块中不可使用 iv. 局部变量与用户变量不同。声明用户变量时需前加@。 2. SET 语句 使用SET 语句为局部变量赋值。 SET var_name = expr 3. SELECT … INTO 语句 a) 语法:SELECT col_name […] INTO var_name[…] table_expr b) Col_name:用于指定列名 c) Var_name;用于指定要赋值的变量 d) Table_expr: 表示SELECT 语句中FROM子句及其后面的语法部分 e) 说明:该语句返回的结果集只能有一行 4. 流程控制语句 a) 条件判断语句 i. 语法:IF serach_condition THEN statement_list [ELSEIF search_condition THEN statement_list]… [ELSE statement_list] END IF ii. Serach_condition:用于指定判断条件 iii. Statement_list:用于包含一句或多句SQL语句 iv. 只有当判断条件为真时,才会执行相应的SQL语句 v. 该流程控制语句不同于系统内置函数IF() b) 选择CASE语句 i. 语法:CASE case_value WHEN When_value THEN statement_list ELSE statement_list END CASE ii. 第二种语法: CASE WHEN search_condition THEN statement_list ….. ELSE statement_list END CASE iii. 第二种语法较为常用,并且使用起来更加方便 c) 循环语句 i. WHILE语句 ii. REPEAT语句 iii. LOOP语句 iv. 退出 1. LEAVE 结束整个循环 2. ITERATE 退出当前循环 v. 游标问题 1. 在上述文章中提到SELECT INTO语句,其结果返回的是带有值的一行数据,然而在使用SELECT 语句进行检索数据时,若该语句被成功执行,则会返回一组成为结果集的数据行,其可能拥有多行数据,这些数据无法被一行一行的处理,此时需用到游标。简而言之,游标就是一个被SELECT语句检索出来的结果集,在存储游标之后,就可以根据需要滚动或浏览器中的数据。 2. 注意: a) MYSQL中对游标的支持实在5.0版本开始的,之前的MYSQL版本无法使用游标。 b) 游标只能用在存储过程或者存储函数中,不能单独在查询操作中使用 c) 可定义多个游标,但其名称必须唯一 d) 其不是一条SELECT语句,而是SELECT检索出来的结果集 3. 声明游标 a) DECLARE cursor_name CURSOR FOR select_statement b) Cursor_name: 游标的名称 c) Select_statement: 指定一个SELECT 语句,返回一行或多行结果,不可含有INTO子句 4. 打开游标 a) 在定义游标之后,必须打开游标才能使用,这个过程实际上就是将游标连接到SELECT语句返回的结果集中 b) 语法格式:OPEN cursor_name c) 一个游标可被多次打开,由于其他用户或者应用程序可能随时更新了数据表,因此每次打开游标的结果集可能会不同 5. 读取数据 a) 对填有数据的游标,可根据需要取出数据。 b) 语法结构:FETCH cursor_name INTO var_name[,…] c) Cursor_name: 用于指定已打开的游标 d) Var_name: 用于指定存放数据的变量名 6. 关闭游标 a) 结束游标使用时,必须将其关闭 b) CLOSE cursor_name c) 每个游标不再使用时,都需要将其关闭,使用CLOSE语句将会释放游标所使用的全部资源。关闭后,如果没有再次重新打开,则该游标不能被重新使用,对于声明过的游标,则不需要再次声明,可直接使用OPEN打开, 另外,如果忘记关闭游标,MYSQL在到达END语句时会自动关闭。

五. 调用存储过程

1. 创建好存储过程后,可直接使用CALL 语句调用。 2. CALL sp_name([parameter]) i. sp_name: 指定被调用的存储过程的名称。 ii. parameter: 指定存储过程中所要使用的参数,调用语句中的参数个数必须等于存储过程中的参数个数。 iii. 当调用没有参数时,直接使用CALL sp_name即可

六. 删除存储过程

1. DROP PROCEDURE FUNCTION [IF EXISTS] sp_name 2. sp_name: 指定要删除的存储过程中的名称,其身后没有参数列表,也没有括号。

七. 存储函数与存储过程十分相似

1. 存储函数不能拥有输出函数,这是因为存储函数自身就是输出参数,而存储过程可以有输出参数 2. 可以直接对存储函数进行调用,且不需要使用CALL语句,而对于存储过程的调用,需要CALL 3. 存储函数需包含一条RETURN语句,而这条语句不被允许在存储过程中出现。