MySQL存储过程总结(一)

    最近比较有兴趣研究MySQL定时任务存储过程,也开始学习MySQL几款查询管理工具,主要有Navicat for MySQL、SQLyog、MySQL Workbench 6.0、Toad for MySQL 6.0几款工具,都非常强大,正在陆续的学习中,下面先对MySQL存储过程做些总结。

一、存储过程

    MySQL存储过程是从MySQL5.0开始增加的新功能,存储过程的优点有很多,不过最主要的还是执行效率和SQL代码封装。特别是SQL代码封装,存储过程易于维护,执行效率高。

    delimiter //,一般情况下MYSQL以结尾表示确认输入并执行语句,但在存储过程中;不是表示结束,因此可以用该命令将号改为//表示确认输入并执行。

二、简单语法

  create procedure 存储过程名称()
 (

      [in|out|inout] 参数 datatype

  )
   begin

       MySQL 语句;

   end;

   MySQL存储过程参数如果不显示指定"in"、“out”、“inout”,则默认为“in”,习惯上,对于是“in”的参数,我们都不会显式指定。

三、存储过程例子

drop procedure if exists pr_add;

-- 计算两个数之和

create procedure pr_add (

     a int,   

     b int

) begin   

     declare c int;

    if a is null then      

         set a = 0;   

    end if;

   if b is null then     

        set b = 0;  

   end if;

set c = a + b;

select c as sum; /*    return c;- 不能在 MySQL 存储过程中使用。return 只能出现在函数中。  

四、调用存储过程

call pr_add(10, 20); 执行 MySQL 存储过程,存储过程参数为 MySQL 用户变量。
set @a = 10; set @b = 20;
call pr_add(@a, @b);

五、删除存储过程

drop procedure sp_name//

不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

六、区块,条件,循环

1. 区块定义,常用
begin
......
end;
也可以给区块起别名,如:
lable:begin
...........
end lable;
可以用leave lable;跳出区块,执行区块以后的代码

2.条件语句

if 条件 then

  statement

else

  statement

end if;

3.循环语句

①while循环

[label:] WHILE expression DO
 
 statements
 
END WHILE [label] ;

②loop循环

[label:] LOOP
 
 statements
 
END LOOP [label];

③repeat until循环

[label:] REPEAT
 
 statements
 
 UNTIL expression
 
 END REPEAT [label] ;

 七、MySQL需要注意的问题

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);

 八、其他常用命令

1.show procedure status
显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
2.show create procedure sp_name
显示某一个存储过程的详细信息

九、例子

DELIMITER //
CREATE PROCEDURE test(IN param INT)
BEGIN
IF param=1 THEN
SELECT * FROM (SELECT 1 AS num UNION ALL SELECT 2 UNION ALL SELECT 3) xx WHERE num<=param;
ELSEIF param=2 THEN
SELECT * FROM (SELECT 1 AS num UNION ALL SELECT 2 UNION ALL SELECT 3) xx WHERE num>=param;
END IF;
END
//
DELIMITER ;

 

转自:http://fyb613.blog.163.com/blog/static/325460922010044417672/

 

posted @ 2014-08-02 09:11  蓝色妖精  阅读(298)  评论(0编辑  收藏  举报