1.存储过程
-- 创建存储过程;
DROP PROCEDURE IF EXISTS ordertotal;
DELIMITER $$
CREATE DEFINER = 'root' @'%' PROCEDURE ordertotal (
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL (8, 2)
)
BEGIN
DECLARE total DECIMAL (8, 2);
DECLARE taxrate INT DEFAULT 6;
SELECT
SUM(item_price * quantity)
FROM
orderitems
WHERE order_num = onumber INTO total;
IF taxable
THEN
SELECT
total + (total / 100 * taxrate) INTO total;
END IF;
SELECT
total INTO ototal;
END $$
DELIMITER ;
-- 调用存储过程
CALL ordertotal(20005,0,@total);
-- 查看输出参数 ;
select -@total;
2.存储过程结合游标
-- 使用游标3--复杂;
DROP PROCEDURE IF EXISTS cursordemo3;
DELIMITER $$
CREATE DEFINER = 'root' @'%' PROCEDURE cursordemo3 ()
BEGIN
-- 声明局部变量;
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
DECLARE t DECIMAL (8, 2);
-- 声明游标;`customers`
DECLARE cursordemo3 CURSOR FOR
SELECT
order_num
FROM
`orders`;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
CREATE TABLE IF NOT EXISTS ordertotals (order_num INT, total DECIMAL (8, 2));
OPEN cursordemo3;
-- 遍历所有行;
REPEAT
FETCH cursordemo3 INTO o;
CALL ordertotal(o, 0, t);
SELECT t;
INSERT INTO ordertotals (order_num, total) VALUE (o, t);
-- 循环结束;
UNTIL done
END REPEAT;
CLOSE cursordemo3;
END $$
DELIMITER ;
CALL cursordemo3 ();
3. 一个最简单的存储过程案例
DELIMITER $$
USE `flowbill_operation_platform` $$
DROP PROCEDURE IF EXISTS demo_test $$
CREATE DEFINER = 'root' @'%' PROCEDURE demo_test ()
BEGIN
SELECT
NOW();
END $$
DELIMITER ;
其中 在整个创建存过过程的语句中,除了在语句结尾以及在begin和end之间可以用分号外,其余地方用$$ 代替分号;
mysql 存储过程使用2个输出参数
DROP PROCEDURE IF EXISTS test_out;
DELIMITER $$
CREATE DEFINER = 'root' @'%' PROCEDURE test_out (OUT nowTime VARCHAR(20) ,OUT nowDate VARCHAR(20))
BEGIN
SELECT TIME(NOW()) INTO nowTime;
SELECT DATE(NOW()) INTO nowDate;
SELECT nowTime;
END $$
DELIMITER ;
CALL test_out(@nowTime,@nowDate);
-- 查看输出参数
SELECT @nowTime;
SELECT @nowDate;
mysql 事件
DELIMITER $$
DROP EVENT IF EXISTS event_do_pps_staff_performance $$
CREATE DEFINER=`nm_wap`@`%` EVENT `event_do_pps_staff_performance` ON SCHEDULE EVERY 30 MINUTE STARTS '2018-05-08 00:00:01' ENDS '2018-12-30 00:00:01' ON COMPLETION PRESERVE ENABLE COMMENT '每隔30分钟,进行调用' DO BEGIN
CALL do_pps_staff_performance();
CALL do_pps_staff_performance_social_channel ();
END$$
DELIMITER ;