定義:
存儲(chǔ)過(guò)程和函數(shù)是在數(shù)據(jù)庫(kù)中定義一些SQL語(yǔ)句的集合,然后直接調(diào)用這些存儲(chǔ)過(guò)程和函數(shù)來(lái)執(zhí)行已經(jīng)定義好的SQL語(yǔ)句。 存儲(chǔ)過(guò)程和函數(shù)可以避免開(kāi)發(fā)人員重復(fù)的編寫(xiě)相同的SQL語(yǔ)句。 而且, 存儲(chǔ)過(guò)程和函數(shù)是在MySQL服務(wù)器中存儲(chǔ)和執(zhí)行的,可以減少客戶端和服務(wù)器端的數(shù)據(jù)傳輸。
創(chuàng)建存儲(chǔ)過(guò)程:
CREATE PROCEDURE sp_name([proc_parameter[,...]])
[characteristic...] routine_body
sp_name參數(shù)是存儲(chǔ)過(guò)程的名稱;
proc_parameter表示存儲(chǔ)過(guò)程的參數(shù)列表;characteristic參數(shù)指定存儲(chǔ)過(guò)程的特性;routine_body參數(shù)是SQL代碼的內(nèi)容,可以用BEGIN...END來(lái)標(biāo)志SQL代碼的開(kāi)始和結(jié)束。proc_parameter中的每個(gè)參數(shù)由3部分組成。這3部分分別是輸入輸出類型、參數(shù)名稱和參數(shù)類型。[ IN | OUT | INOUT ] param_name type其中,IN表示輸入?yún)?shù);OUT表示輸出參數(shù);INOUT表示既可以是輸入,也可以是輸出;param_name參數(shù)是存儲(chǔ)過(guò)程的參數(shù)名稱;type參數(shù)指定存儲(chǔ)過(guò)程的參數(shù)類型,該類型可以是MySQL數(shù)據(jù)庫(kù)的任意數(shù)據(jù)類型;Characteristic參數(shù)有多個(gè)取值。其取值說(shuō)明如下:LANGUAGE SQL:說(shuō)明routine_body部分是由SQL語(yǔ)言的語(yǔ)句組成,這也是數(shù)據(jù)庫(kù)系統(tǒng)默認(rèn)的語(yǔ)言。[ NOT ] DETERMINISTIC:指明存儲(chǔ)過(guò)程的執(zhí)行結(jié)果是否是確定的。DETERMINISTIC表示結(jié)果是確定的。每次執(zhí)行存儲(chǔ)過(guò)程時(shí),相同的輸入會(huì)得到相同的輸出。NOT DETERMINISTIC表示結(jié)果是非確定的,相同的輸入可能得到不同的輸出。默認(rèn)情況下,結(jié)果是非確定的。{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL語(yǔ)句的限制;CONTAINS SQL表示子程序包含SQL語(yǔ)句,但不包含讀或?qū)憯?shù)據(jù)的語(yǔ)句;NO SQL表示子程序中不包含SQL語(yǔ)句;READS SQL DATA表示子程序中包含讀數(shù)據(jù)的語(yǔ)句;MODIFIES SQL DATA表示子程序中包含寫(xiě)數(shù)據(jù)的語(yǔ)句。默認(rèn)情況下,系統(tǒng)會(huì)指定為CONTAINS SQL;SQL SECURITY { DEFINER | INVOKER };指明誰(shuí)有權(quán)限來(lái)執(zhí)行。DEFINER表示只有定義者自己才能夠執(zhí)行;INVOKER表示調(diào)用者可以執(zhí)行。默認(rèn)情況下,系統(tǒng)指定的權(quán)限是DEFINER。COMMENT ‘string’:注釋信息;
DELIMITER &&
CREATE PROCEDURE pro_book ( IN bT INT,OUT count_num INT)
? READS SQL DATA
? BEGIN
? ? SELECT COUNT(*) FROM t_book WHERE bookTypeId=bT;
? END
? &&
DELIMITER ;
CALL pro_book(1,@total);
創(chuàng)建存儲(chǔ)函數(shù)
CREATE FUNCTION sp_name ( [func_parameter[,...]] )
RETURNS type
[ characteristic... ] routine_body
sp_name參數(shù)是存儲(chǔ)函數(shù)的名稱;func_parameter表示存儲(chǔ)函數(shù)的參數(shù)列表;RETURNS type指定返回值的類型;characteristic參數(shù)指定存儲(chǔ)過(guò)程的特性,該參數(shù)的取值與存儲(chǔ)過(guò)程中的取值是一樣的;routine_body參數(shù)是SQL代碼的內(nèi)容,可以用BEGIN...END來(lái)標(biāo)志SQL代碼的開(kāi)始和結(jié)束;func_parameter可以由多個(gè)參數(shù)組成,其中每個(gè)參數(shù)由參數(shù)名稱和參數(shù)類型組成,其形式如下:param_name type其中,param_name參數(shù)是存儲(chǔ)函數(shù)的參數(shù)名稱;type參數(shù)指定存儲(chǔ)函數(shù)的參數(shù)類型,該類型可以是MySQL數(shù)據(jù)庫(kù)的任意數(shù)據(jù)類型;
DELIMITER &&
CREATE FUNCTION func_book (bookId INT)
RETURNS VARCHAR(20)
BEGIN
? RETURN ( SELECT bookName FROM t_book WHERE id=bookId );
END
? ? &&
DELIMITER ;
SELECT func_book(2);
變量
定義變量:DECLARE var_name [,...] type [ DEFAULT value ]
變量賦值:SET var_name = expr [,var_name=expr] ...
SELECT col_name[,...] INTO var_name[,...]
FROM table_name WHERE condition
游標(biāo)
查詢語(yǔ)句可能查詢出多條記錄,在存儲(chǔ)過(guò)程和函數(shù)中使用游標(biāo)來(lái)逐條讀取查詢結(jié)果集中的記錄。游標(biāo)的使用包括聲明游標(biāo)、打開(kāi)游標(biāo)、使用游標(biāo)和關(guān)閉游標(biāo)。游標(biāo)必須聲明在處理程序之前,并且聲明在變量和條件之后。
聲明游標(biāo):DECLARE cursor_name CURSOR FOR select_statement ;
打開(kāi)游標(biāo):OPEN cursor_name;
使用游標(biāo):FETCH cursor_name INTO var_name [,var_name ... ];
關(guān)閉游標(biāo):CLOSE cursor_name;
DELIMITER &&
CREATE PROCEDURE pro_user()
BEGIN
DECLARE a,b VARCHAR(20) ;
INSERT INTO t_user VALUES(NULL,a,b);
END
&&
DELIMITER ;
DELIMITER &&
CREATE PROCEDURE pro_user2()
BEGIN
DECLARE a,b VARCHAR(20) ;
SET a='java1234',b='123456';
INSERT INTO t_user VALUES(NULL,a,b);
END
&&
DELIMITER ;
DELIMITER &&
CREATE PROCEDURE pro_user3()
BEGIN
DECLARE a,b VARCHAR(20) ;
SELECT userName2,password2 INTO a,b FROM t_user2 WHERE id2=1;
INSERT INTO t_user VALUES(NULL,a,b);
END
&&
DELIMITER ;
DELIMITER &&
CREATE PROCEDURE pro_user4()
BEGIN
DECLARE a,b VARCHAR(20) ;
DECLARE cur_t_user2 CURSOR FOR SELECT userName2,password2 FROM t_user2;
OPEN cur_t_user2;
FETCH cur_t_user2 INTO a,b;
INSERT INTO t_user VALUES(NULL,a,b);
CLOSE cur_t_user2;
END
&&
DELIMITER ;
查看存儲(chǔ)過(guò)程和函數(shù):
SHOW STATUS語(yǔ)句查看存儲(chǔ)過(guò)程和函數(shù)的狀態(tài)
SHOW CREATE語(yǔ)句查看存儲(chǔ)過(guò)程的函數(shù)的定義
SHOW PROCEDURE STATUS LIKE 'pro_book';
SHOW CREATE PROCEDURE pro_book;
修改存儲(chǔ)過(guò)程和函數(shù):
ALTER PROCEDURE pro_book? COMMENT '我來(lái)測(cè)試一個(gè)COMMENT';
刪除存儲(chǔ)過(guò)程和函數(shù):
DROP PROCEDURE pro_user3;