day11 -- 存储过程+触发器+事物处理

news2024/11/25 18:37:10

学习内容

  • 什么是存储过程
  • 如何使用存储过程


学习记录

存储过程

经常会有一个完整的操作需要多条语句才能完成。
此外,需要执行的具体语句及其次序也不是固定的,它们可能会根据条件而选择性的执行。
那应该怎么办呢?可以创建存储过程。
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件(脚本?),虽然它们的作用不仅限于批处理。

  • 执行存储过程
    MySQL称存储过程的执行为调用,因此MySQL执行存储过程的语句为CALL。 CALL接受存储过程的名字以及需要传递给它的任意参数。
# 执行名为productpricing的存储过程,它计算并返回产品的最低、最高和平均价格
CALL productpricing(@pricelow,
@prichigh,
@priceaverage)
  • 创建存储过程
    此存储过程名为productpricing,用CREATE PROCEDURE productpricing()语句定义。如果存储过程接受参数,它们将在()中列举出来。此存储过程没有参数,但后跟的()仍然需要。
    BEGIN和END语句用来限定存储过程体,过程体本身仅是一个简单的SELECT语句.。
CREATE PROCEDURE productpricing()
BEGIN
	SELECT Avg(prod_price) AS priceaverage
	FROM products;
END;

上面出现了 多个分号分隔符,在命令行可能会出错
在这里插入图片描述

  • 删除存储过程
# 此时的存储过程后面不需要带上括号了
DROP PROCEDURE productpricing;
  • 使用参数
    MySQL支持IN(传递给存储过程)、 OUT(从存储过程传出,如这里所用)和INOUT(对存储过程传入和传出)类型的参数。
# 这个存储过程接受一个参数 product_id,并返回与之对应的产品价格。
DELIMITER //
CREATE PROCEDURE productpricing(IN product_id INT)
BEGIN
    SELECT price
    FROM products
    WHERE id = product_id;
END //
DELIMITER ;

如下这个存储过程接受一个参数 product_id,并返回与之对应的产品名称和价格。
在此例中,我们定义了两个输出参数:product_name 和 product_price。
当存储过程被调用时,这些参数将被填充为查询结果的值。这里使用了 INTO 关键字将查询结果赋值给输出参数。

DELIMITER //

CREATE PROCEDURE productpricing(IN product_id INT, OUT product_name VARCHAR(255), OUT product_price DECIMAL(10,2))
BEGIN
    SELECT name, price INTO product_name, product_price
    FROM products
    WHERE id = product_id;
END //

DELIMITER ;
  • 更复杂的存储过程
CREATE PROCEDURE calculate_order_total_with_tax(
    IN order_id INT,  -- 订单号
    IN customer_state CHAR(2),  -- 客户所在州
    OUT order_total DECIMAL(10,2)  -- 输出参数:合计(带税或不带税)
)
BEGIN
    DECLARE subtotal DECIMAL(10,2);  -- 小计
    DECLARE tax_rate DECIMAL(4,2);  -- 营业税率
    DECLARE taxable_customer BOOLEAN;  -- 是否需要添加营业税

    SELECT SUM(price * quantity) INTO subtotal FROM order_items WHERE order_id = order_id; -- 计算小计
    
    SELECT tax_rate INTO tax_rate FROM states WHERE state_code = customer_state; -- 获取客户所在州的营业税率
    
    IF (tax_rate IS NOT NULL) THEN -- 如果该州有营业税
        SELECT COUNT(*) INTO taxable_customer FROM customers WHERE state = customer_state; -- 检查顾客是否来自有税的州
        IF (taxable_customer = 1) THEN -- 如果是有税的顾客
            SET order_total = subtotal + (subtotal * tax_rate); -- 计算总合计(含税)
        ELSE -- 如果是无税的顾客
            SET order_total = subtotal; -- 总合计不含税
        END IF;
    ELSE -- 如果该州没有营业税
        SET order_total = subtotal; -- 总合计不含税
    END IF;

END;

sql版的脚本,没得一定经验搞不定。 ⇐ 暂时放弃!!



触发器

MySQL语句在需要时被执行,存储过程也是如此。但是,如果你想要某条语句(或某些语句)在事件发生时自动执行,怎么办呢?

触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句):

  • DELETE;
  • INSERT;
  • UPDATE。

触发器是针对数据库的,而不是针对服务器的。当特定事件在数据库中发生时,触发器会自动触发相应的操作或动作。这些操作可以是SQL语句、存储过程、或者其他类型的代码。触发器可以用来确保数据的一致性和完整性,以及执行其他需要在特定条件下自动执行的任务。

触发器是数据库对象的一种,因此记录在数据库中的系统表中。具体来说,在SQL Server数据库中,每个数据库都有一个名为sys.triggers的系统表,其中包含了所有触发器的信息。您可以使用SELECT语句从该表中检索有关触发器的详细信息,例如名称、创建日期、所属表等。此外,您也可以使用SQL Server Management Studio (SSMS) 或其他数据库管理工具来查看和管理触发器。

  • 创建触发器

