【MYSQL笔记】使用存储过程

注:存储过程能在5.0或者更高的版本中使用。

存储过程

将多个SQL语句组合成一个只需要使用命令"call xx"就能执行的集合,该集合就称作存储过程。

存储表示保存,过程表示步骤。

也就是说存储过程就是将一系列步骤归纳并存储起来的集合。

因为可以自动执行事先准备好的命令,所以处理效率很高。

但是,在存储重要数据中,执行没有经过充分验证的存储过程是非常危险的。

创建存储过程:

create procedure 存储过程名()
begin
SQL语句1
SQL语句2
end

从begin到end的内容是存储过程的主体。

分隔符的问题:

因为存储过程的内容是普通的SQL语句,所以需要在命令的末尾添加分隔符 ;

begin
sql1;
sql2;
end

这样create procedure命令就会在存储过程不完整的状态下执行。因为MYSQL监视器中一旦输入了分隔符,不管是什么内容,都会先执行分隔符之前的部分。

解决方法:修改分割符的设置

在创建存储过程中,需要事先将分隔符从;修改为其他符合,一般使用 //

delimiter //

例:创建一个存储过程执行显示tb和tb1

delimiter //
create procedure pr1()
begin
select * from tb;
select * from tb1;
end
//delimiter ;

执行存储过程:

例:调用上一例的pr1

call pr1;

创建带参数的存储过程:

create procedure 存储过程名(参数名 数据类型);

例:创建一个显示销售额大于等于指定值的记录.并执行存储过程

delimiter //
create procedure pr(d int)
begin
select * from tb where sales>=d;
end


call pr(200); 

注:在参数前面加上in也会得到相同的结果(in d int);

显示存储过程的内容:

show create procedure pr;

 删除存储过程

drop procedure 存储过程名;

 存储函数:存储函数的思考方式和操作方法与存储过程基本相同。与存储过程唯一不同的是,存储函数在执行后会返回一个值。

存储函数可以作为函数工作,可以使用存储函数创建自定义函数。所以存储函数又叫用户自定义函数。

存储函数返回的值可以在select 和update等命令中和普通函数一样使用。

create function 存储函数名(参数 数据类型)returns 返回值的数据类型
begin
SQL语句
return 返回值 表达式
end

声明变量:

declare 变量名 变量类型;

给变量赋值:

a into b;//b=a;

练习:使用存储函数计算标准体重

标准体重=身高*身高(cm)*22/10000

delimiter //
create function fu1(height int) returns double
begin
return height*height*22/10000;
end
//
delimiter;

select fu1(174);

 练习:返回sales列的平均值

delimiter //
create function fun2() return double
begin
declare r double;
select avg(sales) into r from tb;
return r;
end
//
delimiter ;

select fun2();

显示存储函数的内容

show create function 存储函数名;

删除存储函数

drop function 存储函数名;

触发器:一种对表执行某操作后会触发执行其他命令的机制。

当执行insert,update,delete等命令时,作为触发器提前设置好的操作也会被执行。

触发器也常作为处理的记录或者处理失败时的备份使用。

触发器被触发的时机:

before:在对表进行处理之前触发

after:在对表进行处理之后触发

获取表处理之前的列值:old. 列名

获取表处理之后的列值:  new.列名

但是根据命令的不同,有的列值可以取出来,有的列值取出来

例:创建一个”如果删除表中的记录,被删除的记录就会复制到其他表中“的触发器。

事先创建一个空表tb1用于插入tb中删除的记录

create table tb1 like tb;

创建触发器并删除tb

delimiter //
create trigger tr before delete on tb1 for each row
begin
insert into tb1(old.id,old.name,old.age);
end
//
delimiter ;

delete from tb1;

 确认设置的触发器:

show triggers;

删除触发器:

drop trigger 触发器名;

猜你喜欢

转载自blog.csdn.net/m0_52043808/article/details/124221961
今日推荐