存储过程(Stored Procedure):是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
创建存储过程:
create procedure 存储过程名 (参数列表)
begin
sql语句代码块
end
被括号包围的参数列必须是存在的,没有参数则置空()。
实例:
delimiter //
create procedure proc(out o int)
begin
select count(*) into o from t;
end
//
delimiter;
(1)”delimiter“为分隔符,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
(2)存储过程可能有输入(IN)、输出(OUT)和输入输出(INOUT)参数,多个参数用逗号分隔。
(3)过程体的开始与结束使用begin与end标识。
参数:
存储过程的定义共有三种参数类型,分别为IN、OUT和INOUT,形式如下:
create procedure 存储过程名([IN|OUT|INOUT] 参数名 数据类型,...)
IN输入参数:该参数的值由调用过程时指定,在存储过程中修改该值不能被返回。
OUT输出参数:该参数的值在存储过程中可以被修改并返回。
INOUT输入输出参数:该参数的值由调用过程时指定,在存储过程中可以被修改并返回。
示例:
(1)IN参数
DELIMITER //
CREATE PROCEDURE demo_in(IN p_in INT)
BEGIN
SELECT p_in;
SET p_in = 2;
SELECT p_in;
END;
//
DELIMITER;
执行:
SET @p_in = 1;
CALL demo_in(@p_in);
p_in
--------
1
p_in
--------
2
SELECT @p_in;
@p_in
--------
1
(2)OUT参数
DELIMITER //
CREATE PROCEDURE demo_out(OUT p_out INT)
BEGIN
SELECT p_out;
SET p_out = 2;
SELECT p_out;
END;
//
DELIMITER;
执行:
SET @p_out = 1;
CALL demo_out(@p_out);
p_out
--------
(NULL)
p_out
--------
2
SELECT @p_out;
@p_out
--------
2
(3)INOUT参数
DELIMITER //
CREATE PROCEDURE demo_inout(INOUT p_inout INT)
BEGIN
SELECT p_inout;
SET p_inout = 2;
SELECT p_inout;
END;
//
DELIMITER;
执行:
SET @p_inout = 1;
CALL demo_inout(@p_inout);
p_inout
---------
1
p_inout
---------
2
SELECT @p_inout;
@p_inout
----------
2
变量:
(1)变量定义:
DECLARE name datatype [Default value];
其中,datatype为mysql的数据类型,如int,float,date,varchar(length)
(2)变量赋值:
SET 变量名 = 表达式值 [,variable_name = expression ...]
(3)用户自定义变量:
例如:select 'Hello world!' into @x ;
set @y='Hello world!';
在存储过程可以使用用户定义变量。
删除存储过程:DROP PROCEDURE IF EXISTS存储过程名
查看一个存储过程:SHOW CREATE PROCEDURE 存储过程名
查看所有存储过程:SHOW PROCEDURE STATUS
修改存储过程:ALTER PROCEDURE procedure_name [characteristic ...],这里的修改只能修改过程的特征,无法修改代码,若项修改代码,只能先删除再新建。