# Mysql 存储过程
存储过程是在数据库中定义一些 SQL 语句的集合,可以直接去调用这些存储过程来执行已经定义好的 SQL 语句。
触发器和存储过程相似,都是嵌入到 MySql 中的一段程序。触发器是由事件来触发某个操作。当数据库执行这些事件时,就会激活触发器来执行相应的操作。
优点:
- 存储过程可封装,并隐藏复杂的商业逻辑。
- 存储过程可以回传值,并可以接受参数。
- 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
- 存储过程可以用在数据检验,强制实行商业逻辑等。
缺点:
- 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
- 存储过程的性能调校与撰写,受限于各种数据库系统。
# 存储过程
数据库的实际操作中,经常会有需要多条 SQL 语句处理多个表才能完成的操作。例如,为了确认学生能否毕业,需要同时查询学生档案、成绩表和从何表,此时就需要使用多条 SQL 语句来针对这几个数据表完成处理要求。存储过程就是这样一组为了完成特定功能的 SQL 语句的集合。
使用存储过程的目的是将经常或复杂的工作预先使用 SQL 语句写好,并用一个指定的名称存储起来,这个过程经编译和优化由存储在数据库服务器中,因此成为存储过程。当以后需要数据库提供与已定义好的存储过程的功能相同的服务时,只需要调用 “CALL 存储过程名字” 即可自动完成。
常用操作数据库的 SQL 语句在执行的时候需要先编译,然后执行。存储过程则采用另一种方式来执行 SQL 语句。
一个存储过程即一个可编程的函数,它可以在数据库中创建并保存,一般由 SQL 语句和一些特殊控制结构组成。当希望在不同的应用程序或平台上执行相同的特定功能时,存储过程尤为合适。
MySql5.0版本以前并不支持存储过程。
存储过程时数据库中的一个重要功能,存储过程可以用来转换数据、数据迁移、制作报表,它类似于编程语言,一次执行成功,就可以被调用,完成指定的功能操作。
使用存储过程不仅可以提高数据的访问效率,同时也可以提高数据库使用的安全性。
对于调用者来说,存储过程封装了 SQL 语句,调用者无需考虑逻辑功能的具体实现过程。只是简单调用即可,它可以被 Java 和 C# 等编程语言调用。
# 创建存储过程
创建存储过程使用 create procedure 语句,语法格式如下
create procedure <过程名> ([过程参数[,...]]) <过程体>
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
routine_body:
Valid SQL routine statement
[begin_label:] BEGIN
[statement_list]
……
END [end_label]
Mysql 存储过程中的关键语法
声明语句结束符,可以自定义
DELIMTER &&
或
DELIMTER //在 Mysql 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的。然而,在创建存储过程时,存储过程体可能包含有多条 SQL 语句,这些 SQL 语句如果仍以分号作为语句结束符号,那么 MySQL 服务器在处理存储过程时,会以遇到的第一条 SQL 语句结尾处的分号作为整个程序的额结束符,而不再去处理存储过程体后面的 SQL 语句,这样显然不行。为了解决以上问题,通常使用 DELIMITER 命令将结束命令修改为其他字符。
语法说明如下:
'$$' 是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个 “?” 或两个 “¥“ 等。
当使用 DELIMITER 命令时,应该避免使用反斜杠 "" 字符,因为它是 MySQL 的转义字符。在 MySQL 命令行客户端使用:
mysql> DELIMITER ??
执行该命令后,任何命令、语句或程序的结束标志就换为两个问号 "??“了。
注意:DELIMITER 和分号 “;” 之间一定要有一个空格(使用分号”;" 作为 MySQL 语句结束符)。
声明存储过程
create procedure demo_in_parameter(IN pin int)
存储过程开始和结束符号
BEGIN
…
END过程体是存储过程的主体部分,包含在过程调用的时候必须执行的 SQL 语句。这个部分以关键字 BEGIN 开始,以关键字 END 结束。若存储过程体中只有一条 SQL 语句,则可以省略 BEGIN-END 标志。
变量赋值
SET @pin=1
变量定义
declare l_int int unsigned default 400;
创建 Mysql 存储过程
create procedure 存储过程名 (参数)
创建存储过程体
create function 存储函数名 (参数)
默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀。
# 存储过程的参数
其中,过程参数是存储过程的参数列表。MySQL 存储过程支持三种类型的参数,即输入参数,输出参数和输入 / 输出参数,分别用 IN、OUT 和 INOUT 三个关键字标识。其中输入参数可以传递给一个存储过程,输出参数用于存储过程需要返回一个操作结果的情形,而输出 / 输出参数既可以充当输入参数也可以充当输出参数。格式如下
[ IN | OUT | INOUT ] <参出名> <类型>
在创建存储过程时,必须具有 create routine 权限。
例如:
mysql> DELIMITER //
mysql> CREATE PROCEDURE GetScoreByStu
-> (IN name VARCHAR(30))
-> BEGIN
-> SELECT student_score FROM tb_students_score
-> WHERE student_name=name;
-> END //
Query OK, 0 rows affected (0.01 sec)
# 1.2 查看存储过程
SHOW PROCEDURE STATUS LIKE 存储过程名;
也可以查看存储过程的定义,语法格式如下
SHOW CREATE PROCEDURE 存储过程名
# 1.3 修改存储过程
# 1.4 执行 Sql 语句
PREPARE statement_name FROM sql_statement -- 使用 PREPARE 语句准备要执行的SQL语句,statement_name 是语句的名称, sql_statement 是要执行的SQL语句。
EXECUTE statement_name USING @variable_name -- 使用 EXECUTE 语句执行准备好的SQL语句,statement_name 是语句的名称, @variable_name 是要传递给SQL语句的参数。
DEALLOCATE PREPARE statement_name -- 使用 DEALLOCATE PREPARE 语句释放已准备的SQL语句,statement_name 是要释放的语句的名称。