第9节-MySQL存储过程()

9.1、存储过程概述

1、存储过程的定义
   定义一段完成特定功能的SQL语句集,经编译后存储在数据库中,用户可以通过指定的存储过程名称并给出参数来执行它,这样的语句集称为存储过程。
2、存储过程的优点
2.1、存储过程是在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输,可以利用服务器的计算能力,执行速度快。
2.2、存储过程执行一次后,其执行规划就驻留在高速缓冲存储器中,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码即可,提高了系统性能。
2.3、存储过程在被创建后,可以在程序中多次调用,而不必重新编写,避免开发人员重复的编写相同的SQL语句
2.4、数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
2.5、存储过程可以用流控制语句编写,可以完成复杂的判断和较复杂的运算。
2.6、确保数据库的安全性和完整性
2.7、系统管理员通过对某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免非授权用户对数据的访问。

9.2、存储过程管理

-- 1、创建存储过程
delimiter $$
create procedure getStudentNames() 
READS SQL DATA
begin
select sname from student limit 5;
end$$
delimiter ;
-- 调用存储过程
call getStudentNames();


-- 2、创建带参数的存储过程
delimiter $$
create procedure findStudent(id varchar(20)) 
READS SQL DATA
begin
select sname from student where sno=id;
end$$
delimiter ;
-- 调用存储过程
call findStudent('95003');


-- 3、创建输入输出参数的存储过程
delimiter $$
create procedure getStudentId(in id varchar(20),out var_name varchar(20)) 
READS SQL DATA
begin
select sname into var_name from student where sno=id;
end$$
delimiter ;
-- 调用存储过程
call getStudentId('95003',@name);
select @name;


-- 4、查看存储过程
show procedure status like '%stu%';
show create procedure getStudentId;


-- 5、修改存储过程
-- 修改权限和加上注释

--- 修改权限字段
CONTAINS SQL:表示子程序包含sQL语句,但不包含读或写数据的语句; 
NO SQL:表示子程序中不包含sQL语句;
READS SQL DATA:表示子程序中包含读数据的语句; 
MODIFIES SQL DATA:表示子程序中包含写数据的语句。
DEFINER:表示只有定义者自己才能执行; 
INVOKER:表示调用者可以执行。
COMMENT 'string'是注释信息。
---

delimiter $$
alter procedure getStudentNames 
READS SQL DATA
comment 'alter procedure'
$$
delimiter ;


-- 6、删除存储过程
drop procedure getStudentNames;
————————

9.1、存储过程概述

1、存储过程的定义
   定义一段完成特定功能的SQL语句集,经编译后存储在数据库中,用户可以通过指定的存储过程名称并给出参数来执行它,这样的语句集称为存储过程。
2、存储过程的优点
2.1、存储过程是在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输,可以利用服务器的计算能力,执行速度快。
2.2、存储过程执行一次后,其执行规划就驻留在高速缓冲存储器中,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码即可,提高了系统性能。
2.3、存储过程在被创建后,可以在程序中多次调用,而不必重新编写,避免开发人员重复的编写相同的SQL语句
2.4、数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
2.5、存储过程可以用流控制语句编写,可以完成复杂的判断和较复杂的运算。
2.6、确保数据库的安全性和完整性
2.7、系统管理员通过对某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免非授权用户对数据的访问。

9.2、存储过程管理

-- 1、创建存储过程
delimiter $$
create procedure getStudentNames() 
READS SQL DATA
begin
select sname from student limit 5;
end$$
delimiter ;
-- 调用存储过程
call getStudentNames();


-- 2、创建带参数的存储过程
delimiter $$
create procedure findStudent(id varchar(20)) 
READS SQL DATA
begin
select sname from student where sno=id;
end$$
delimiter ;
-- 调用存储过程
call findStudent('95003');


-- 3、创建输入输出参数的存储过程
delimiter $$
create procedure getStudentId(in id varchar(20),out var_name varchar(20)) 
READS SQL DATA
begin
select sname into var_name from student where sno=id;
end$$
delimiter ;
-- 调用存储过程
call getStudentId('95003',@name);
select @name;


-- 4、查看存储过程
show procedure status like '%stu%';
show create procedure getStudentId;


-- 5、修改存储过程
-- 修改权限和加上注释

--- 修改权限字段
CONTAINS SQL:表示子程序包含sQL语句,但不包含读或写数据的语句; 
NO SQL:表示子程序中不包含sQL语句;
READS SQL DATA:表示子程序中包含读数据的语句; 
MODIFIES SQL DATA:表示子程序中包含写数据的语句。
DEFINER:表示只有定义者自己才能执行; 
INVOKER:表示调用者可以执行。
COMMENT 'string'是注释信息。
---

delimiter $$
alter procedure getStudentNames 
READS SQL DATA
comment 'alter procedure'
$$
delimiter ;


-- 6、删除存储过程
drop procedure getStudentNames;