mysql--存储过程实战
mysql--存储过程实战
一、存储过程格式
-
desc student
-
-
delimiter //
-
CREATE PROCEDURE 名称(参数列表)
-
-
BEGIN
-
SQL语句块
-
END
-
//
-
delimiter ;
注意:
- 存储名称的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN参数。
- 参数类型要改变,可在参数名之前使用关键词 OUT或INOUT
二、创建存储过程
例子:
-
delimiter //
-
CREATE PROCEDURE pro1()
-
BEGIN
-
select * from student;
-
END
-
//
-
delimiter ;
-
call pro1();
解析:
(1)这里需要注意的是DELIMITER//和DELIMITER;两句,DELIMITER是分割符的意思,因为MySQL默认以”;”为分隔 符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当 前段分隔符,这样MySQL才会将”;”当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用”,”分割开。
(3)过程体的开始与结束使用BEGIN与END进行标识。
三、存储过程定义
- 声明变量: declare 变量名 数据类型
- 参数类型:
- in参数:输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
- OUT 输出参数:该值可在存储过程内部被改变,并可返回
- INOUT 输入输出参数:调用时指定,并且可被改变和返回
四、无参数存储实例
- 注意存储过程写好后,需要先运行一下。保存到数据库后,才可以调用这个存储过程,否则在调用的时候会报错,提示存储过程不存在。
-
delimiter //
-
CREATE PROCEDURE pro1()
-
BEGIN
-
select * from student;
-
END
-
//
-
delimiter ;
-
call pro1(); //调用无参数的存储过程
五、有参数存储过程实例
- 参数类型为 in
-
delimiter //
-
CREATE PROCEDURE pro2(s_sex VARCHAR(10))
-
BEGIN
-
select * from student where sex=s_sex;
-
END
-
//
-
delimiter ;
-
-
set @s_sex='男';
-
CALL pro2(@s_sex);
pro2存储过程使用了in类型的参数。在调用pro2存储过程时候,需要先给s_sex参数赋值(set @s_sex='男';),然后再调用pro2存储过程时将s_sex传入进去(CALL pro2(@s_sex);)。
- 参数类型为 out
-
delimiter //
-
CREATE PROCEDURE pro3(out s_name varchar(20))
-
BEGIN
-
DECLARE s_name varchar(12);
-
DECLARE department varchar(20);
-
set s_name='测试1';
-
set department='测试地址1';
-
INSERT INTO student (s_name,department) values(s_name,department);
-
END
-
//
-
delimiter ;
-
set @s_name='张三强';
-
CALL pro3(@s_name);
-
select * from student;
测试结果:
调用pro3存储过程时给s_name参数赋值,但是在运行存储过程时,s_name参数值被改变了,说明了out类型的该值可在存储过程内部改变,并可以返回.往往是用于获取存储过程里的参数值
- 参数类型为inout
-
delimiter //
-
CREATE PROCEDURE pro4(out s_name varchar(12),INOUT sex varchar(6),IN department varchar(13))
-
BEGIN
-
DECLARE sex VARCHAR(6)DEFAULT('男');
-
set s_name='王明';
-
set department='雄安新区';
-
INSERT INTO student(s_name,sex,department)VALUES (s_name,sex,department);
-
END
-
//
-
delimiter ;
-
set @s_name='张三';
-
set @department='北京';
-
set @sex='女';
-
CALL pro4(@s_name,@department,@sex);
-
select * from student;
运行结果:
调用pro4存储过程,sex参数为inout类型在存储过程运行过程中改变了值的结果。
六、存储过程if判断语句
- if条件使用格式
-
if 条件 then
-
执行语句
-
elseif 条件 then
-
执行语句
-
else
-
执行语句
-
end if;
存储过程if判断实例
-
delimiter //
-
CREATE PROCEDURE pro5(sex varchar(12))
-
BEGIN
-
DECLARE s_name varchar(12);
-
DECLARE department varchar(21)DEFAULT '北京';
-
IF sex='男' THEN
-
set s_name='张三';
-
INSERT INTO student (s_name,department) VALUES (s_name,department);
-
ELSE
-
set s_name='张丽丽';
-
INSERT INTO student (s_name,sex,department) VALUES (s_name,sex,department);
-
END IF;
-
END
-
//
-
delimiter ;
pro5存储过程判断sex参数男,女。来改变插入数据的s_name名称。如果sex为男,则插入数据的s_name=张三。如果sex为女,则插入数据的s_name=张丽丽。
①、 sex=男,执行结果
-
set @sex='男';
-
CALL pro5(@sex);
-
select * FROM student;
②、sex=女,执行结果
-
set @sex='女';
-
CALL pro5(@sex);
-
select * FROM student;
七、存储过程while循环
-
while 条件 do
-
sql语句
-
end while;
- while循环实例
-
delimiter //
-
CREATE PROCEDURE pro6(count int)
-
BEGIN
-
DECLARE s_name varchar(12);
-
DECLARE department varchar(20);
-
-
DECLARE i int; -- 设置一个自增长变量i
-
set i=1; -- 自增长i赋值
-
WHILE i<=count DO
-
SELECT CONCAT('变量i的值=',i); -- 查看每次循环i的值
-
set s_name=CONCAT('测试',i); -- CONCAT()是个函数
-
set department='测试地址1';
-
-
INSERT INTO student (s_name,department) values(s_name,department);
-
set i=i+1; -- 自增长i加1
-
END WHILE;
-
END
-
//
-
delimiter ;
CALL pro6(3);
pro6存储过程使用了while循环,在调用的时候需要传入循环的次数,结果会创建相应次数的数据。
八、查询存储过程
- 查询有多少个存储过程:
SHOW PROCEDURE STATUS;
- 查询某个存储过程详细信息
-
SHOW CREATE PROCEDURE 存储过程名称;
-
select * FROM information_schema.ROUTINES WHERE ROUTINE_NAME='存储过程名称';
文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。
原文链接:brucelong.blog.csdn.net/article/details/79786539
- 点赞
- 收藏
- 关注作者
评论(0)