天天看點

mysql------存儲過程和函數

1、建立存儲過程和函數

(1) 建立存儲過程

建立存儲過程,需要使用 CREATE    PROCEDURE 語句 。

文法: CREATE   PROCEDURE

            sp_name   ( [proc_parameter] )   [characteristics ...]

            routine_body

sp_name :存儲過程的名字;

proc_parameter:為指定存儲過程的參數清單,清單形式如下:[ IN | OUT | INOUT ] param_name   type 。IN表示輸入參數,OUT表示輸出參數,INOUT表示可以輸入也可以輸出,param_name表示參數名稱,  type表示參數類型;

characteristics:指定存儲過程的特性;

routine_body:SQL代碼的内容,可以用begin...end來表示開始和結束

例1:建立檢視fruits表的存儲過程, 每次調用這個存儲過程的時候都會執行SELECT語句檢視表的内容,代碼的執行過程如下

DELIMITER //
 CREATE PROCEDURE Proc()
     BEGIN
     SELECT * FROM fruits;
     END //
Query OK, 0 rows affected (0.00 sec)

 DELIMITER ;
           

delimiter //是将mysql的結束符設定成// ,完畢後delimiter ;恢複預設結束符,當使用DELIMITER指令時,應該避免使用反斜杠(’\’)字元,因為反斜線是MySQL的轉義字元。

例2:建立一個擷取fruits表記錄條數的存儲過程,名稱是CountProc,COUNT(*) 計算後把結果放入參數param1中

DELIMITER // 
 CREATE PROCEDURE CountProc(OUT param1 INT)
  BEGIN
  SELECT COUNT(*) INTO param1 FROM fruits;
  END //
Query OK, 0 rows affected (0.00 sec)
 DELIMITER ;
           

(2) 建立存儲函數

建立存儲過程,需要使用 CREATE   FUNCTION 語句 。 文法:CREATE   FUNCTION      func_name( [func_parameter] )

                 RETURNS    type

                 [characteristic ...]         routine_body

 func_name:存儲函數的名字;

func_parameter:為指定存儲過程的參數清單,清單形式如下:[ IN | OUT | INOUT ] param_name   type 。IN表示輸入參 數,OUT表示輸出參數,INOUT表示可以輸入也可以輸出,param_name表示參數名稱,  type表示參數類型;

RETURNS    type :表示函數傳回資料的類型;

characteristics:指定存儲函數的特性。

例1:建立存儲函數,名稱為NameByZip,參數為空,該函數傳回SELECT語句的查詢結果,傳回的數值類型為字元串型

CREATE FUNCTION NameByZip ()
 RETURNS CHAR(50)
 RETURN  (SELECT s_name FROM suppliers WHERE s_call= '48075');
           

(3) 變量的使用

A、定義變量

文法:DECLARE    var_name[,varname]…     date_type    [DEFAULT value];

如果沒有default  子句,初始值為null

例1:定義名稱為myparam的變量,類型為INT類型,預設值為100

DECLARE  myparam  INT  DEFAULT 100;
           

B、為變量指派

文法:SET    var_name = expr [, var_name = expr] ...;

例1:聲明3個變量,分别為var1、var2和var3,資料類型為INT,使用SET為變量指派

DECLARE var1, var2, var3 INT;
SET var1 = 10, var2 = 20;
SET var3 = var1 + var2;
           

MySQL中還可以通過SELECT ... INTO為一個或多個變量指派

文法:SELECT   col_name[,...]    INTO    var_name[,...] table_expr;

這個SELECT文法把標明的列直接存儲到對應位置的變量。

col_name表示字段名稱;var_name表示定義的變量名稱;table_expr表示查詢條件表達式,包括表名稱和WHERE子句。

例2:聲明變量fruitname和fruitprice,通過SELECT ... INTO語句查詢指定記錄并為變量指派

DECLARE fruitname CHAR(50);
DECLARE fruitprice DECIMAL(8,2);

SELECT f_name,f_price INTO fruitname, fruitprice
FROM fruits WHERE f_id ='a1';
           

(4)   定義條件和處理程式

A、定義條件 B、定義處理程式

(5) 光标的使用

Mysql的光标隻能在存儲過程和函數中使用

A、聲明光标

建立光智語法:Declare 光标名 custor for  select語句内容

