Mysql学习笔记(八)
存储过程(Stored Procedure)
(1)是一组为了完成特定功能的 SQL语句集,是利用 SQL Server 所提供的 Transact-SQL 语言所编写的程序。经编译后存储在数据库中。存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由 流控制和 SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。
(2) 存储过程的优点:
➢ 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一 般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
➢ 当对数据库进行复杂操作时(如对多个表进行 Update、Insert、Query、Delete 时), 可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
➢ 存储过程可以重复使用,可减少数据库开发人员的工作量。
➢ 安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
(1)创建存储过程
CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body
说明:
✓ DEFINER:指明使用存储过程的访问权限。
✓ sp_name: 存储过程名称。
✓ proc_parameter: [ IN | OUT | INOUT ] param_name type
☆ in:表示向存储过程中传入参数;存储过程默认为传入参数,所以参数 in 可以省略;
☆ out:表示向外传出参数;
☆ inout:表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程;
☆ param_name:参数名;
☆ type:参数的类型,可以为 mysql 任何合法得数据类型。
☆ 如果有多个参数,参数之间可以用逗号进行分割。
✓ Characteristic: LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string'
☆ 这个 LANGUAGE SQL 子句是没有作用的。仅仅是为了说明下面过程的主体 使用 SQL 语言编写。这条是系统默认的。
☆ 如果程序或线程总是对同样的输入参数产生同样的结果,则被认为它是“确定 的 ” ( DETERMINISTIC ), 否 则 就 是 “ 非 确 定 ” 的 。 默 认 的 就 是 NOT DETERMINISTIC。 ☆ CONTAINS SQL 表示子程序不包含读或写数据的语句。
☆ NO SQL 表示子程序不包含 SQL 语句。
☆ READS SQL DATA 表示子程序包含读数据的语句,但不包含写数据的语句。
☆ MODIFIES SQL DATA 表示子程序包含写数据的语句。如果这些特征没有明 确给定,默认的是 CONTAINS SQL。
☆ SQL SECURITY 特征可以用来指定子程序该用创建子程序者的许可来执行, 还是使用调用者的许可来执行。默认值是 DEFINER。
☆ COMMENT 子句是一个 MySQL 的扩展,它可以被用来描述存储程序。这个 信息被 SHOW CREATE PROCEDURE 和 SHOW CREATE FUNCTION 语句来 显示。存储子程序不能使用 LOAD DATA INFILE。
☆ 特 征 子 句 也 有 默 认 值 , 如 果 省 略 了 就 相 当 于 : LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT ''
✓ routine_body: 包含合法的 SQL 过程语句。可以使用复合语句语法, 复合语 句可以包含声明,循环和其它控制结构语句。
(2)修改存储过程
ALTER {PROCEDURE} sp_name [characteristic ...]
说明:
✓ 这个语句可以被用来改变一个存储程序的特征。必须用 ALTER ROUTINE 权限
才可用此子程序。这个权限被自动授予子程序的创建者。
✓ 在 ALTER PROCEDURE 语句中,可以指定超过一个的改变。
(3)删除存储过程
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
(4)显示存储过程
SHOW CREATE {PROCEDURE} sp_name
似于 SHOW CREATE TABLE,它返回一个可用来重新创建已命名子程序的确切字符串。
(5)显示存储过程特征
SHOW {PROCEDURE} STATUS [LIKE 'pattern']
它返回子程序的特征,如数据库,名字,类型,创建者及创建和修改日期。
(6)调用存储过程
CALL sp_name([parameter[,...]])
调用一个先前用 CREATE PROCEDURE 创建的程序。
CALL 语句可以用声明为 OUT 或的 INOUT 参数的参数给它的调用者传回值。它也“返回”
受影响的行数,客户端程序可以在 SQL 级别通过调用 ROW_COUNT()函数获得这个数,从
C 中是调用 the mysql_affected_rows() C API 函数来获得。
(7)存储过程的变量:
声明变量:DECLARE var_name[,...] type [DEFAULT value]
变量赋值,SET 语句: SET var_name = expr [, var_name = expr] ...
变量赋值,SELECT ... INTO 语句 SELECT col_name[,...] INTO var_name[,...] table_expr
(8)存储过程的语句
BEGIN...END 复合语句 [begin_label:] BEGIN [statement_list] END [end_label] 存储子程序可以使用 BEGIN ... END 复合语句来包含多个语句。statement_list 代表一个或多个语句的 列表。statement_list 之内每个语句都必须用分号(;)来结尾。 复合语句可以被标记。除非 begin_label 存在,否则 end_label 不能被给出,并且如果二者都存在,他们必须是同样的。
(9)存储过程的注释语法
mysql 存储过程可使用两种风格的注释
➢ 双模杠:--,该风格一般用于单行注释
➢ c 风格:/* 注释内容 */, 一般用于多行注释
(10)存储过程的条件和异常处理程序
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
这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,
指定的语句被执行。
对一个 CONTINUE 处理程序,当前子程序的执行在执行处理程序语句之后继续。对
于 EXIT 处理程序,当前 BEGIN...END 复合语句的执行被终止。UNDO 处理程序
类型语句还不被支持。
SQLWARNING 是对所有以 01 开头的 SQLSTATE 代码的速记。
NOT FOUND 是对所有以 02 开头的 SQLSTATE 代码的速记。
SQLEXCEPTION 是对所有没有被 SQLWARNING 或 NOT FOUND 捕获的 SQLSTATE
代码的速记。
网友评论