1. 存储过程
含义:一组经过预先编译的sql语句的集合,存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
好处:
- 存储过程在创建的时候直接编译,而sql语句每次使用都要编译,提高执行效率
- 提高了sql语句的重用性
- 减少网络之间的数据传输,节省开销
/*
?1.创建存储过程
语法:
delimiter 新的结束标记
create procedure 存储过程名(in|out|inout 参数名 参数类型,...)
begin
存储过程体;
end 新的结束标记
注意:
①in、out、inout都可以在一个存储过程中带多个,且in可以省略
②由于MySQL默认以";"为分隔符,如果我们没有声明新的分隔符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过
程会报错,所以要事先用delimiter关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用
完了通过delimiter ;语句将分隔符还原。
③参数前面的符号的意思
in:该参数只能作为输入 (该参数不能做返回值)
out:该参数只能作为输出(该参数只能做返回值)
inout:既能做输入又能做输出
④存储过程体的每一条sql语句都需要用分号结尾!!!!!!!!!!!!
⑤带out/inout的参数由于会返回某个结果值,所以在调用时,需要将参数列表设置为一个变量,那么返回结果就会赋值给该变量,我们 通过使用该变量,即能使用返回的结果。
?2.调用存储过程
语法:
call 存储过程名(实参列表)
举例:
调用in模式的参数:
call 存储过程名(‘值’);
调用out/inout模式的参数:
set @变量名;
call 存储过程名(@变量名);
select @变量名;
?3.删除存储过程
drop procedure 存储过程名;
*/
#示例:创建一个名为name_to_score的存储过程,调用该存储过程时,输入学生姓名name,返回分数score,比如输入张三,返回90。
delimiter //
create procedure name_to_score(in NAME varchar(20),OUT score int)
begin
select s.score into score
from students s
where s.name=name;
end //
call name_to_score(‘张三‘,@score);
select @score //
2. 函数
含义和好处与存储过程类似。
/*
?1.创建函数
语法:
CREATE FUNCTION 函数名(参数名 参数类型,...) RETURNS 返回类型
BEGIN
函数体
END
注意:
①函数体中肯定需要有return语句;
②由于MySQL默认以";"为分隔符,如果我们没有声明新的分隔符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过
程会报错,所以要事先用delimiter关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用
完了可以通过delimiter ;语句将分隔符还原。
?2.调用函数
SELECT 函数名(参数列表)
?3.删除函数
drop function 函数名;
*/
#示例:创建一个名为name_to_score的函数,函数功能是:输入学生姓名name,返回分数score,比如输入张三,返回90。
delimiter //
create function name_to_score(name varchar(20)) returns int
begin
declare ss int default 0;
select s.score into ss
from students s
where s.name=name;
return ss;
end //
select name_to_score(‘张三‘) //
3. 函数和存储过程的区别
关键字 | 调用语法 | 返回值 | 是否有return语句 | |
---|---|---|---|---|
函数 | function | select 函数(参数列表); | 通过return,有且只能有一个 | 有 |
存储过程 | procedure | call 存储过程(参数列表); | 通过out/inout,可以为零个、一个或多个 | 无 |