存储过程是一个程序化函数,由sql语句及相应的控制结构组成。
1 DELIMITER $$ 2 3 CREATE PROCEDURE Total_Orders(OUT Total FLOAT) 4 BEGIN 5 SELECT SUM(Amount) INTO Total FROM Orders; 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 DETERMINISTIC 6 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 PROCEDURE Total_Orders; 2 SHOW CREATE FUNCTION Add_Tax;
##删除存储过程或者函数
1 DROP PROCEDURE Total_Orders; 2 DROP FUNCTION Add_Tax;
##调用函数
SELECT Add_Tax(@a);
##游标的使用
1 #Procedure to find the orderid with the largest amount 2 #could be done with max ,but just to illustrate stored procedure 3 #principles 4 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 FROM Orders; 16 DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done=1; 17 18 OPEN C1; 19 REPEAT 20 FETCH C1 INTO This_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 END REPEAT; 28 CLOSE C1; 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 INTO This_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;