mysql存储过程详解

mysql存储过程详解

存储过程的概念

存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户经过指定存储过程的名称并给出参数来执行。

存储过程当中能够包含逻辑控制语句和数据操纵语句,它能够接受参数、输出参数、返回单个或多个结果集以及返回值。

因为存储过程在建立时即在数据库服务器上进行了编译并存储在数据库中,因此存储过程运行要比单个的SQL语句块要快。同时因为在调用时只需用提供存储过程名和必要的参数信息,因此在必定程度上也能够减小网络流量、简单网络负担。


* 存储过程的优势

    A、 存储过程容许标准组件式编程

    存储过程建立后能够在程序中被屡次调用执行,而没必要从新编写该存储过程的SQL语句。并且数据库专业人员能够随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提升了程序的可移植性。

    B、 存储过程可以实现较快的执行速度

    若是某一操做包含大量的T-SQL语句代码,分别被屡次执行,那么存储过程要比批处理的执行速度快得多。由于存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都须要预编译和优化,因此速度就要慢一些。

    C、 存储过程减轻网络流量

    对于同一个针对数据库对象的操做,若是这一操做所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,不然将会是多条SQL语句。从而减轻了网络流量,下降了网络负载。

    D、 存储过程可被做为一种安全机制来充分利用

    系统管理员能够对执行的某一个存储过程进行权限限制,从而可以实现对某些数据访问的限制,避免非受权用户对数据的访问,保证数据的安全。



* mysql存储过程的用法
-- 查看当前数据库的存储过程
show procedure status where Db='wlx';



-- 自定义函数
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;
   
end;

-- 调用存储过程
call pr_add(10, 20);
call pr_add(NULL,NULL);
  • 在mysql中,参数有三种模式:IN,OUT或INOUT:
    IN - 是默认模式。在存储过程当中定义IN参数时,调用程序必须将参数传递给存储过程。 另外,IN参数的值被保护。这意味着即便在存储过程当中更改了IN参数的值,在存储过程结束后仍保留其原始值。换句话说,存储过程只使用IN参数的副本。
    OUT - 能够在存储过程当中更改OUT参数的值,并将其更改后新值传递回调用程序。请注意,存储过程在启动时没法访问OUT参数的初始值。
    INOUT - INOUT参数是IN和OUT参数的组合。这意味着调用程序能够传递参数,而且存储过程能够修改INOUT参数并将新值传递回调用程序。

    详细说明以下:mysql

根据存储过程当中参数的目的,MODE能够是IN,OUT或INOUT。
param_name是参数的名称。参数的名称必须遵循MySQL中列名的命名规则。
在参数名以后是它的数据类型和大小。和变量同样,参数的数据类型能够是任何有效的mysql数据类型。
    在上面的存储过程当中,若是存储过程有多个参数,则每一个参数由逗号(,)分隔。咱们先来看in模式中,使用GetOfficeByCountry存储过程当中的IN参数来查询选择位于特定国家/地区的办公室的实例:
in模式sql

USE `wlx`;
DROP procedure IF EXISTS `getuserInfo`;
 
DELIMITER $$
USE `wlx`$$
CREATE PROCEDURE getuserInfo(IN usernameparam VARCHAR(255))
 BEGIN
 SELECT * 
 FROM wlx_user
 WHERE username = usernameparam;
 END$$
DELIMITER ;
<!-- 调用 -->
CALL GetOfficeByCountry('USA');

out 模式数据库

USE `wlx`;
DROP procedure IF EXISTS `getUserCount`;
 
DELIMITER $$
CREATE PROCEDURE getUserCount(
 IN usernameparam VARCHAR(25),
 OUT total INT)
BEGIN
 SELECT count(id)
 INTO total
 FROM wlx_user
 WHERE username = usernameparam;
END$$
DELIMITER ;


<!-- 调用须要两步一块儿使用 -->
CALL getUserCount("string",@total)

SELECT @total;

inout 模式编程

DELIMITER $$
CREATE PROCEDURE set_counter(INOUT count INT(4),IN inc INT(4))
BEGIN
 SET count = count + inc;
END$$
DELIMITER ;


SET @counter = 1;
CALL set_counter(@counter,1); -- 2
CALL set_counter(@counter,1); -- 3
CALL set_counter(@counter,5); -- 8
SELECT @counter; -- 8
相关文章
相关标签/搜索