MySQL 5.0 版本开始支持存储过程。存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程可封装,并隐藏复杂的商业逻辑。
存储过程可以回传值,并可以接受参数。
存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
存储过程可以用在数据检验,强制实行商业逻辑等。
存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
存储过程的性能调校与撰写,受限于各种数据库系统。
MySQL数据库创建存储过程的语法如下:
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 存储过程中的关键语法如下:
(1)声明语句结束符,可以自定义
DELIMITER $$ -- 或 DELIMITER //
(2)声明存储过程
CREATE PROCEDURE demo_in_parameter(IN p_in int)
(3)存储过程开始和结束符号
BEGIN -- .... END
(4)变量赋值
SET @p_in=1
(5)变量定义
DECLARE l_int int unsigned default 4000000;
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,分别为 IN, OUT, INOUT,形式如:
CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
参数类型详解:
IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
下面通过一个实例来简单介绍存储过程创建过程,该存储过程将根据传递的用户ID返回用户名称。代码如下:
-- 创建名为 proc_getUserName 的存储过程 -- 分别定义输入参数 userId、输出参数 userName CREATE PROCEDURE `proc_getUserName`(IN `userId` int,OUT `userName` varchar(100)) BEGIN -- 根据 userId 查询指定的用户,然后使用 into 语句将查询结果放入到 userName 参数中 select `name` into userName from `user` where user_id=userId; END
我们可以使用 call 命令去调用刚刚创建的过程。如下:
-- 声明一个变量 mysql> set @userName=''; Query OK, 0 rows affected (0.00 sec) -- 调用存储过程 mysql> call proc_getUserName(1, @userName); Query OK, 1 row affected (0.00 sec) -- 查看存储过程执行结果 mysql> select @userName; +-----------+ | @userName | +-----------+ | Tom | +-----------+ 1 row in set (0.03 sec)