在创建触发器时,需要给出4条信息:

  • 唯一的触发器名;
  • 触发器关联的表;
  • 触发器应该响应的活动( DELETE、 INSERT或UPDATE);
  • 触发器何时执行(处理之前或之后)。

假设我们有一个名为 orders 的表,每当该表中插入新行时,我们需要自动更新 customers 表中对应客户的最近订单日期。

1.首先,在 MySQL 中创建一个名为 update_customer_last_order_date 的触发器:

CREATE TRIGGER update_customer_last_order_date
AFTER INSERT ON orders FOR EACH ROW
BEGIN
  	UPDATE customers
  	SET last_order_date = NEW.order_date
  	WHERE customer_id = NEW.customer_id;
END;
  • AFTER INSERT ON orders 表示在 orders 表中插入新行后执行触发器。
  • FOR EACH ROW 表示对于每个插入的行都执行一次该触发器。
  • NEW 表示新插入的行,我们可以使用 NEW. 来访问其列值。
  • UPDATE customers SET last_order_date = NEW.order_date 表示将 customers 表中 last_order_date 列更新为新插入的 orders 表中的 order_date 值。
  • WHERE customer_id = NEW.customer_id 表示仅更新与新插入行相应的客户记录。
  • 删除触发器
    触发器不能更新或覆盖。为了修改一个触发器,必须先删除它,然后再重新创建
DROP TRIGGER newtrigger;


事务处理

事务处理是一种机制,用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。

利用事务处理,可以保证一组操作不会中途停止,它们或者作为整体执行,或者完全不执行(除非明确指示)。如果没有错误发 生,整组语句提交给(写到)数据库表。如果发生错误,则进行回退(撤销)以恢复数据库到某个已知且安全的状态。

简单来说,事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。

下面是关于事务处理需要知道的几个术语:

  • 事务(transaction)指一组SQL语句;
  • 回退(rollback)指撤销指定SQL语句的过程;
  • 提交(commit)指将未存储的SQL语句结果写入数据库表;
  • 保留点( savepoint)指事务处理中设置的临时占位符( placeholder),你可以对它发布回退(与回退整个事务处理不同)。

管理事务处理的关键在于将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退。

  • ROLLBACK

例如,首先执行一条SELECT以显示该表不为空。
然后开始一个事务处理,用一条DELETE语句删除ordertotals中的所有行。
另一条SELECT语句验证ordertotals确实为空。
这时用一条ROLLBACK语句回退START TRANSACTION之后的所有语句,最后一条SELECT语句显示该表不为空。

SELECT * FROM ordertotals;
START TRANSACTION;
DELETE FROM ordertotal;
SELECT * FROM ordertotals;
ROLLBACK;
SELECT * FROM ordertotals;
  • COMMIT
    一般的MySQL语句都是直接针对数据库表执行和编写的。这就是所谓的隐含提交( implicit commit),即提交(写或保存)操作是自动进行的。

    但是,在事务处理块中,提交不会隐含地进行。为进行明确的提交,使用COMMIT语句.

START TRANSACTION
DELETE XXX,
DELETE XXX,
COMMIT;
  • 保留点
    为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符。这样,如果需要回退,可以回退到某个占位符。
    这些占位符称为保留点。为了创建占位符,可如下使用SAVEPOINT语句。
# 每个保留点都取标识它的唯一名字,以便在回退时, MySQL知道要回退到何处
SAVEPOINT delete1;

# 为了回退到本例给出的保留点,可如下进行
ROLLBACK TO delete1;
  • 更改默认提交行为
    默认的MySQL行为是自动提交所有更改。换句话说,任何时候你执行一条MySQL语句,该语句实际上都是针对表执行的,而且所做的更改立即生效。

    为指示MySQL不自动提交更改,需要使用以下语句:

SET auotcommit = 0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/616378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业镜头分类、相关参数含义

一、工业镜头参数 1、焦距/后焦距 焦距是像方主面到像方焦点的距离。后焦距指光线离开镜头最后一片镜片表面到sensor感光面的距离,如8mm,16mm,25mm等; 焦距的大小决定着视角大小,焦距数值小,视角大&#…

4个月完成职位申请并CSC改派出国|新加坡南洋理工大学访学申请记

由于原访学国家签证被拒,O老师期望能申请手续便捷且容易通过签证的国家,最终我们成功申请到世界名校新加坡南洋理工大学的国家教育研究学院。从获得邀请函、办理CSC改派及派出、顺利签证直至出国等全套手续,仅仅4个月。 O老师背景&#xff1a…

腾讯应用宝 - 微下载

首次接触微下载这个概念,故简单记录一下 产品:微下载配置好了吗? Me: 嗯?什么微下载? 基础认知微下载是什么?微下载在哪里使用?微下载链接获取方式?个性化功能&#xff…

搜索引擎召回策略总结

一、搜索引擎召回策略的方法和注意事项(自己能想到的&待补充) 二、相关资料 同义变换在百度搜索广告中的应用 https://mp.weixin.qq.com/s/ybkbU8p_3jgKuCGdNWeG8w 2020年kdd Facebook搜索向量召回读后感【小红书MXie】 https://zhuanlan.zhihu.com/p/184920498 美团搜…

