存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
MySQL数据库中的存储过程和函数中允许包含DDL(Data Definition Language数据库模式定义语言,是用于描述数据库中要存储的现实世界实体的语言)语句,也允许在存储过程中执行提交(commit,即确认之前的修改)或者回滚(rollback,即放弃之前的修改),但是存储过程和函数中不允许执行LOAD DATA INFILE 语句。此外,存储过程和函数中可以调用其他存储过程或者函数。
存储过程的优点:
(1)增强SQL语言的功能和灵活性。
(2)标准组件式编程。
(3)较快的执行速度。
(4)减少网络流量。
(5)作为一种安全机制来充分利用。
MySQL存储过程的创建语法:
CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型 [,[IN|OUT|INOUT] 参数名 数据类型…]])[特性...]过程体
例如:
DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END //
DELIMITER ;
MySQL数据库默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,编译过程会报错。
所以要事先用“DELIMITER //”语句修改当前段分隔符为“//”,也就是说,此语句之后的所有语句以“//”作为分隔符,让编译器把第一次出现的“//”和第二次出现的“//”之间的全部内容当做存储过程的代码,不会执行这些代码。
而后面的“DELIMITER ;”意为把分隔符还原为默认的“;”(注意在DELIMITER与;之间要有一个空格)。
存储过程的参数类型:
IN:表示该参数值必须在调用存储过程时指定,在存储过程中这个值是不能被返回的。
OUT:表示该参数的值可以被存储过程改变,并且可以返回。
INOUT:表示该参数在调用时指定,并且可以被改变和返回。
调用存储过程需要用call命令和存储过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看下面例子。
例如:
call proc_name() -- 无参数
call proc_name(1,2) -- 有参数,参数全为in(默认值)
DECLARE @t1 INT; -- 有参数,有in,out,inout
DECLARE @t2 INT default 3;
call proc_name(1,2,@t1,@t2)