mysql笔记(20)--使用存储过程

Posted HardyDragon_CC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql笔记(20)--使用存储过程相关的知识,希望对你有一定的参考价值。

什么是存储过程?

存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。也叫作 调用

为什么使用存储过程?

方便复用复杂的sql,提高性能。。。

如何创建存储进程?

DROP PROCEDURE IF EXISTS mysql_must_study.productpricing;

DELIMITER $$
$$
CREATE PROCEDURE mysql_must_study.productpricing()
BEGIN
	SELECT avg(prod_price) AS priceaverage 
	FROM mysql_must_study.products u;
END
$$
DELIMITER ;

此存储过程名为productpricing,用CREATE PROCEDURE productpricing()语句定义。如果存储过程接受参数,它们将在()中列举出来。此存储过程没有参数,但后跟的()仍然需要。BEGIN和END语句用来限定存储过程体,过程体本身仅是一个简单的SELECT语句。

DELIMITER $$ 指定$$作为语句分隔符,为了使存储过程体内的;生效。最后通过DELIMITER ;恢复;作为结束符。

\\符号外,任何字符都可以用作语句分隔符

如何删除存储过程?

在这里插入图片描述

如何使用存储过程?

MySQL称存储过程的执行调用,因此MySQL执行存储过程的语句为CALL。CALL接受存储过程的名字以及需要传递给它的任意参数

CALL productpricing(); 

在这里插入图片描述

如何给存储过程添加参数?

DROP PROCEDURE IF EXISTS mysql_must_study.productpricing;

DELIMITER $$
$$
CREATE PROCEDURE mysql_must_study.productpricing(
	OUT pl decimal(8,2),
	OUT ph decimal(8,2),
	OUT pa decimal(8,2)
)
BEGIN
	SELECT min(prod_price)
	INTO pl
	FROM mysql_must_study.products ;
	SELECT max(prod_price)
	INTO ph
	FROM mysql_must_study.products ;
	SELECT Avg(prod_price)
	INTO pa
	FROM mysql_must_study.products ;
END
$$
DELIMITER ;

在这里插入图片描述

在这里插入图片描述

CALL productpricing(@pricelow,
					@pricehigh,
					@priceaverage);

这条CALL语句给出3个参数。它们是存储过程将保存结果的3个变量的名字
利用调用返回生成的3个变量。变量调用要加@

变量的查询使用select

SELECT @pricelow,@pricehigh,@priceaverage;

在这里插入图片描述

来看看 IN 在存储过程中的使用,传参功能?

DROP PROCEDURE IF EXISTS mysql_must_study.ordertotal;

DELIMITER $$
$$
CREATE PROCEDURE mysql_must_study.ordertotal(
	IN onumber int ,
	OUT ototal decimal(8,2)
)
BEGIN
	SELECT sum(item_price*quantity)
	FROM mysql_must_study.orderitems 
	WHERE order_num = onumber
	INTO ototal;
END$$
DELIMITER ;

新建一个 ordertotal 调用,传入一个 onumber 参数,根据参数计算后返回一个 ototal 变量。

在这里插入图片描述

CALL ordertotal(20005,@total) ;

必须给 ordertotal 传递两个参数;第一个参数为订单号,第二个参数为包含计算出来的合计的变量名。

SELECT @total;

在这里插入图片描述


更复杂和强大的功能:可以通过传入的参数进行if判断执行对应的语句。

DROP PROCEDURE IF EXISTS mysql_must_study.ordertotal;

DELIMITER $$
$$
CREATE PROCEDURE mysql_must_study.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 mysql_must_study.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 ;

在这里插入图片描述

在这里插入图片描述

查询’存储过程’的信息

SHOW CREATE PROCEDURE ordertotal;

获得包括何时、由谁创建等详细信息的存储过程列表

在这里插入图片描述

总结:

  • 存储过程,调用,可以封装sql语句,调用时可以根据参数返回变量。
  • 通过 create procedure 创建,drop删除。关键字有 in (要传入的参数的数据类型)out(要输出的变量名和其类型);
  • begin 和 end 定义要执行的sql,其中 into 表示将值赋值给要 out 的变量。
  • 查询变量时 select 需要@变量名

以上是关于mysql笔记(20)--使用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL进阶学习笔记四:MySQL存储过程之定义条件,处理过程及存储过程的管理!(视频序号:进阶_11,12)

MySQL-07-笔记

MySQL学习笔记——存储过程

MySql触发器使用

MySql 存储过程笔记

mysql深入浅出的笔记(存储过程一)