存储过程

什么是存储过程:

简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;

ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用;

有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;

函数的普遍特性:模块化,封装,代码复用;

速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;

创建一个简单的存储过程:

BEGIN
#Routine body goes here...
DECLARE record_id bigint DEFAULT 100000;#订单id
DECLARE open_house_id bigint default 1000000;#房源id
DECLARE order_no bigint DEFAULT 2016010200001; # 订单号
DECLARE cus_id int DEFAULT 10000; #客户id

DECLARE i int DEFAULT 0;
while i < 800000 DO
insert into t__record values(record_id,order_no,6900,100000,open_house_id,cus_id,1,1,700,null,'2017-12-01

10:40:20',5100,null,'2017-12-01 10:40:20',1);

set record_id = record_id+1;
set i = i+1;
set order_no = order_no+1;
set cus_id = cus_id+1;

end WHILE;

END

存储过程中控制语句:

IF语句:

CREATE 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

CASE语句:
CREATE  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

循环while语句:
CREATE  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