MySQL存储过程

一。为什么要有存储过程

    SQL语句在执行的时候需要先编译,再执行。而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
    一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 

    存储过程通常有以下优点: 
(1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 
(2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 
(3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。 
(4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。 
(5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。 

一、MySQL 创建存储过程

“pr_add” 是个简单的 MySQL 存储过程,这个MySQL 存储过程有两个 int 类型的输入参数 “a”、“b”,返回这两个参数的和。

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 只能出现在函数中。
 */   
 end;

二、调用 MySQL 存储过程

call pr_add(10, 20);

执行 MySQL 存储过程,存储过程参数为 MySQL 用户变量。

set @a = 10;   
set @b = 20;   
call pr_add(@a, @b);

三、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 来替代。

来自于:http://xdj651897373-126-com.iteye.com/blog/1819924

http://database.51cto.com/art/201006/203159.htm


你可能感兴趣的:(MySQL存储过程)