首页 > 数据库 >《MySQL必知必会》之快速入门存储过程

《MySQL必知必会》之快速入门存储过程

时间:2022-12-10 23:11:06浏览次数:37  
标签:存储 必知 MySQL -- PROCEDURE 必会 total 过程 SELECT

使用存储过程

本章介绍什么是存储过程,为什么使用、如何使用,并介绍如何创建和使用存储过程的基本语法

存储过程

在实际应用中,往往需要执行多个表的多条sql语句

存储过程就是为以后的使用而保存的一条或者多条sql语句的集合

使用存储过程的好处:简单、安全、高性能

创建存储过程

需求:一个返回产品平均价格的存储过程

CREATE PROCEDURE productpricing()
BEGIN
     SELECT Avg(prod_price) AS priceaverage
     FROM products;
END; 

此存储过程名为productpricing,用CREATE PROCEDURE productpricing()语句定义,如果有参数需要在()中列举

BEGIN...END用来限定存储过程体,过程体本身就是一个简单的select语句

注意:

; 分号冲突的问题,MySQL命令行实用程序也使用 ; 作为分隔符

解决办法是临时更改命令行实用程序的语句分隔符

DELIMITER //
CREATE PROCEDURE productpricing()
BEGIN
     SELECT Avg(prod_price) AS priceaverage
     FROM products;
END //
DELIMITER ;

DELIMITER //就是指定命令行实用程序实用//作为新的语句结束分隔符

CALL productpricing();
DROP PEOCEDURE productpricing;

通过上述代码调用和删除存储过程

使用参数

CREATE PROCEDURE productpricing(
   OUT pl DECIMAL(8,2),
   OUT ph DECIMAL(8,2),
   OUT pa DECIMAL(8,2)
)
BEGIN
   SELECT Min(prod_price)
   INTO pl
   FROM products;
   SELECT Max(prod_price)
   INTO ph
   FROM products;
   SELECT Avg(prod_price)
   INTO pa
   FROM products;
END;

此存储过程接受3个参数:pl存储产品最低价格,ph存储产品最高价格,pa存储产品平均价格。

每个参数必须具有指定的类型,这里使用十进制值。关键字OUT指出相应的参数用来从存储过程传出一个值(返回给调用用者)。MySQL支持IN(传递给存储过程)、OUT(从存储过程传出,如这里所用)和INOUT(对存储过程传入和传出)类型的参数

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

上述存储过程中的三个形参对应了此时调用存储过程中的三个实参

注意MySQL中的变量都是以@开始的

于是就可以使用变量了

SELECT @priceaverage;

需求:使用存储过程设计一个接收订单号并返回该订单的合计

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;

其中onumber定义为IN表示该订单号需要被传入存储过程,ototal定义为OUT表示要从存储过程返回合计,INTO将select后的值存入ototal

CALL ordertotal(20005,@total);
SELECT @total;

上述sql即可返回订单合计

建立智能存储过程

想要完成更复杂的业务,需求:需要对合计添加营业税

-- Name: ordertotal
-- Parameters: onumber = order number
--             taxable = 0 if not taxable, 1 if taxable
--             ototal = order total variable

CREATE PROCEDURE ordertotal(
   IN onumber INT,
   IN taxable BOOLEAN,
   OUT ototal DECIMAL(8,2)
) COMMENT 'Obtain order total, optionally adding tax'
BEGIN

   -- Declare variable for total
   DECLARE total DECIMAL(8,2);
   -- Declare tax percentage
   DECLARE taxrate INT DEFAULT 6;

   -- Get the order total
   SELECT Sum(item_price*quantity)
   FROM orderitems
   WHERE order_num = onumber
   INTO total;

   -- Is this taxable?
   IF taxable THEN
      -- Yes, so add taxrate to the total
   SELECT total+(total/100*taxrate) INTO total;
   END IF;

   -- And finally, save to out variable
   SELECT total INTO ototal;

END;

上述sql在之前基础上增加了taxable的布尔类型,使用DECLARE定义了两个局部变量,通过IF子句检查taxable是否为真从而增加税收

CALL ordertotal(20005,0,@total);
SELECT @total;

指定0或者1来决定是否增添税收

检查存储过程

SHOW CREATE PROCEDURE ordertotal;

上述sql显示ordertotal的存储过程的create语句

SHOW PROCEDURE STATUS ordertotal;

上述sql显示一些具体信息

标签:存储,必知,MySQL,--,PROCEDURE,必会,total,过程,SELECT
From: https://www.cnblogs.com/Changes404/p/16972566.html

相关文章

  • mysql约束
    Mysql约束约束用于确保数据库的数据满足特定的商业规则在Mysql中,约束包括:notnull、unique、primarykey、foreignkey和check五种primarykey(主键)的使用(主键列不......
  • 后端程序员必会的前端知识-05:React
    五.React1.React基础react是前端三大框架之一没有vue的基础更好,因为两者思想不太一样,不能用vue的习惯学习react需要有js基础,视频19-58需要有ts基础,视......
  • MySQL 5.7中文乱码与远程链接问题
    (MySQL5.7中文乱码与远程链接问题)1.MySQL5.7中文乱码当我们直接在数据库里面输入中文时,保存后出现:Incorrectstringvalue:‘\xE9.....’forcolumn''atrow1出......
  • python连接数据库mysql
    前提:电脑已经安装数据库环境1、导入pymysql库2、建立连接:md=pymysql.connect(host='localhost',user='root',password='数据库密码',db='lili')3、新建游标:cur=md......
  • 力扣175(MySQL)-组合两个表(简单)
    题目:表: Person  表: Address编写一个SQL查询来报告Person表中每个人的姓、名、城市和州。如果personId的地址不在 Address 表中,则报告为空 null 。以......
  • 静态文件配置 django连接MySQL django模型层初识 ORM基本语句
    目录静态文件配置1.问题描述2.静态文件3.资源访问form表单属性补充actionmethod请求方法get请求post请求views层request对象request.methodrequest.POSTrequest.GETpyc......
  • mysql/lightdb for pg/oracle jdbc大数据量插入优化
    10.10.6 大数据量插入优化在很多涉及支付和金融相关的系统中,夜间会进行批处理,在批处理的一开始或最后一般需要将数据回库,因为应用和数据库通常部署在不同的服务器,而且应用......
  • benchmarksql详解及支持mysql、达梦、citus的lightdb benchmarksql分支
    为什么使用benchmarksql压测?因为大多数应用系统使用java开发,并且不使用存储过程,故使用benchmarksql压测数据库最公平,既可以测试数据库,也可以测试JDBC驱动。可以用来......
  • oracle 12.2+支持mysql与postgresql中的collate(排序规则)特性
    sqlserver,mysql,postgresql都支持针对字符串类型定义排序规则的概念(collate),一般来说,排序规则分为三种:基于二进制,是否区分大小写,是否区分重音。例如sqlserver中:SELE......
  • oracle/mysql/lightdb/postgresql java jdbc类型映射
    MySQL数据类型JAVA数据类型JDBCTYPE普通变量类型主键类型BIGINTLongBIGINT支持支持TINYINTByteTINYINT支持不支持SMALLINTShortSMALLINT支持不支持MEDIUMINTIntegerINTEGER......