存储过程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
根据存储过程当中参数的目的,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