SQL存儲(chǔ)過(guò)程和函數(shù)(1)

定義:

存儲(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;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容