存储过程
一般在大型的数据库系统中,一组为了完成特定功能的sql语句集,存储在数据库中,经过第一次编译后,再次调用不需要再次编译,用户只需要指定存储过程名字并给定参数就可以执行完成任务。
MySQL 存储过程是从 MySQL 5.0 开始增加的新功能。存储过程的优点有一箩筐。不过最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句。特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗。现在有了 MySQL 存储过程,业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高。
创建:
Create procedure 存储过程名( [in|out|inout] 参数 datatype )
Begin
Sql语句;
Sql语句;
...
End
注:存储过程只是先编译sql语句,所以当sql语句中有错误的表或属性时,系统不会提示,而且存储过程会创建成功。只有当调用执行时才提示错误。
( 设置mysql控制台的结尾符号: 默认的以";"结尾,我们可以自己设置结束符号,语法是: delimiter // -----》表示以"//"作为结束符号 )
create procedure tat(n1 int, n2 int)
begin
declare n3 int;
set n3 = n1 + n2;
select n3 as sum;
end
create procedure ttb(in n int)
begin
if n is null then
set n = 1202;
end if;
select * from t_student where sid=n ;
end
#
调用存储过程:
Call 存储过程名( );
删除存储过程:
Drop procedure (if exists) 存储过程名;
带参数的存储过程
参数分3类:
IN:表示存储过程需要给它一个值 (默认)
OUT:表示存储过程会返回一个值
INOUT:既可以传值进去也可以带值出来
例:创建一个可以传值到存储过程内的存储过程
delimiter //
create procedure pr_st ( IN a int)
begin
select * from t_student where sid = a;
end//
delimiter;
调用:call pr_st(1210)
例:创建一个可以返回值出来的存储过程
delimiter //
create procedure pr_st ( OUT a int)
begin
select max(sscore) into a from t_student ;
end
//
delimiter;
调用:call pr_st( @a );
Select @a;
例:创建一个可以返回和传入值的存储过程
delimiter //
create procedure pr_st ( IN a int, OUT b int)
begin
select sage into b from t_student where sid = a;
end
//
delimiter;
调用:call pr_st( 1210,@a );
Select @a;
注:limit 后面不允许有参数,所以存储过程里面的limit后面不能用参数
例:创建一个可以返回和传入值的存储过程(同一个参数)
delimiter //
create procedure pr_st ( INOUT a int)
begin
select sage from t_student where sid = a into a;
end
//
delimiter;
调用:set @b = 1210;
Call pr_st(@b);
Select @b;
delimiter //
create procedure pr_st ( IN a int,IN b varchar(10))
begin
insert into t_dept(did,dname) values(a,b);
end
//
delimiter;
call(1111,'abc');
MySQL 存储过程特点
创建 MySQL 存储过程的简单语法为:
create procedure 存储过程名字()
(
[in|out|inout] 参数 datatype
)
begin
MySQL 语句;
end;
MySQL 存储过程参数如果不显式指定"in"、"out"、"inout",则默认为"in"。习惯上,对于是"in" 的参数,我们都不会显式指定。
1. MySQL 存储过程名字后面的"()"是必须的,即使没有一个参数,也需要"()"
2. MySQL 存储过程参数,不能在参数名称前加"@",如:"@a int"。下面的创建存储过程语法在 MySQL 中是错误的(在 SQL Server 中是正确的)。 MySQL 存储过程中的变量,不需要在变量名字前加"@",虽然 MySQL 客户端用户变量要加个"@"。
create procedure pr_add
(
@a int,- 错误
b int - 正确
)
3. MySQL 存储过程的参数不能指定默认值。
4. MySQL 存储过程不需要在 procedure body 前面加 "as"。而 SQL Server 存储过程必须加 "as" 关键字。
create procedure pr_add
(
a int,
b int
)
as - 错误,MySQL 不需要 "as"
begin
mysql statement ...;
end;
5. 如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。
create procedure pr_add
(
a int,
b int
)
begin
mysql statement 1 ...;
mysql statement 2 ...;
end;
6. MySQL 存储过程中的每条语句的末尾,都要加上分号 ";"
...
declare c int;
if a is null then
set a = 0;
end if;
...
end;
7. MySQL 存储过程中的注释。
/*
这是个
多行 MySQL 注释。
/
declare c int; - 这是单行 MySQL 注释 (注意- 后至少要有一个空格)
if a is null then 这也是个单行 MySQL 注释
set a = 0;
end if;
...
end;
8. 不能在 MySQL 存储过程中使用 "return" 关键字。
set c = a + b;
select c as sum;
/*
return c;- 不能在 MySQL 存储过程中使用。return 只能出现在函数中。
/
end;
9. 调用 MySQL 存储过程时候,需要在过程名字后面加"()",即使没有一个参数,也需要"()"
call pr_no_param();
10. 因为 MySQL 存储过程参数没有默认值,所以在调用 MySQL 存储过程时候,不能省略参数。可以用 null 来替代。
call pr_add(10, null);
展示数据库有哪些存储过程:
Select name from mysql.proc where db='数据库名'
Show procedure status where db='数据库名'
转载请注明原文地址: https://ju.6miu.com/read-1000288.html