存储过程:
就是一组sql语句集,用于实现较复杂的逻辑功能,可以理解为Java 语句中的方法,可以接受参数,返回结果集,模块化,封装,代码复用。可以有f/else, case,while等控制语句
存储过程会先进行编译然后存放在数据库中,后面执行的时候可以直接调用,所以存储过程腰比执行单个的sql语句高效(执行速度快),但也有一些缺点,如:各个数据库的语法不同,不同的数据库,实现相同的存储过程,会有不同的语法去写。
简单的例子:
几点说明,在写存储过程的时候,实用 DELIMITER 去定义输入的结束符号,默认的是 ; DELIMITER // 那么就可以定义结束符号是 //。DEFINER:定义创建者
DROP PROCEDURE IF EXISTS proc_adder;
DELIMITER //
CREATE PROCEDURE proc_adder(IN a int, IN b int, OUT sum 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 sum = a + b;
END
//
DELIMITER ;
set @b=5; 变量赋值
call proc_adder(2,3, @b);
select @b as sum;
控制语句:
IF
DROP PROCEDURE IF EXISTS proc_if;
DELIMITER //
CREATE PROCEDURE proc_if(IN type int)
BEGIN
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";
END IF;
select c;
END
//
DELIMITER ;
call proc_if(4);
CASE
DROP PROCEDURE IF EXISTS proc_case;
DELIMITER //
CREATE PROCEDURE proc_case(IN type int)
BEGIN
DECLARE c varchar(500);
CASE TYPE
WHEN 0 THEN
set c = "param 0";
WHEN 1 THEN
set c = "param 1";
ELSE
set c = "param other";
END CASE;
select c;
END
//
DELIMITER ;
call proc_case(0);
WHILE
DROP PROCEDURE IF EXISTS proc_while;
DELIMITER //
CREATE PROCEDURE proc_while(IN num int)
BEGIN
DECLARE i int;
DECLARE j int;
set i = 0;
set j = 0;
WHILE i<= num DO
set j = j + i;
set i = i + 1;
END WHILE;
select j;
END
//
DELIMITER ;
call proc_while(10);