1. 程式人生 > >Mysql(10)_存儲過程與流程控制

Mysql(10)_存儲過程與流程控制

eight mysql5 特性 http $$ 處理 ... 聲明變量 很好


一 存儲過程與if語句

-- ----------------------------
-- 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 ; SET @b=5; -- 把5傳給第二個參數b CALL proc_adder(2,@b,@s); -- 調用存儲過程 SELECT @s as sum; CALL proc_adder(3,3,@s); SELECT @s as sum;
--
---------------------------- -- Procedure structure for `proc_adder` -- ---------------------------- 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 ; SET @type =1; CALL proc_if(@type)

技術分享圖片


二 存儲過程與case語句


-- ----------------------------
-- Procedure structure for `proc_adder`
-- ----------------------------
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 ;

SET @type =1;
CALL proc_case(@type)

技術分享圖片


三 存儲過程與while


-- ----------------------------
-- Procedure structure for `proc_adder`
-- ----------------------------
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 ;

SET @n =100;
CALL proc_while(@n);

技術分享圖片

存儲過程其實類似於編程語言中的函數,mysql中也有函數,區別在於函數必須有返回值,而存儲過程沒有。存儲過程的參數有in,out,inout類型,而函數的參數只能是in類型的。如有函數需要從其他類型的數據庫遷移到mysql,那麽可能需要將函數改造成存儲過程。

存儲過程和函數是從mysql5.0開始支持的。存儲過程和函數是事先經過編譯並存儲在數據庫中的一段sql語句的集合,調用存儲過程和函數可以簡化應用開發r人員的很多工作,減少數據在數據庫和應用服務器之間的傳輸,對提高數據的處理效率是有好處的

  有輸入輸出參數,可以聲明變量,有if/else, case,while等控制語句,通過編寫存儲過程,可以實現復雜的邏輯功能;

  函數的普遍特性:模塊化,封裝,代碼復用;

  速度快,只有首次執行需經過編譯和優化步驟,後續被調用可以直接執行,省去以上步驟;

對於mysql的表,能存儲多少數據的問題。在工作中遇到過,兩千萬是可以的!,不過在插入兩千萬數據的表,或者是刪除數據,花費的時間比較長。這個在工作也遇到過。

對於mysql和Oracle的比較。其實mysql學好了,Oracle也就學好了。很多東西幾乎是一樣的。而且mysql是開源的,安裝後大概153M

而oracle卻好幾個G。運行oracle,需要很好的設備來支撐它的性能,其實一般的企業,用mysql足夠了!!!如果只是針對幾百人的用戶系統,mysql完全可以滿足需要

平心而論,自己對於mysql數據庫,了解多少!!!很多東西需要學習,自己會的只是基礎。等以後用到,一些語句,翻翻博客套用就可以了。平時多看自己寫的博客,復習。知道有這麽回事!!

Mysql(10)_存儲過程與流程控制