存储过程与存储函数:MySQL中提供存储过程与存储函数机制,我们姑且将存储过程和存储函数合称为存储程序。与一般的SQL语句需要先编译然后立即执行不同,存储程序是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,当用户通过指定存储程序的名字并给定参数(如果该存储程序带有参数)来调用才会执行。
存储函数的限制比较多,例如不能用临时表,只能用表变量,而存储过程的限制较少,存储过程的实现功能要复杂些,而函数的实现功能针对性比较强。
返回值不同。存储函数必须有返回值,且仅返回一个结果值;存储过程可以没有返回值,但是能返回结果集(out,inout)。
调用时的不同。存储函数嵌入在SQL中使用,可以在select 存储函数名(变量值);存储过程通过call语句调用 call 存储过程名。
参数的不同。存储函数的参数类型类似于IN参数,没有类似于OUT和INOUT的参数。存储过程的参数类型有三种,IN、out和INOUT;in:数据只是从外部传入内部使用(值传递),可以是数值也可以是变量;out:只允许过程内部使用(不用外部数据),给外部使用的(引用传递:外部的数据会被先清空才会进入到内部),只能是变量;inout:外部可以在内部使用,内部修改的也可以给外部使用,典型的引用 传递,只能传递变量。
语法:
CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...]
BEGIN
过程体
END
创建一个名为count_of_student的存储过程,统计student表的字数
delimiter
$$#如果已经存在这个存储过程名字的话,丢弃掉这个存储过程。
DROP PROCEDURE IF EXISTS count_of_student $$
create procedure count_of_student(OUT count_num INT)
reads sql data
begin
select count(*) into count_num from student;
end$$
语法:
CREATE FUNCTION function_name(param1,param2,…)
RETURNS datatype
[NOT] DETERMINISTIC statements
SQL
创建一个名为t_employee的数据表并插入记录
CREATE TABLE t_employee(
id INT(4),
name VARCHAR(20),
gender VARCHAR(6),
age INT(4),
salary INT(6),
deptno INT(4));
use mydatabases;
INSERT INTO t_employee(id,name,gender,age,salary,deptno)
VALUES (1001,'Alici Florric','Female',33,1000,1),
(1002,'Kalinda Sharma','Female',31,9000,1),
(1003,'Cary Agos','Male',27,9000,1),
(1004,'Eli Gold','Male',44,9000,2),
(1005,'Peter Florric','Male',24,7000,3),
(1006,'Diane Lockhart','Female',34,8000,3),
(1007,'Maia Rindell','Female',25,9000,2);
创建一个名为func_employee的函数,该函数拥有一个类型为INT(4)并且名为id的参数,返回值为INT(6)类型。SELECT语句从表t_employee中查询字段id值等于所传入参数id值的记录,同时将该记录的字段salary的值返回。
CREATE FUNCTION func_employee(id INT(4))
RETURNS INT(6)
COMMENT '查询每个员工工资'
BEGIN
RETURN (SELECT salary
FROM t_employee
WHERE t_employee.id=id);
END;
$$
使用CALL语句来都调用存储过程,语法如下:
CALL sp_name([parameter[,……]]);
SELECT function_name([parater[,……]]);
SHOW {PROCEDURE | FUNCTION}STATUS[LIKE 'pattern']
SHOW CREATE{PROCEDURE | FUNCTION}sp_name;
修改存储过程和存储函数语法
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic …]
sp_name表示存储过程或函数的名称
characteristic参数指定存储过程或函数的特性
5、删除存储过程与存储函数
语法:
DROP {PROCEDURE | FUNCTION } [IF EXISTS] sp_name