简单的说,就是一组SQL语句集,功能强大,能够实现一些比较复杂的逻辑功能,相似于JAVA语言中的方法;数据库
ps:存储过程跟触发器有点相似,都是一组SQL集,可是存储过程是主动调用的,且功能比触发器更增强大,触发器是某件事触发后自动调用;模块化
有输入输出参数,能够声明变量,有if/else, case,while等控制语句,经过编写存储过程,能够实现复杂的逻辑功能;函数
函数的广泛特性:模块化,封装,代码复用;性能
速度快,只有首次执行需通过编译和优化步骤,后续被调用能够直接执行,省去以上步骤;优化
存储过程proc_adder功能很简单,两个整型输入参数a和b,一个整型输出参数sum,功能就是计算输入参数a和b的结果,赋值给输出参数sum;spa
几点说明:code
DELIMITER ;;:以前说过了,把默认的输入的结束符;替换成;;。blog
DEFINER:建立者;编译
-- ---------------------------- -- Procedure structure for `proc_adder` -- ---------------------------- DROP PROCEDURE IF EXISTS `proc_adder`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int) BEGIN #Routine body goes here... DECLARE c int; if a is null then set a = 0; end if; if b is null then set b = 0; end if;
set sum = a + b; END ;; DELIMITER ;
执行以上存储结果,验证是否正确,以下图,结果OK:class
set @b=5; call proc_adder(2,@b,@s); select @s as sum;
IF语句:
-- ---------------------------- -- Procedure structure for `proc_if` -- ---------------------------- DROP PROCEDURE IF EXISTS `proc_if`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_if`(IN type int) BEGIN #Routine body goes here... DECLARE c varchar(500); IF type = 0 THEN set c = 'param is 0'; ELSEIF type = 1 THEN set c = 'param is 1'; ELSE set c = 'param is others, not 0 or 1'; END IF; select c; END ;; DELIMITER ;
CASE语句:
-- ---------------------------- -- Procedure structure for `proc_case` -- ---------------------------- DROP PROCEDURE IF EXISTS `proc_case`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_case`(IN type int) BEGIN #Routine body goes here... DECLARE c varchar(500); CASE type WHEN 0 THEN set c = 'param is 0'; WHEN 1 THEN set c = 'param is 1'; ELSE set c = 'param is others, not 0 or 1'; END CASE; select c; END ;; DELIMITER ;
循环while语句:
-- ---------------------------- -- Procedure structure for `proc_while` -- ---------------------------- DROP PROCEDURE IF EXISTS `proc_while`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_while`(IN n int) BEGIN #Routine body goes here... DECLARE i int; DECLARE s int; SET i = 0; SET s = 0; WHILE i <= n DO set s = s + i; set i = i + 1; END WHILE; SELECT s; END ;; DELIMITER ;
其它:略~
不一样数据库,语法差异很大,移植困难,换了数据库,须要从新编写;
很差管理,把过多业务逻辑写在存储过程很差维护,不利于分层管理,容易混乱,通常存储过程适用于个别对性能要求较高的业务,其它的必要性不是很大;
...