一、概述
一提到存儲過程可能就會引出另一個話題就是存儲過程的優(yōu)缺點,這里也不做討論,一般別人問我我就這樣回答你覺得它好你就用它。因為mysql中存儲過程和函數(shù)的語法非常接近所以就放在一起,主要區(qū)別就是函數(shù)必須有返回值(return),并且函數(shù)的參數(shù)只有IN類型而存儲過程有IN、OUT、INOUT這三種類型。
二、語法
創(chuàng)建存儲過程和函數(shù)語法
| CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type type: Any valid MySQL data type characteristic: LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string' routine_body: Valid SQL procedure statement or statements |
語法來自官方自帶的參考手冊,characteristic語法塊是需要注意的地方,先用一個例子來介紹。
例子:
| #創(chuàng)建數(shù)據(jù)庫DROP DATABASE IF EXISTS Dpro;CREATE DATABASE DproCHARACTER SET utf8;USE Dpro;#創(chuàng)建部門表DROP TABLE IF EXISTS Employee;CREATE TABLE Employee(id INT NOT NULL PRIMARY KEY COMMENT '主鍵', name VARCHAR(20) NOT NULL COMMENT '人名', depid INT NOT NULL COMMENT '部門id');#插入測試數(shù)據(jù)INSERT INTO Employee(id,name,depid) VALUES(1,'陳',100),(2,'王',101),(3,'張',101),(4,'李',102),(5,'郭',103);#創(chuàng)建存儲過程DROP PROCEDURE IF EXISTS Pro_Employee;DELIMITER $$CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )READS SQL DATASQL SECURITY INVOKERBEGINSELECT COUNT(id) INTO pcount FROM Employee WHERE depid=pdepid;END$$DELIMITER ;#執(zhí)行存儲過程CALL Pro_Employee(101,@pcount);SELECT @pcount; |

語法解釋:
在創(chuàng)建存儲過程的時候一般都會用DELIMITER$$.....END$$ DELIMITER ;放在開頭和結(jié)束,目的就是避免mysql把存儲過程內(nèi)部的";"解釋成結(jié)束符號,最后通過“DELIMITER ;”來告知存儲過程結(jié)束。
主要解釋characteristic部分:
LANGUAGE SQL:用來說明語句部分是SQL語句,未來可能會支持其它類型的語句。
[NOT] DETERMINISTIC:如果程序或線程總是對同樣的輸入?yún)?shù)產(chǎn)生同樣的結(jié)果,則被認(rèn)為它是“確定的”,否則就是“非確定”的。如果既沒有給定DETERMINISTIC也沒有給定NOT DETERMINISTIC,默認(rèn)的就是NOT DETERMINISTIC(非確定的)CONTAINS SQL:表示子程序不包含讀或?qū)憯?shù)據(jù)的語句。
NO SQL:表示子程序不包含SQL語句。
新聞熱點
疑難解答
圖片精選