第十六章 存储过程
•[ NOT ] DETERMINISTIC: 指明存储过程的执行结果是否为确定的。 设置为 “DETERMINISTIC”表示结果是确定的,即存储过程对同样的输入参
创建存储过程
数产生相同的结 果。 设置为“NOT DETERMINISTIC”则表示结果是不确 定的,即相同的输入可能得到 不同的输出。 默认为“NOT DETERMINISTIC”。
“IN”表示输入参数,使数据可以传递给一个存储过程;“OUT”表示 输出参数,当需要返回一个答案或结果时,存储过程使用输出参数;“INOUT” 表示既可以是输入,也可以是输出。当有多个参数时中间用逗号隔开,参数的 名字不要等于列的名字,否则虽然不会返回出错的消息。数据类型可以是 MySQL 数据库的任意数据类型。
创建存储过程
③“characteristic”参数指定存储过程的特性。 “characteristic”的特 征如下:
•LANGUAGE SQL:表明编写这个存储过程的语言为 SQL 语言,目前 来讲,MySQL 存储 过程还不能用外部编程语言来编写,也就是说,这个选项 可以不指定。 将来会对其扩 展,最有可能第一个被支持的标:
✓ 理解存储过程的概念 ✓ 了解使用存储过程的优点 ✓ 掌握 MySQL 编程的基本语法 ✓ 掌握存储过程的创建、修改和删除方法 ✓ 掌握存储过程的调用方法
16. 1 存储过程的作用
在 MySQL 中,存储过程是一个可编程的函数,它在数据库中创建并 保存。 它可以有 SQL 语句(如“CREATE” “UPDATE” 和“ SELECT” 等语 句) 和一些特殊的控制结构(如“ IF- THEN-ELSE”语句)组成。 当希望在不 同的应用程序或平台上执行相同的函数,或者封装特 定功能时,存储过程是 非常有用的。 数据库中的存储过程可以看成对编程中面向对象方法 的模 拟。 它允许控制数据的访问方式。 存储过程可以由程序、触发器或者另 一个存储过程 来调用,从而激活它,实现代码段中的 SQL 语句。
使用存储过程通常有以下优点: ①存储过程能实现较快的执行速度 ②存储过程允许标准组件式编程,即模块化程序设计。 存储过程被
存储过程的作用
创建后,可以在程序 中被多次调用,而不必重新编写该存储过程的 SQL 语句 ③存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的
判断和较复杂的 运算。 ④存储过程可以被作为一种安全机制来充分利用。 系统管理员通过
•“SQL SECURITY{DEFINER| INVOKER}:指明谁有权限来执行。
创建存储过程
“ SQL SECURITY” 特征可以用来指定存储过程使用创建该存储过程的用 户(DEFINER)的许可来执行, 还是使用调用者(INVOKER)的许可来执行。 默认的是“DEFINER”。
•COMMENT ’string’:注释信息,对存储过程的描述,“string”为描述的内 容。 这个信息 可以用“SHOW CREATE PROCEDURE”语句来显示。
其中: ①sp_name 参数是存储过程的名称,默认在当前数据库中创建, 需要在特定数据库中创 建存储过程时,则要在名称前面加上数据库的名称, 格式为“db_name. sp_name”。
创建存储过程
②proc_parameter 表示存储过程的参数,存储过程可以没有参数,但用 于描述参数的括号不能省略。 “proc_parameter”中的每个参数由 3 部分组 成。 这 3 部分分别是输入输出类 型、参数名称类型和参数数据类型。 其 基本格式如下:
执行某一存储过程 的权限进行限制,能够实现对相应数据的访问权限限制, 避免了非授权用户对数据的访问, 保证了数据的安全。
⑤存储过程能减少网络流量。 针对同一个数据库对象的操作(如查询、 修改等),如果这 一操作所涉及的 SQL 语句被组织成存储过程,那么当在客 户计算机上调用该存储过程时,网 络中传送的只是该调用语句,从而大大增 加了网络流量并降低了网络负载。
“DELIMTER”语法格式如下:
语句结束标志
说明:“$$”是用户在这里定义的结束符,通常这个符号可以是一 些特殊的符号,如果 两个“#”,或两个“ ¥ ”等。 当使用“DELIMITER”命令 时,应避免使用反斜杠“ \ ”字符,因为 它是 MySQL 的转义字符。
【例 16. 1】 将 MySQL 结束符修改为两个“#”符号,并检验结果 后恢复设置。
16. 2 语句结束标志
在开始创建存储过程之前, 先介绍一个很实用的命令,即“DELIMITER” 命令。 在 MySQL 中,服务器处理语句时默认是以分号为结束标志的,但是在 创建存储过程时,存储过 程体中可能包含多个 SQL 语句,每个 SQL 语句都 是以分号结尾的,这时服务器处理程序时 到第一个分号就会认为程序结束, 这肯定是不行的。 所以在这里使用“DELIMITER”命令将 MySQL 语句的 结束标志修改为其他的符号。
•{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”。
16. 3 创建存储过程
在 MySQL 中,要进行相关操作,必须先确认用户是否具有相应的权限。 创建存储过程 需要 CREATE ROUTINE 权限,修改或者删除存储过程需要 ALTER ROUTINE 权限,执行存储过程则需要 EXECUTE 权限。
在 MySQL 中,创建存储过程的基本语法格式如下: