MySQL存储过程(PROCEDURE)(一)
一、定义与目的:
定义:存储过程是数据库 SQL 语言层面的代码封装与重用(是数据库中存储复杂程序,以便外部程序调用的一种数据库对象);
目的:我们为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行;
二、存储过程的特点:
- 存储过程可封装,并隐藏复杂的商业逻辑。
- 存储过程可以回传值,并可以接受参数。
- 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
- 存储过程可以用在数据检验,强制实行商业逻辑等。
三、创建存储过程:
1 DELIMITER $$ -- 修改 分隔符为 && 2 3 CREATE 4 /*[DEFINER = { user | CURRENT_USER }]*/ -- 定义谁有权限来执行、 DEFINER 表示按定义者拥有的权限来执行 、INVOKER 表示用调用者的权限来执行 5 PROCEDURE `xx_database`.`p_test`() -- 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...] 过程体 6 /*LANGUAGE SQL 7 | [NOT] DETERMINISTIC 8 | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } 9 | SQL SECURITY { DEFINER | INVOKER } 10 | COMMENT 'string'*/ 11 BEGIN 12 13 END$$ 14 15 DELIMITER ;
四、参数:
存储过程中存在三种参数:输入、输出、输入输出:
IN:参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT:该值可在存储过程内部被改变,并可返回
INOUT:调用时指定,并且可被改变和返回
示例:
1 -- IN 型参数: 2 DELIMITER && 3 create procedure p_test(IN p_id int) 4 begin 5 select p_id; 6 set p_id = 22; -- 将 p_id 赋值为 22 7 select p_id; 8 end&& 9 DELIMITER ; 10 11 -- OUT 型参数: 12 DELIMITER && 13 create procedure p_test(OUT p_id int) 14 begin 15 select p_id; 16 set p_id = 22; -- 将 p_id 赋值为 22 17 select p_id; 18 end&& 19 DELIMITER ; 20 21 -- INOUT 型参数: 22 DELIMITER && 23 create procedure p_test(INTOUT p_id int) 24 begin 25 select p_id; 26 set p_id = 22; -- 将 p_id 赋值为 22 27 select p_id; 28 end&& 29 DELIMITER ; 30 31 -- 调用 p_test() 32 set @P_id = 100; -- @p_id 为用户变量,用户可以在后面的代码里引用它 33 call p_test(@p_id); -- 存储过程的调用 34 select @p_id; -- IN型不会影响@p_id 的值,而OUT、INOUT会将@p_id的值改变,具体数值有过程体来定
五、变量的定义:
1 DECLARE 变量名1[,变量名2...] 数据类型 [默认值];
数值型:
日期、时间类型:
字符串类型:
六、存储过程的修改:
1 ALTER PROCEDURE sp_name 2 [{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } 3 | SQL SECURITY { DEFINER | INVOKER } 4 | COMMENT 'string']
名词解释:
sp_name:参数表示存储过程或函数的名称;
characteristic:参数指定存储函数的特性。
CONTAINS SQL:表示子程序包含SQL语句,但不包含读或写数据的语句;
NO SQL:表示子程序中不包含SQL语句;
READS SQL DATA:表示子程序中包含读数据的语句;
MODIFIES SQL DATA:表示子程序中包含写数据的语句。
SQL SECURITY { DEFINER | INVOKER }:指明谁有权限来执行,DEFINER:表示只有定义者自己才能够执行;INVOKER:表示调用者可以执行。
COMMENT 'string':是注释信息。
示例:
ALTER PROCEDURE CountProc MODIFIES SQL DATA SQL SECURITY INVOKER ;