使用存储过程
创建存储过程
DELIMITER //
CREATE PROCEDURE productpricing()
BEGIN
SELECT AVG(prod_price) AS priceaverage
FROM products;
END //
DELIMITER ;
注意:
- MySQL命令行客户机的分隔符 如果你使用的是MySQL命令行 实用程序,应该仔细阅读此说明。 默认的MySQL语句分隔符为;(正如你已经在迄今为止所使用 的MySQL语句中所看到的那样)。MySQL命令行实用程序也使 用;作为语句分隔符。如果命令行实用程序要解释存储过程自 身内的;字符,则它们最终不会成为存储过程的成分,这会使 存储过程中的SQL出现句法错误。 解决办法是临时更改命令行实用程序的语句分隔符,如下所示: 其中,DELIMITER //告诉命令行实用程序使用//作为新的语 句结束分隔符,可以看到标志存储过程结束的END定义为END //而不是END;。这样,存储过程体内的;仍然保持不动,并且 正确地传递给数据库引擎。最后,为恢复为原来的语句分隔符,可使用DELIMITER ;。 除\符号外,任何字符都可以用作语句分隔符。
使用存储过程
CALL productpricing();
删除存储过程
DROP PROCEDURE vendProcs;
注意:
-
存储过程不用加()
-
如果没有
vendProcs
存储过程那么上述语句会报错。 -
想要不管存不存在都可以删除不报错可以使用:
DROP PROCEDURE IF EXISTS vendProcs;
有参数的存储过程
- 一般存储过程不显示结果,而是把结果返回给指定的变量。
- 变量是内存中的一个特定的位置,用来临时存储数据。
创建有参数的存储过程
DELIMITER //
CREATE PROCEDURE productpricing(
OUT pl DECIMAL(8,2),
OUT ph DECIMAL(8,2),
OUT pa DECIMAL(8,2)
)
BEGIN
SELECT MIN(prio_price)
INTO pl
FROM products;
SELECT MAX(prio_price)
INTO ph
FROM products;
SELECT AVG(prio_price)
INTO pa
FROM products;
END //
DELIMITER ;
执行存储过程
CALL productpricing(
@pricelow,
@pricehigh,
@priceaverage
);
注意:
- 所有的MySQL变量必须以@开始。
查看变量的值:
SELECT @pricelow;
- 也可以同时查看三个变量的值
SELECT @pricelow,@pricehigh,@priceaverage;
复杂的存储过程
DELIMITER //
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/100*taxrate) INTO total;
END IF;
SELECT total INTO ototal;
END //
DELIMITER ;
-
IF语句:
- IF语句还支持ELSEIF和ELSE子句(前者还使用THEN子句,后者不能使用)。
-
COMMENT关键字.:
-
它不是必须要的,如果给出可以在
SHOW PROCEDURE STATUS ;
中展示。
-
检查存储过程
- 显示存储过程创建的语句
SHOW CREATE PROCEDURE ordertotal;