mysql的存储进程
存储进程是数据库的一个重要的功能,MySQL 5.0之前其实不支持存储进程,这使得MySQL在利用上大打折扣。好在MySQL 5.0开始支持存储进程,这样便可以大大提高数据库的处理速度,同时也能够提高数据库编程的灵活性。
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 ;
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;
分隔符
MySQL默许以";"为分隔符,如果没有声明分割符,则编译器会把存储进程当做SQL语句进行处理,因此编译进程会报错,所以要事前用“DELIMITER //”声明当前段分隔符,让编译器把两个"//"之间的内容当作存储进程的代码,不会履行这些代码;“DELIMITER ;”的意为把分隔符还原。
参数
存储进程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储进程的参数用在存储进程的定义,共有三种参数类型,IN,OUT,INOUT:
IN参数的值一定要在调用存储进程时指定,在存储进程中修改该参数的值不能被返回,为默许值OUT:该值可在存储进程内部被改变,并可返回INOUT:调用时指定,并且可被改变和返回
进程体
进程体的开始与结束使用BEGIN与END进行标识。
1、简单实例
create procedure demo.p_test1()
begin
— 使用 declare语句声明一个变量
declare id int default 0;
declare name varchar(50) default ”;
— 使用set语句给变量赋值
set id=7521;
— 将users表中id=1的名称赋值给username
select ename into name from demo.emp where empno=id;
— 返回变量
select name;
end;
begin
— 使用 declare语句声明一个变量
declare id int default 0;
declare name varchar(50) default ”;
— 使用set语句给变量赋值
set id=7521;
— 将users表中id=1的名称赋值给username
select ename into name from demo.emp where empno=id;
— 返回变量
select name;
end;
2、通过游标遍历结果集
create table demo.test(
id int,
cnt varchar(50)
)
id int,
cnt varchar(50)
)
create procedure demo.p_test2()
— 通过游标遍历结果集
begin
— 声明变量
declare id int default 0;
declare name varchar(50) default ”;
declare done boolean default 1;
— 声明游标
declare rs cursor for SELECT deptno,dname from demo.dept ;
— 定义异常:
declare continue handler for SQLSTATE ‘02000’ SET done = 0;
— 打开游标
open rs;
delete from demo.test;
while done do
begin
fetch rs into id,name;
INSERT into demo.test SELECT e.deptno,count(1) from demo.emp e WHERE e.deptno =id group by e.deptno;
end ;
end while;
— 关闭游标
close rs;
end;
— 通过游标遍历结果集
begin
— 声明变量
declare id int default 0;
declare name varchar(50) default ”;
declare done boolean default 1;
— 声明游标
declare rs cursor for SELECT deptno,dname from demo.dept ;
— 定义异常:
declare continue handler for SQLSTATE ‘02000’ SET done = 0;
— 打开游标
open rs;
delete from demo.test;
while done do
begin
fetch rs into id,name;
INSERT into demo.test SELECT e.deptno,count(1) from demo.emp e WHERE e.deptno =id group by e.deptno;
end ;
end while;
— 关闭游标
close rs;
end;
call demo.p_test2();
SELECT * from demo.test;
总结
到此这篇关于MySQL存储进程讲授的文章就介绍到这了,更多相关MySQL存储进程内容请搜索之前的文章或继续浏览下面的相关文章希望大家以后多多支持!
本文来源:https://www.yuntue.com/post/149624.html | 云服务器网,转载请注明出处!

微信扫一扫打赏
支付宝扫一扫打赏