【笔记】《MySQL必知必会》 第23章 存储过程

原创
2021/03/23 15:21
阅读数 34

使用存储过程

创建存储过程

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;
展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部