1. 程式人生 > >mysql存儲過程和函數(一)

mysql存儲過程和函數(一)

服務器 影響 end 結果 bsp 進行 exists class 行存儲

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

  存儲過程和函數的區別在於函數必須有返回值,而存儲過程卻沒有,存儲過程的參數可以使用IN,OUT,INOUT類型,而函數的參數只能使用IN類型,

  在對存儲過程或者函數進行操作時,需要先判斷用戶是否有相應的權限,例如,創建存儲過程或者函數需要 CREATE ROUTINE 權限,修改或者刪除存儲過程或者函數需要 ALTER ROUTINE 權限,執行存儲過程或者函數則需要EXECUTE權限。

  創建 存儲過程語法:

CREATE PROCEDURE findUser (IN p_u_id INT)
BEGIN
	SELECT
          id,username,phone
	FROM
		mmall_user
	WHERE
		id = p_u_id;
END;

  調用存儲過程的語法:

CALL findUser (23) ;

  在執行存儲存儲過程或者函數之前,可以通過“DELIMITER $$” 命令將語句的結束符從“;”修改成其他符號 , 這裏是用的是$$ ,這樣在過程或者函數中的;就不會被mysql解釋成語句的結束而提示錯誤,在存儲過程或者函數結束後,要通過“DELIMITER ;” 命令再將結束符該回成“;”

  在數據庫調用存儲過程和直接執行sql的結果是相同的,但是存儲過程的好處在於處理邏輯都封裝在數據庫端,調用者不需要了解中間的處理邏輯,一旦處理邏輯發生變化,只需要修改存儲過程就可以。而對調用者的程序完全沒有影響。

  刪除存儲過程或者函數:

  一次只可以刪除一個存儲過程或者函數,刪除存儲過程或者函數需要有該過程或者函數的“ALTER ROUTINE”權限。

DROP {PROCEDURE/FUNCTION} IF EXISTS findUser; #判斷是否存在同名的存儲過程,刪除

  查看存儲過程或者權限:

  1.查看存儲過程或者函數的狀態

SHOW {PROCEDURE/FUNCTION} STATUS [LIKE ‘pattern‘]

  2.查看存儲過程或者函數的定義

SHOW CREATE {PROCEDURE/FUNCTION} sp_name

  3.通過查看 information_schema.Routines 了解存儲過程和函數的信息

SELECT
	*
FROM
	information_schema.Routines
WHERE
	ROUTINE_NAME = sp_name;

  變量的使用:

  1.變量的定義:通過DECLARE可以定義一個局部變量,該變量的作用範圍只能在BEGIN...END塊中,可以用在嵌套的塊中。變量的定義必須寫在復合語句定義的開頭,並且在任何其他語句的前面,可以一次聲明多個同類型的變量。如果需要,可以使用DEFAULT賦默認值。

  定義變量的語法:

DECLARE var_name  [...] type [DEFAULT value]

  例:

CREATE FUNCTION get_username(productId int ,p_create_time DATETIME)
RETURNS DECIMAL(10,2)
DETERMINISTIC
READS SQL DATA 
BEGIN
DECLARE varPay DECIMAL(10,2) ;
select IFNULL(sum(price),0) INTO varPay from mmall_product where create_time<=p_create_time
and id = productId;
RETURN varPay;
END;

  查看所有變量:

show session variables; 

    

mysql存儲過程和函數(一)