如:daclare cursor_fruit cursor for selectf_name,f_price from fruits;

B、 打開光标

文法:open 光标名;

如:open cusor_fruit;

C、 使用光标

文法:fetch 光标名  into 參數1,參數2……

參數必須在聲明光标之前就定義好,把select查詢出來的資訊存入該參數中。

如:fetch cursor_fruit into fruit_name,fruit_price;

表示将cursor_fruit中select語句查詢出來的資訊存入fruit_name和fruit_price中。

D、 關閉光标

文法:close 光标名

如:close cursor_fruit;

(6) 流程控制的使用 A、IF 語句 B、 CASE 語句 C、 LOOP 語句 D、 LEAVE 語句 E、 ITERATE 語句 F、 REPEAT 語句 G、 WHILE 語句

2、調用存儲過程和函數

(1) 調用存儲過程

存儲過程的調用是通過 CALL 語句進行調用的 。 文法:CALL    sp_name ([parameter[,...]])

例1:定義存儲過程

DELIMITER //
 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)

  DELIMITER ;
           

調用存儲過程

CALL CountProc1 (101, @num);
Query OK, 1 row affected (0.00 sec)
           

檢視傳回結果

select @num;
+------+
| @num |
+------+
|    3 |
+------+
1 row in set (0.02 sec)
           

該存儲過程傳回了指定s_id=101的水果商提供的水果種類,傳回值存儲在num變量中,使用SELECT檢視,傳回結果為3。

當存儲過程中傳入中文參數時,要加上character set gbk

如:create procedure useinfo(in u_name varchar(50) characterset gbk,out u_age int)

(2)   調用存儲函數

存儲函數的使用方法與MySQL内部函數的使用方法是一樣的

例1:定義存儲函數CountProc2,然後調用這個函數

DELIMITER //
 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)
  DELIMITER ;
           

調用存儲函數

SELECT CountProc2(101);
+--------------------+
| Countproc(101) |
+--------------------+
|             3 |
+-------------------+
           

3、 檢視存儲過程和函數

(1)SHOW   STATUS 語句檢視存儲過程和函數的狀态

文法:SHOW {PROCEDURE | FUNCTION}     STATUS     [LIKE 'pattern']

 如:SHOW    PROCEDURE   STATUS    LIKE     'C%'\G

(2)SHOW    CREATE語句檢視存儲過程和函數的定義

文法:SHOW  CREATE   {PROCEDURE | FUNCTION}    sp_name

如:SHOW    CREATE    FUNCTION      test.CountProc    \G

(3)從 information_schema.Routines 表中檢視存儲過程和函數的資訊

MySQL 中存儲過程和函數的資訊存儲在 information_schema 資料庫下的 Routines 表中 。 可以通過查詢該表的記錄來查詢存儲過程和函數的資訊。 文法:SELECT   *    FROM       information_schema.Routines     WHERE     ROUTINE_NAME=' sp_name ' ;

如:SELECT   *   FROM    information_schema.Routines   WHERE        ROUTINE_NAME='CountProc'     AND  ROUTINE_TYPE = 'FUNCTION'     \G

4、修改存儲過程和函數

使用 ALTER 語句可以修改存儲過程或函數的特性。 文法:ALTER {PROCEDURE | FUNCTION}      sp_name [characteristic ...]

例1:修改存儲過程CountProc的定義。将讀寫權限改為MODIFIES   SQL   DATA,并指明調用者可以執行

ALTER  PROCEDURE  CountProc  
MODIFIES SQL DATA
SQL SECURITY INVOKER ; 
           

查詢修改後的CountProc表資訊 

SELECT SPECIFIC_NAME,SQL_DATA_ACCESS,SECURITY_TYPE
      FROM information_schema.Routines
     WHERE ROUTINE_NAME='CountProc' AND ROUTINE_TYPE='PROCEDURE';
           

5、删除存儲過程和函數

删除存儲過程和函數,可以使用 DROP 語句 。

文法:DROP {PROCEDURE | FUNCTION}     [IF    EXISTS]       sp_name

例1:删除存儲過程和存儲函數

DROP PROCEDURE CountProc;
DROP FUNCTION CountProc;
           

轉載請注明出處:http://blog.csdn.net/linshuxin111/

繼續閱讀