Mysql的存储过程:
是一组为了完成特定功能的sql语句的集合,类似于函数
写好了一个存储过程之后,我们可以像函数一样随时调用sql语句
主要用在,复杂的,需要很多sql语句联合执行完成的任务
存储过程在执行上比sql语句执行速度要快,效率也更高
创建存储过程:
delimiter $$ 将语句的结束符号从分号,临时改变两个$$
create procedure proc () 创建存储过程,proc不能重复,在当前库中唯一,()里面不定义任何方法
BEGIN 过程体开始的关键字
select * from info2; begin后面更上的是需要执行的sql语句
end $$ 表示整个语句结束,和上面的定义开始符号一一对应
delimiter; 将结束语句的分号恢复
Delimiter作用保证整个存储过程中的sql语句能够被完整执行
delimiter $$
create procedure proc ()
BEGIN
select * from info2;
end $$
delimiter;
查看存储过程
show procedure status where db='wang';
show procedure status like '%proc%';
看表
call proc;
删除存储过程
drop procedure if exists proc;
存储过程中参数有三种运用方式:
- in 输入参数,调用者向存储过程传入值
- Out 输出参数,表示存储过程向调用者传出值(可以返回多个值)
- INOUT表示调用者向存储过程传入值,存储过程对传入值可能进行额外的操作,返回给调用者
In方式:
delimiter $$
create procedure test1 (in uname char(20) )
begin
select * from info where name = uname;
select * from info;
end $$
delimiter;
传参:
call test1('刘备');
补充:
添加一个新的语句
In这种方式,主要用于数据清洗和执行数据入库,分析用户行为
Out方式:
Out 输出参数,表示存储过程向调用者传出值(可以返回多个值)
delimiter $$
create PROCEDURE test2 (out num int)
BEGIN
set num = 100;
end $$
delimiter;
已插入
(inout)输入和输出参数:
INOUT表示调用者向存储过程传入值,存储过程对传入值可能进行额外的操作,返回给调用者
delimiter $$
create PROCEDURE test3 (inout str varchar(10)) --一定要更上字符类型
BEGIN
select str; --显示输入的字符
set str = concat(str, '_三国'); --让传入的字符串做一个拼接
select str; --加工之后字符串
end $$
Delimiter;
set @str='关羽'; --传参
call test3(@str) --调用
update info set name=@str where id = 1; --把结果调用
In:先传入,定义变量的值,初始值
Call test3: 调用存储过程,把变量的值传入存储过程
最后得到结果
存储过程中的控制语句:
语法:
delimiter $$
create procedure test4(inout num int)
BEGIN
if num >=10 THEN
set num=num-10;
ELSE
set num=num*2;
end if; --结束符,结束if条件语句
set num=num;
end $$ --结束整合存储过程的语句
delimiter;
set @num=19;
call test5(@num);
update info set id = @num where score =99;
调用多个参数:范围的方式匹配,完成传参-----写入表中:注意红色语法部分
delimiter $$
create PROCEDURE test7 (inout score int, out grade VARCHAR(15))
BEGIN
if score BETWEEN 85 and 100 THEN
set grade = '优秀';
elseif score between 60 and 84 THEN
set grade = '一般';
ELSE
set grade = '不及格';
end if;
select grade;
end $$
delimiter;
set @score=90;
call test7(@score,@grade);
update info set score=@score,pass=@grade where id = 1;
while循环语句:
delimiter $$
create PROCEDURE test6 (out result int)
BEGIN
declare a int;
declare i int;
set a=10;
set i=1;
while i<=10 DO
set a=a+10;
set i=i+1;
end while;
set result = a;
end $$
delimter;
set @result=110;
call test6(@result)
select @result
注意点:使用存储过程中,在内部变量不需要加0,外部使用和复制要0,引用变量在存储过程中begin之后声明变量:delete a int; declare i int; 声明变量要加数据类型。
要想使用存储过程里面的结果,必须要out才能传出出参数,在声明存储变量是,要定义好传参的传参方式