mysql 存储过程

来源:互联网 发布:贝佳斯怎么样 知乎 编辑:程序博客网 时间:2024/04/27 22:47
存储过程
    一般在大型的数据库系统中,一组为了完成特定功能的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='数据库名'

0 0