一键安装 HomebrewCN

一键安装 HomebrewCN Brew介绍Homebrew 能干什么?Homebrew自身如何使用安装Homebrew国内源安装 Homebrew(github源) Brew介绍 macOS 和 Linux 缺失软件包的管理器 Homebrew 能干什么? 使用 Homebrew 安装 Mac(或Linux)没有预装但你需要的东西。 Ho…

python 第三章 基础语句

系列文章目录 第一章 初识python 第二章 变量 文章目录 3.1 输出格式化输出格式化符号格式化字符串扩展f-格式化字符串转义字符结束符 3.2 输入3.3 数据类型转换转换数据类型的函数 3.4 PyCharm交互式开发3.5 运算符运算符的分类算数运算符赋值运算符复合赋值运算符比较运算符逻…

java设计模式之:工厂模式详解(简单工厂+工厂方法+抽象工厂)

文章目录 简单工厂实现应用场景 工厂方法实现适用场景缺点 抽象工厂实现缺点 在面向对象编程中,创建对象实例最常用的方式就是通过 new 操作符构造一个对象实例,但在某些情况下,new 操作符直接生成对象会存在一些问题。举例来说,对…

软件测试2023年行情怎么样?仔细讲解!

目录 前言: 普通功能测试人员不建议跳槽 还有一个要求就是要对业务的极致理解 那么产业互联网趋势会导致什么呢? 现在跳槽涨薪需要掌握到什么样的技术呢? 给大家一些跳槽建议 前言: 软件测试是为了发现程序中的错误而执行程序的…

Keil5新建工程

STM32新建工程 1、基于寄存器、基于库函数、基于HAL2、基于标准库的工程3、工程架构4、基于库函数点灯实验 1、基于寄存器、基于库函数、基于HAL 1、基于寄存器:与51单片机开发案方式一样,是用程序直接配置寄存器,来达到我们想要的功能&…

基于NE555芯片的简单延时电路和方波信号发生器

简单延时电路 NE555芯片是一种经典的计时器集成电路,常用于电子设计中的定时和延时功能。下面是一个简单的NE555延时电路的详细分析和讲解: NE555芯片是一个多功能的集成电路,主要由比较器、RS触发器、RS锁存器以及输出驱动器等组成。它可以工…

CLIP对比语言-图像预训练算法

本文参考:AIGC神器CLIP:技术详解及应用示例_Baihai IDP的博客-CSDN博客 一、CLIP概述 CLIP:Constastive Language-Image Pretraining。它是一个开源的、多模式的、zero-shot的模型。如果提供一张图像和一段文本描述,该模型可以预…

requestAnimationFrame() 方法

[TOC](requestAnimationFrame() 方法) 一、基本使用 1.基本介绍 window.requestAnimationFrame() 主要是用来实现动画的时候使用的,不管是移动动画还是数字增长动画,使用这个api可以让你的动画看起来非常平滑,因为它是要求浏览器在下次重绘…

【C++ 基础篇:22】:类的 const 对象 与 const 成员函数/方法 以及 类中涉及 const 的常见问题!

本系列 C 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C的三大特性等&#…

基于html+css的图展示111

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

软件测试基础教程学习2

文章目录 软件测试基础2.1 软件测试模型2.2 确认和验证2.3 软件测试分类2.4软件测试流程概述 软件测试基础 2.1 软件测试模型 2.2 确认和验证 软件确认(Validation)和验证(Verification),简称V&V或V2。 确认是指…

python基于yolov7开发构建手写甲骨文检测识别系统

在我之前的文章中,关于手写文字、手写数字、手写字母的检测识别相关的项目都有了不少的实践了,这里就不在赘述了,感兴趣的话可以自行移步阅读即可。 《基于轻量级目标检测模型实现手写汉字检测识别计数》 《python开发构建基于机器学习模型…

Nginx+Tomcat(多实例)实现动静分离和负载均衡四层、七层(总有些惊奇的际遇,比方说当我遇见你)

文章目录 一、Tomcat 多实例部署二、反向代理的两种类型三、NginxTomcat实现负载均衡和动静分离(七层代理)1.动静分离和负载均衡原理2.实现方法3.部署实例(1)部署Nginx负载均衡服务器(2)配置Tomcat多实例服…

【SpringCloud——Sentinel】

一、什么是雪崩? 微服务调用链路中的某个服务发生故障,引起整个链路中的所有微服务都不可用,这就是雪崩。 二、解决雪崩问题的常见措施 1、超时处理 设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休…

vue 3 第三十三章:自定义 hooks

文章目录 1. vue 2 中mixins1.1. mixins 的缺点: 2. 自定义 hooks2.1. 创建自定义Hook2.2. 在组件中使用自定义Hook 2. 总结 1. vue 2 中mixins 在Vue.js 2.x版本中, mixin 被广泛用于将组件的逻辑、计算属性和方法复用到其他组件中。然而,使…

华为OD机试真题 Java 实现【明明的随机数】【2023Q1 100分】,附详细解题思路

一、题目描述 明明生成了NN个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。 数据范围: 1≤n≤1000 ,输入…