存儲過程:
就是一組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);