存儲(chǔ)過(guò)程就是一條或者多條SQL語(yǔ)句的集合,可視為批文件,但是其作用不僅限于批處理。
創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元大興安嶺做網(wǎng)站,已為上家服務(wù),為大興安嶺各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
9.1、創(chuàng)建存儲(chǔ)過(guò)程和函數(shù)
存儲(chǔ)程序可以分為存儲(chǔ)過(guò)程和函數(shù),MySQL中創(chuàng)建存儲(chǔ)過(guò)程和函數(shù)使用的語(yǔ)句分別是CREATE PROCEDURE和CREATE FUNCTION。使用CALL語(yǔ)句來(lái)調(diào)用存儲(chǔ)過(guò)程,只能用輸出變量返回值。函數(shù)可以從語(yǔ)句外調(diào)用( 即通過(guò)引用函數(shù)名),也能返回標(biāo)量值。存儲(chǔ)過(guò)程也能調(diào)用其他存儲(chǔ)過(guò)程。
創(chuàng)建存儲(chǔ)過(guò)程
創(chuàng)建存儲(chǔ)過(guò)程,需要使用CREATE PROCEDURE語(yǔ)句,基本語(yǔ)法為:
CREATE PROCEDURE sp_name ([proc_parameter]) [characteristic ...] routine_body
CREATE PROCEDURE:創(chuàng)建存儲(chǔ)過(guò)程的關(guān)鍵字 |
sp_name:存儲(chǔ)過(guò)程的名稱 |
proc_parameter:參數(shù)列表,列表形式為 [IN|OUT|INOUT] param_name type IN表示輸入?yún)?shù);OUT表示輸出參數(shù);INOUT表示既可輸入又可輸出; param_name參數(shù)名稱;type參數(shù)的類型,該類型可以是MySQL中的任意類型 |
characteristic:指定存儲(chǔ)過(guò)程的特性 LANGUAGE SQL:說(shuō)明routine_body部分是由SQL語(yǔ)句組成,SQL是LANGUAGE特性的唯一值 [NOT] DETERMINISTIC:指明存儲(chǔ)過(guò)程執(zhí)行的結(jié)果是否確定,DETERMINISTIC表示結(jié)果確定,每次執(zhí)行存儲(chǔ)過(guò)程時(shí),相同輸入得到相同輸出;NOT DETERMINISTIC表示不確定。 { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL語(yǔ)句的限制。CONTAINS SQL表明子程序包含SQL語(yǔ)句,但是不包含讀寫(xiě)數(shù)據(jù)的語(yǔ)句;NO SQL表明子程序不包含SQL語(yǔ)句;READS SQL DATA表明子程序包含讀數(shù)據(jù)的語(yǔ)句;MODIFIES SQL DATA表明子程序包含寫(xiě)數(shù)據(jù)的語(yǔ)句。 SQL SECURITY { DEFINER | INVOKER }:指明誰(shuí)有權(quán)限執(zhí)行。DEFINER表示只有定義者才能執(zhí)行;INVOKER表示擁有權(quán)限的調(diào)用者可以執(zhí)行。 COMMENT 'string':注釋信息。 |
routine_body:SQL代碼的內(nèi)容,可以用BEGIN...END來(lái)表示代碼的開(kāi)始和結(jié)束。 |
創(chuàng)建查看fruits表的存儲(chǔ)過(guò)程
mysql> DELIMITER // mysql> CREATE PROCEDURE Proc() -> BEGIN -> SELECT * FROM fruits; -> END // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ;
創(chuàng)建名稱為CountProc的存儲(chǔ)過(guò)程
mysql> DELIMITER // mysql> CREATE PROCEDURE CountProc(OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM fruits; -> END // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ;
'DELIMITER //'作用是將MySQL的結(jié)束符設(shè)置為//,當(dāng)使用DELIMITER命令時(shí),應(yīng)該避免使用反斜杠(’\’)字符,因?yàn)榉葱本€是MySQL的轉(zhuǎn)義字符。
創(chuàng)建存儲(chǔ)函數(shù)
創(chuàng)建存儲(chǔ)函數(shù),需要使用CREATE FUNCTION語(yǔ)句,基本語(yǔ)法為:
CREATE FUNCTION func_name ([func_parameter]) RETURNS type [characteristic ...] routine_body
CREATE FUNCTION:創(chuàng)建存儲(chǔ)函數(shù)的關(guān)鍵字 |
func_name表示存儲(chǔ)函數(shù)的名稱 |
func_parameter存儲(chǔ)函數(shù)的參數(shù)列表,形式為 [IN|OUT|INOUT] param_name type IN表示輸入?yún)?shù);OUT表示輸出參數(shù);INOUT表示既可輸入又可輸出; param_name參數(shù)名稱;type參數(shù)的類型,該類型可以是MySQL中的任意類型 |
RETURNS type表示函數(shù)返回?cái)?shù)據(jù)類型 |
characteristic指定存儲(chǔ)函數(shù)的特性,取值和與創(chuàng)建存儲(chǔ)過(guò)程相同 |
創(chuàng)建存儲(chǔ)函數(shù),名稱為NameByZip,該函數(shù)返回SELECT語(yǔ)句的查詢結(jié)果,數(shù)值類型為字符串型
mysql> DELIMITER // mysql> CREATE FUNCTION NameByZip() -> RETURNS CHAR(50) -> RETURN (SELECT s_name FROM suppliers WHERE s_call= '48075'); -> // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ;
變量的使用
在存儲(chǔ)過(guò)程中使用DECLARE語(yǔ)句定義變量,語(yǔ)法格式為:
DECLARE var_name[,varname]... date_type [DEFAULT value];
定義名稱為myparam的變量,類型為INT類型,默認(rèn)值為100
DECLARE myparam INT DEFAULT 100;
定義變量后,為變量賦值可以改變變量的默認(rèn)信息,MySQL使用SET語(yǔ)句為變量賦值,語(yǔ)法格式為:
SET var_name = expr [,var_name=expr]...
聲明3個(gè)變量,分別為var1、var2和var3,數(shù)據(jù)類型為INT,使用SET為變量賦值
DECLARE var1, var2, var3 INT; SET var1 = 10, var2 = 20; SET var3 = var1 + var2;
MySQLhankeyishiyong SELECT...INTO為一個(gè)或多個(gè)變量賦值,語(yǔ)法為:
SELECT col_name[,...] INTO var_name[,...] table_expr;
聲明變量fruitname和fruitprice,通過(guò)SELECT ... INTO語(yǔ)句查詢指定記錄并為變量賦值
DECLARE fruitname CHAR(50); DECLARE fruitprice DECIMAL(8,2); SELECT f_name,f_price INTO fruitname, fruitprice FROM fruits WHERE f_id ='a1';
定義條件和處理程序
特定條件需要特定處理。這些條件可以聯(lián)系到錯(cuò)誤,以及子程序的一般流程控制。定義條件是事先定義程序執(zhí)行過(guò)程中遇到的問(wèn)題,處理程序定義了在遇到這些問(wèn)題時(shí)應(yīng)當(dāng)采取的處理方式,并且保證存儲(chǔ)過(guò)程或函數(shù)在遇到警告或錯(cuò)誤時(shí)能繼續(xù)執(zhí)行。使用DECLARE關(guān)鍵字來(lái)定義條件和處理程序。定義條件的語(yǔ)法格式為:
DECLARE condition_name CONDITION FOR [condition_type] [condition_type]: SQLSTATE [VALUE] sqlstate_value | mysql_error_code
condition_name:條件名稱 condition_type:條件的類型 sqlstate_value和mysql_error_code都可以表示MySQL錯(cuò)誤 sqlstate_value為長(zhǎng)度5的字符串類型錯(cuò)誤代碼 mysql_error_code為數(shù)值類型錯(cuò)誤代碼 |
定義"ERROR 1148(42000)"錯(cuò)誤,名稱為command_not_allowed
//方法一:使用sqlstate_value DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000'; //方法二:使用mysql_error_code DECLARE command_not_allowed CONDITION FOR 1148
定義處理程序時(shí),使用DECLARE語(yǔ)句的語(yǔ)法為:
DECLARE handler_action HANDLER FOR condition_value statement handler_action: CONTINUE| EXIT| UNDO condition_value: mysql_error_code | SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION
handler_action:處理錯(cuò)誤方式,參數(shù)有3個(gè)取值:CONTINUE,EXIT,UNDO。 CONTINUE表示遇到錯(cuò)誤不處理,繼續(xù)執(zhí)行 EXIT遇到錯(cuò)誤馬上退出 UNDO遇到錯(cuò)誤后撤回之前的操作 |
condition_value表示錯(cuò)誤類型 SQLSTATE [VALUE] sqlstate_value:包含5個(gè)字符的字符串錯(cuò)誤值 condition_name:DECLARE CONDITION定義的錯(cuò)誤條件名稱 SQLWARNING:匹配所有01開(kāi)頭的SQLSTATE錯(cuò)誤代碼 NOT FOUND:匹配所有02開(kāi)頭的SQLSTATE錯(cuò)誤代碼 SQLEXCEPTION:匹配所有沒(méi)有被SQLWARNING或NOT FOUND捕獲的SQLSTATE錯(cuò)誤代碼 mysql_error_code:匹配數(shù)值類型錯(cuò)誤代碼 |
statement參數(shù)為程序語(yǔ)句段,表示遇到定義的錯(cuò)誤時(shí),需要執(zhí)行的存儲(chǔ)過(guò)程或函數(shù) |
定義處理程序的幾種方式
//方法一:捕獲sqlstate_value DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='NO_SUCH_TABLE'; //方法二:捕獲mysql_error_code DECLARE CONTINUE HANDLER FOR 1146 SET @info=' NO_SUCH_TABLE '; //方法三:先定義條件,然后調(diào)用 DECLARE no_such_table CONDITION FOR 1146; DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info=' NO_SUCH_TABLE '; //方法四:使用SQLWARNING DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR'; //方法五:使用NOT FOUND DECLARE EXIT HANDLER FOR NOT FOUND SET @info=' NO_SUCH_TABLE '; //方法六:使用SQLEXCEPTION DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';
定義條件和處理程序
mysql> CREATE TABLE test.t (s1 int,primary key (s1)); Query OK, 0 rows affected (0.05 sec) mysql> DELIMITER // mysql> CREATE PROCEDURE handlerdemo () -> BEGIN -> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; -> SET @x = 1; -> INSERT INTO test.t VALUES (1); -> SET @x = 2; -> INSERT INTO test.t VALUES (1); -> SET @x = 3; -> END; -> // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ; mysql> CALL handlerdemo(); /*調(diào)用存儲(chǔ)過(guò)程*/ Query OK, 0 rows affected, 1 warning (0.02 sec) mysql> SELECT @x; /*查看調(diào)用過(guò)程結(jié)果*/ +------+ | @x | +------+ | 3 | +------+ 1 row in set (0.00 sec)
'@var_name'表示用戶變量,使用SET語(yǔ)句為其賦值,用戶與連接有關(guān),一個(gè)客戶端定義的變量不能被其他客戶端看到或使用??蛻舳送顺鰰r(shí),該客戶端連接的所有變量自動(dòng)釋放。
光標(biāo)的使用
查詢語(yǔ)句可能返回多條記錄,如果數(shù)據(jù)非常大,需要在存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)中使用光標(biāo)來(lái)逐條讀取查詢結(jié)果集中的記錄。光標(biāo)必須在聲明處理程序之前被聲明,并且變量和條件還必須在聲明光標(biāo)或處理程序之前聲明。MySQL中光標(biāo)只能在存儲(chǔ)過(guò)程和函數(shù)中使用。
MySQL中使用DECLARE關(guān)鍵字聲明光標(biāo),語(yǔ)法基本形式為:
DECLARE cursor_name CURSOR FOR select_statement
cursor_name表示光標(biāo)名稱 select_statement表示SELECT語(yǔ)句的內(nèi)容 返回一個(gè)用戶創(chuàng)建光標(biāo)的結(jié)果集 |
聲明名稱為cursor_fruit的光標(biāo)
DECLARE cursor_fruit CURSOR FOR SELECT f_name, f_price FROM fruits ;
打開(kāi)光標(biāo)的語(yǔ)法為:
OPEN cursor_name [光標(biāo)名稱]
打開(kāi)名稱為cursor_fruit的光標(biāo)
OPEN cursor_fruit
使用光標(biāo)的語(yǔ)法為:
FETCH cursor_name INTO var_name [,var_name] ...[參數(shù)名稱]
使用名稱為cursor_fruit的光標(biāo)。將查詢出來(lái)的數(shù)據(jù)存入fruit_name和fruit_price這兩個(gè)變量
FETCH cursor_fruit INTO fruit_name, fruit_price ;
關(guān)閉名稱為cursor_fruit的光標(biāo)
CLOSE cursor_fruit;
流程控制的使用
流程控制語(yǔ)句用來(lái)控制條件語(yǔ)句的執(zhí)行。MySQL終于來(lái)控制流程的于具有IF、CASE、LOOP、LEAVE、ITERATE、REPEAT和WHERE語(yǔ)句。
IF
IF語(yǔ)句包含多個(gè)條件判斷,根據(jù)判斷的結(jié)果為T(mén)RUE或FALSE執(zhí)行相應(yīng)的語(yǔ)句,語(yǔ)法格式為:
IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list] ... [ELSE statement_list] END IF
IF語(yǔ)句的示例
IF val IS NULL THEN SELECT 'val is NULL'; ELSE SELECT 'val is not NULL'; END IF;
CASE
CASE是另一個(gè)進(jìn)行條件判斷的語(yǔ)句,該語(yǔ)句有兩種格式:
CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list] END CASE Or: CASE WHEN search_condition THEN statement_list [WHEN search_condition THEN statement_list] ... [ELSE statement_list] END CASE
使用CASE流程控制語(yǔ)句第1種格式,判斷val值等于1、等于2,或者兩者都不等
CASE val WHEN 1 THEN SELECT 'val is 1'; WHEN 2 THEN SELECT 'val is 2'; ELSE SELECT 'val is not 1 or 2'; END CASE; 當(dāng)val值為1時(shí),輸出字符串“val is 1”;當(dāng)val值為2時(shí),輸出字符串“val is 2”;否則輸出字符 串“val is not 1 or 2”。
使用CASE流程控制語(yǔ)句的第2種格式,判斷val是否為空、小于0、大于0或者等于0
CASE WHEN val IS NULL THEN SELECT 'val is NULL'; WHEN val < 0 THEN SELECT 'val is less than 0'; WHEN val > 0 THEN SELECT 'val is greater than 0'; ELSE SELECT 'val is 0'; END CASE; 當(dāng)val值為空,輸出字符串“val is NULL”;當(dāng)val值小于0時(shí),輸出字符串“val is less than 0”; 當(dāng)val值大于0時(shí),輸出字符串“val is greater than 0”;否則輸出字符串“val is 0”。
LOOP
LOOP循環(huán)語(yǔ)句用來(lái)重復(fù)執(zhí)行某些語(yǔ)句,與IF和CASE相比,LOOP只是創(chuàng)建一個(gè)循環(huán)的過(guò)程,并不進(jìn)行條件判斷。LOOP內(nèi)的語(yǔ)句一直重復(fù)只i系那個(gè)知道循環(huán)被退出,跳出循環(huán)過(guò)程使用LEAVE子句,LOOP語(yǔ)法格式為:
[begin_label:] LOOP statement_list END LOOP [end_label]
使用LOOP語(yǔ)句進(jìn)行循環(huán)操作,id值小于等于10之前,將重復(fù)執(zhí)行循環(huán)過(guò)程
DECLARE id INT DEFAULT 0; add_loop: LOOP SET id = id + 1; IF id >= 10 THEN LEAVE add_loop; END IF; END LOOP add_ loop;
LEAVE
LEAVE語(yǔ)句用來(lái)退出任何被標(biāo)注的流程控制構(gòu)造,其語(yǔ)法格式為:
LEAVE label
使用LEAVE語(yǔ)句退出循環(huán)
add_num: LOOP SET @count=@count+1; IF @count=50 THEN LEAVE add_num ; END LOOP add_num ;
ITERATE
ITERATE語(yǔ)句將執(zhí)行順序轉(zhuǎn)到語(yǔ)句段開(kāi)頭處,語(yǔ)法格式為:
ITERATE label
ITERATE只可以出現(xiàn)在LOOP、REPEAT、WHERE語(yǔ)句內(nèi)。
ITERATE語(yǔ)句示例
CREATE PROCEDURE doiterate() BEGIN DECLARE p1 INT DEFAULT 0; my_loop: LOOP SET p1= p1 + 1; IF p1 < 10 THEN ITERATE my_loop; ELSEIF p1 > 20 THEN LEAVE my_loop; END IF; SELECT 'p1 is between 10 and 20'; END LOOP my_loop; END
REPEAT
REPEAT語(yǔ)句創(chuàng)建一個(gè)帶條件判斷的循環(huán)過(guò)程,每次語(yǔ)句執(zhí)行完畢之后,會(huì)對(duì)條件表達(dá)式進(jìn)行判斷,如果為真,則結(jié)束循環(huán),其語(yǔ)法格式為:
[begin_label:] REPEAT statement_list UNTIL search_condition END REPEAT [end_label]
REPEAT語(yǔ)句示例,id值小于等于10之前,將重復(fù)執(zhí)行循環(huán)過(guò)程
DECLARE id INT DEFAULT 0; REPEAT SET id = id + 1; UNTIL id >= 10 END REPEAT;
WHILE
WHILE語(yǔ)句創(chuàng)建一個(gè)帶條件判斷的循環(huán)過(guò)程,與REPEAT不同,WHERE在執(zhí)行語(yǔ)句時(shí),先對(duì)指定表達(dá)式進(jìn)行判斷,如果為真,則執(zhí)行循環(huán)的語(yǔ)句,其語(yǔ)法格式為:
[begin_label:] WHILE search_condition DO statement_list END WHILE [end_label]
WHILE語(yǔ)句示例,id值小于等于10之前,將重復(fù)執(zhí)行循環(huán)過(guò)程
DECLARE i INT DEFAULT 0; WHILE i < 10 DO SET i = i + 1; END WHILE;
9.2、調(diào)用存儲(chǔ)過(guò)程和函數(shù)
調(diào)用存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程通過(guò)CALL語(yǔ)句進(jìn)行調(diào)用,語(yǔ)法格式為:
CALL sp_name([parameter[,...]])
定義名為CountProc1的存儲(chǔ)過(guò)程,然后調(diào)用這個(gè)存儲(chǔ)過(guò)程
mysql> DELIMITER // mysql> CREATE PROCEDURE CountProc1 (IN sid INT, OUT num INT) -> BEGIN -> SELECT COUNT(*) INTO num FROM fruits WHERE s_id = sid; -> END // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ; mysql> CALL CountProc1 (101, @num); Query OK, 1 row affected (0.00 sec) mysql> select @num; +------+ | @num | +------+ | 3 | +------+ 1 row in set (0.02 sec)
調(diào)用存儲(chǔ)函數(shù)
定義存儲(chǔ)函數(shù)CountProc2,然后調(diào)用這個(gè)函數(shù)
mysql> DELIMITER // mysql> CREATE FUNCTION CountProc2 (sid INT) -> RETURNS INT -> BEGIN -> RETURN (SELECT COUNT(*) FROM fruits WHERE s_id = sid); -> END // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ; mysql> SELECT CountProc2(101); +--------------------+ | Countproc(101) | +--------------------+ | 3 | +-------------------+
9.3、查看存儲(chǔ)過(guò)程和函數(shù)
MySQL存儲(chǔ)了存儲(chǔ)過(guò)程和函數(shù)的狀態(tài)信息,用戶可以使用SHOW STATUS語(yǔ)句或SHOW CREATE語(yǔ)句查看,也可以直接從系統(tǒng)information_schema數(shù)據(jù)庫(kù)中查看。
使用SHOW STATUS語(yǔ)句可以查看存儲(chǔ)過(guò)程和函數(shù)狀態(tài),基本語(yǔ)法為:
SHOW [PROCEDURE | FUNCTION] STATUS [LIKE 'pattern']
SHOW STATUS語(yǔ)句示例
mysql> SHOW PROCEDURE STATUS LIKE 'C%'\G *************************** 1. row *************************** Db: test Name: CountProc Type: PROCEDURE Definer: root@localhost Modified: 2017-08-04 11:32:08 Created: 2017-08-04 11:32:08 Security_type: DEFINER Comment: character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: utf8_general_ci 1 row in set (0.00 sec)
使用SHOW CREATE語(yǔ)句可以查看存儲(chǔ)過(guò)程和函數(shù)狀態(tài),基本語(yǔ)法為:
SHOW CREATE [PROCEDURE | FUNCTION] sp_name
SHOW CREATE語(yǔ)句示例
mysql> SHOW CREATE PROCEDURE test.CountProc \G *************************** 1. row *************************** Procedure: CountProc sql_mode: Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `CountProc`(OUT param1 INT) BEGIN SELECT COUNT(*) INTO param1 FROM fruits; END character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: utf8_general_ci 1 row in set (0.00 sec)
MySQL中存儲(chǔ)過(guò)程和函數(shù)的信息存儲(chǔ)在information_schema數(shù)據(jù)庫(kù)下的Routines表中,可以通過(guò)查詢?cè)摫淼挠涗泚?lái)查詢存儲(chǔ)過(guò)程和函數(shù),其基本語(yǔ)法為:
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME= 'sp_name';
從Routines表中查詢名稱為CountProc的存儲(chǔ)過(guò)程的信息
mysql> SELECT * FROM information_schema.Routines -> WHERE ROUTINE_NAME='CountProc' AND ROUTINE_TYPE = 'PROCEDURE' \G *************************** 1. row *************************** SPECIFIC_NAME: CountProc ROUTINE_CATALOG: def ROUTINE_SCHEMA: test ROUTINE_NAME: CountProc ROUTINE_TYPE: PROCEDURE DATA_TYPE: CHARACTER_MAXIMUM_LENGTH: NULL CHARACTER_OCTET_LENGTH: NULL NUMERIC_PRECISION: NULL NUMERIC_SCALE: NULL CHARACTER_SET_NAME: NULL COLLATION_NAME: NULL DTD_IDENTIFIER: NULL ROUTINE_BODY: SQL ROUTINE_DEFINITION: BEGIN SELECT COUNT(*) INTO param1 FROM fruits; END EXTERNAL_NAME: NULL EXTERNAL_LANGUAGE: NULL PARAMETER_STYLE: SQL IS_DETERMINISTIC: NO SQL_DATA_ACCESS: CONTAINS SQL SQL_PATH: NULL SECURITY_TYPE: DEFINER CREATED: 2017-08-04 11:32:08 LAST_ALTERED: 2017-08-04 11:32:08 SQL_MODE: ROUTINE_COMMENT: DEFINER: root@localhost CHARACTER_SET_CLIENT: utf8 COLLATION_CONNECTION: utf8_general_ci DATABASE_COLLATION: utf8_general_ci 1 row in set (0.00 sec)
9.4、修改存儲(chǔ)過(guò)程和函數(shù)
使用ALTER語(yǔ)句可以修改存儲(chǔ)過(guò)程或函數(shù)的特性,基本語(yǔ)法為:
ALTER [PROCEDURE | FUNCTION ] sp_name [characteristic ...]
修改存儲(chǔ)過(guò)程CountProc的定義。將讀寫(xiě)權(quán)限改為MODIFIES SQL DATA,并指明調(diào)用者可以執(zhí)行
mysql> ALTER PROCEDURE CountProc -> MODIFIES SQL DATA -> SQL SECURITY INVOKER ; Query OK, 0 rows affected (0.00 sec) mysql> SELECT SPECIFIC_NAME,SQL_DATA_ACCESS,SECURITY_TYPE -> FROM information_schema.Routines -> WHERE ROUTINE_NAME='CountProc' AND ROUTINE_TYPE='PROCEDURE'; +---------------+-------------------+---------------+ | SPECIFIC_NAME | SQL_DATA_ACCESS | SECURITY_TYPE | +---------------+-------------------+---------------+ | CountProc | MODIFIES SQL DATA | INVOKER | +---------------+-------------------+---------------+ 1 row in set (0.00 sec)
9.5、刪除存儲(chǔ)過(guò)程和函數(shù)
刪除存儲(chǔ)過(guò)程和函數(shù),可以使用DROP語(yǔ)句,其語(yǔ)法格式為:
DROP[PROCEDURE | FUNCTION ] [IF EXISTS] sp_name
刪除存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)
mysql> DROP PROCEDURE CountProc; Query OK, 0 rows affected (0.00 sec) mysql> DROP FUNCTION CountProc; Query OK, 0 rows affected (0.00 sec)