真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

九、MySQL存儲(chǔ)過(guò)程和函數(shù)

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


文章標(biāo)題:九、MySQL存儲(chǔ)過(guò)程和函數(shù)
分享URL:http://weahome.cn/article/giphgd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部