存储过程是一个程序化函数,由sql语句及相应的控制结构组成。
1 DELIMITER $$2
3 CREATE PROCEDURE Total_Orders(OUT Total FLOAT)4 BEGIN
5 SELECT SUM(Amount) INTO Total FROMOrders;6 END
7 $$8
9 DELIMITER ;
DELIMITER #将语句结束符;改为$,将存储过程看成一个整体,执行完存储过程后需要将其改回结束符 ;
使用存储过程
CALL Total_Orders(@t); #将存储过程的结果放在一个用户变量@t里面
SELECT @t;
函数
1 DELIMITER $$2
3 CREATE FUNCTION Add_Tax(Price FLOAT)4 RETURNS FLOAT
5 DETERMINISTIC6 BEGIN
7 DECLARE Tax FLOAT DEFAUT 0.10;8 RETURN Price*(1+Tax);9 END
10 $$11
12 DELIMITER ;
存储函数参数中没有IN或OUT ,参数都是输入值
returns float 表示函数返回一个float类型的数值
DETERMINISTIC表示在给定相同参数情况下,一个确定性函数可以返回相同的值,该位置可以有别的关键字,例如NO SQL 表示程序体没有sql语句
使用return返回一个值
##查看定义
1 SHOW CREATE PROCEDURETotal_Orders;2 SHOW CREATE FUNCTION Add_Tax;
##删除存储过程或者函数
1 DROP PROCEDURETotal_Orders;2 DROP FUNCTION Add_Tax;
##调用函数
SELECT Add_Tax(@a);
##游标的使用
1 #Procedure to find the orderid withthe largest amount2 #could be done with max ,but just to illustrate stored procedure
3 #principles4
5 DELIMITER $$6
7 CREATE PROCEDURE Largest_Order(OUT Largest_ID INT)8 BEGIN
9 DECLARE This_ID INT;10 DECLARE This_Amout FLOAT;11 DECLARE L_Amout FLOAT DEFAULT 0.0;12 DECLARE L_ID INT;13
14 DECLARE Done INT DEFAULT 0;15 DECLARE C1 CURSOR FOR SELECT OrderID,Amount FROMOrders;16 DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done=1;17
18 OPENC1;19 REPEAT20 FETCH C1 INTOThis_ID,This_Amout;21 IF NOT DONE THEN
22 IF This_Amount > L_Amount THEN
23 SET L_Amount=This_Amout;24 SET L_ID =This_ID;25 END IF;26 END IF;27 UNTIL Done ENDREPEAT;28 CLOSEC1;29
30 SET Largest_ID =L_ID;31
32 END
33 $$34
35 DELIMITER ;
使用过程
①在存储过程中声明游标 DECLARE C1 CURSOR FOR SELECT OrderID,Amount FROM Orders;
②声明处理程序 DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done = 1;
③打开游标OPEN C1;
④获取每行数据,
FETCH C1 INTOThis_ID,This_Amout;
使用repeat。。。until done end repeat;来遍历。或者使用while condition DO .....end while;
LOOP ....END LOOP;使用LEAVE语句退出
⑤关闭游标CLOSE C1;
⑥返回输出值。
CALL Largest_Order(@a);
SELECT @a;