初識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;