SHOW PROCEDURE STATUS;
SHOW PROCEDURE STATUS LIKE 'ordertotal';
DELIMITER ;
CREATE PROCEDURE productpricing(OUT pl DECIMAL(8,2),OUT ph DECIMAL(8,2),OUT pa DECIMAL(8,2) )
BEGIN
SELECT Min(prod_price) FROM products INTO pl;
SELECT Max(prod_price) FROM products INTO ph ;
SELECT Avg(prod_price) FROM products INTO pa ;
END//
DELIMITER ;
CALL productpricing(@a,@b,@c);
SELECT @a,@b,@c;
CREATE PROCEDURE ordertotal(
IN onumber int,
OUT ototal DECIMAL(8,2))
BEGIN
SELECT Sum(item_price*quantity) FROM orderitems
WHERE order_num=onumber
INTO ototal;
END//
DELIMITER ;
CALL ordertotal(20005,@total);
SELECT @total;
智能存储:
CREATE PROCEDURE ordertotal(
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL(8,2)) COMMENT 'obtain order total,optionally adding tax.'
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*taxrate/100 INTO total;
END IF;
SELECT total INTO ototal;
END//
DELIMITER ;
SHOW PROCEDURE STATUS;
SHOW PROCEDURE STATUS LIKE 'ordertotal';
CALL ordertotal(20005,0,@total1);
CALL ordertotal(20005,10,@total2);
SELECT @total1,@total2;
mysql游标只能应用于存储过程和函数。
DECLARE的次序:必须先局部变量,再游标,最后句柄
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
OPEN ordernumbers;
CLOSE ordernumbers;
END//
CREATE PROCEDURE processorders()
BEGIN
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
OPEN ordernumbers;
FETCH ordernumbers INTO o;
CLOSE ordernumbers;
END//
CREATE PROCEDURE processorders()
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
OPEN ordernumbers;
REPEAT
FETCH ordernumbers INTO o;
UNTIL done END REPEAT;
CLOSE ordernumbers;
END//
SELECT * FROM ordertotals//