初識MySQL預存程序,mysql預存程序

來源:互聯網
上載者:User

初識MySQL預存程序,mysql預存程序
預存程序(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者通過指定預存程序的名字並給定參數(如果該預存程序帶有參數)來調用執行它。MySQL 預存程序是從 MySQL 5.0 開始增加的新功能。大大提高資料庫的處理速度,同時也可以提高資料庫編程的靈活性。
過程:封裝起來的若干條語句,調用時這些封裝體執行。把此過程儲存到資料庫中即預存程序.
函數:是一個有返回值的“過程”。
過程:沒有返回值的函數。
預存程序的優點:1、預存程序增強了SQL語言的功能和靈活性(可以SQL編程,能使用變數,運算式、控制結構體)2、預存程序能實現較快的執行速度。(預存程序要比批處理的執行速度快很多,因為預存程序是先行編譯的。在首次運行一個預存程序時查詢,最佳化器對其進行分析最佳化,並且給出最終被儲存在系統資料表中的執行計畫。而批處理的Transaction-SQL語句在每次運行時都要進行編譯和最佳化,速度相對要慢一些。)3、預存程序能過減少網路流量。針對同一個資料庫物件的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織程預存程序,那麼當在客戶電腦上調用該預存程序時,網路中傳送的只是該調用語句,從而大大增加了網路流量並降低了網路負載。4、預存程序可被作為一種安全機制來充分利用。系統管理員通過執行某一預存程序的許可權進行限制,能夠實現對相應的資料的存取權限的限制,避免了非授權使用者對資料的訪問,保證了資料的安全。5、預存程序允許標準組件是編程。預存程序被建立後,可以在程式中被多次調用,而不必重新編寫該預存程序的SQL語句。而且資料庫專業人員可以隨時對預存程序進行修改,對應用程式原始碼毫無影響。預存程序的建立:

DELIMITER $$  //定義分隔字元CREATE PROCEDURE p()   //p為過程名BEGIN  --sql語句 //封裝語句體END $$
查看已有的預存程序:show procedure status \G;調用預存程序:call 預存程序名稱();刪除預存程序:drop procedure 預存程序名稱;
變數聲明:預存程序中用declare聲明變數格式:declare 變數名 變數類型 [default 預設值]預存程序中,變數可以在SQL語句中合法的運算,如+ - * /運算結果如何賦值  set 變數 := 運算式預存程序傳參:預存程序的括弧裡,可以聲明參數。 文法是 create procedure p([in/out/inout] 參數名  參數類型 ..)in  out  inout詳細分析見下一篇博文(連結明天給出) 

執行個體一:建立 運算 賦值
CREATE PROCEDURE p1()BEGIN  DECLARE age INT DEFAULT 18;  DECLARE height INT DEFAULT 180;  SET age := age +20;  SELECT CONCAT('年齡是', age, '身高是', height);END$$


執行個體二 :if/else 控制結構
CREATE PROCEDURE p2()BEGIN  DECLARE age INT DEFAULT 18;  DECLARE height INT DEFAULT 180;  IF age >= 18 THEN    SELECT "已成年";  ELSE    SELECT "未成年";  END IF;END$$


執行個體三:while/do 控制結構求1-100的和
CREATE PROCEDURE p3()BEGIN  DECLARE total INT DEFAULT 0;  DECLARE num INT DEFAULT 0;  WHILE num<=100 DO    SET total := num + total;    SET num := num + 1;   END WHILE;   SELECT total;END$$

執行個體四:case 控制結構
CREATE PROCEDURE p4()BEGIN  DECLARE num INT DEFAULT 0;  SET num := FLOOR(4*RAND());  CASE num  WHEN 1 THEN SELECT "cat";  WHEN 2 THEN SELECT "dog";  WHEN 3 THEN SELECT "sheep";  ELSE SELECT "pig";  END CASE;END$$


執行個體五:repeat迴圈
CREATE PROCEDURE p5()BEGIN  DECLARE num INT DEFAULT 0;  DECLARE total INT DEFAULT 0;  REPEAT    SET total = num + total;    SET num := num + 1;  UNTIL num>100 END REPEAT;  SELECT total;END$$



mysql預存程序:

dayofyear不是mysql自有的函數,要看你的預存程序具體是怎麼定義的了,所謂因地制宜。。。
_date應該是一個變數,now()應該是擷取目前時間,這個是可以猜到的
dayofyear(_date)就是將_date這個變數格式化為定義好的dayofyear格式的
然後再將(now())-dayofyear(_date)整體格式化為dayofyear格式

不知道這樣說你能明白不?或者把完整的預存程序貼出來看下就知道了
 
mysql預存程序問題

那要看一下你這個total預存程序是怎麼定義的, 如果@t是output參數,需要用關鍵字out, 以下是一個例子:
CREATE PROCEDURE sp_add(a int, b int,out c int)
begin

set c=a+ b;

end;
調用過程:
call sp_add (1,2,@a);
select @a;
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.