当前位置: 首页 > news >正文

SQL - 存储过程

  • 假设你在开发一个应用,应用有一个数据库,你要在哪里写SQL语句?你不会在你的应用代码里写语句,它会让你的应用代码很混乱且难以维护。具体在哪里呢?在存储过程中或函数中。
  • 存储过程是一组为了完成特定功能的SQL语句集合,经编译存储在数据库中,常用于执行复杂的业务逻辑和事务处理
  • 创建一个存储过程
    • -- 创建一个存储进程delimiter $$
      create procedure get_invoices_balance()
      beginselect *from invoiceswhere invoice_total-payment_total>0;
      end$$delimiter ;
      -- 使用 '$$' 改变默认分隔符,告诉MySQL'$$'之间是一个整体,end$$结束call get_clients()	-- call 语句 可以调用 存储进程
  • 删除存储过程
    • drop procedure if exists 名字;
  • 参数
    • 我们一般使用参数为存储过程传递值,我们也可以使用参数为调用程序赋值
    • -- 参数
      drop procedure if exists get_clients_by_state;
      delimiter $$
      create procedure get_clients_by_state(state char(2))
      beginselect * from clients cwhere c.state = state;
      end $$
      delimiter ;call get_clients_by_state('ca')
    • 带默认值的参数
      • 存储过程调用者无法提供参数,我们为参数配置默认值
      • -- 提供默认参数
        drop procedure if exists get_clients_by_state;
        delimiter $$
        create procedure get_clients_by_state(state char(2))
        beginif state is null then set state='ca';end if ;	-- 表示 if 语句结束,因为if语句可以是多个select * from clients cwhere c.state = state;
        end $$
        delimiter ;call get_clients_by_state(null)-- 使用 if - else 
        drop procedure if exists get_clients_by_state;
        delimiter $$
        create procedure get_clients_by_state(state char(2))
        beginif state is null then select * from clients;else select * from clients c where c.state=state;end if;
        end $$
        delimiter ;call get_clients_by_state(null)-- 使用 ifnull()
        drop procedure if exists get_payments;
        delimiter $$
        create procedure get_payments(client_id int,payment_method_id tinyint)
        beginselect *from payments pwhere p.client_id=ifnull(client_id,p.client_id) and p.payment_method=ifnull(payment_method_id,p.payment_method);
        end$$
        delimiter ;call get_payments(null,null);
    • 参数验证
      • 当我们使用存储进程来插入、更新、删除数据时,我们要进行参数验证,确保我们的过程不会意外地往数据库存储错误数据。
      • -- 参数验证
        drop procedure if exists make_payment;
        delimiter $$
        create procedure make_payment
        (	invoice_id int,payment_amount decimal(9,2),payment_date date)
        beginif payment_amount<=0 then signal sqlstate	'Data Exception'set message_text = '不合理';	-- 错误,抛出异常,终止执行			end if ;update invoices i set i.payment_total=payment_amount,i.payment_date=payment_datewhere i.invoice_id=invoice_id;
        end$$
        delimiter ;call make_payment(1, -20, '2019-03-10');
        
    • 输出参数
      • 我们可以 使用 参数 给 调用程序 返回 值
      • drop procedure if exists get_unpaid_invoices_for_client;
        delimiter $$
        create procedure get_unpaid_invoices_for_client (client_id int,out invoices_count int,		-- 标记输出参数out invoices_total decimal(9,2))
        beginselect count(*),sum(invoice_total)into invoices_count,invoices_total -- 读取数据,复制到这些输出参数上from invoices iwhere i.client_id=client_id and payment_total=0;
        end$$
        delimiter ;-- 可以使用 MYSQL工作台提供的图形化工具,更简便
        set @invoices_count = 0;	-- 用户变量
        set @invoices_total = 0;
        call sql_invoicing.get_unpaid_invoices_for_client(3, @invoices_count, @invoices_total);
        select @invoices_count, @invoices_total;
  • 变量
    • 1.用户变量(会话变量)
      • 调用有输出参数的存储过程时使用这些变量,通过传递这些变量,来获取输出参数值
      • set 语句定义变量,set @invoices_count=0
    • 2.本地变量
      • 在存储过程或函数中的变量,一旦结束就被清空
      • declare 语句声明变量
      • -- 本地变量
        drop procedure if exists get_risk_factor;
        delimiter $$
        create procedure get_risk_factor()
        begindeclare riskfactor decimal(9,2) default 0;declare invoices_total decimal;declare invoices_count int;select count(*),sum(invoice_total)into invoices_count,invoices_totalfrom invoices;set riskfactor=invoices_total/invoices_count*5;select riskfactor;
        end$$
        delimiter ;
  • 函数
    • 函数只能返回单一值,通常用于计算和转换数据
    • -- 设置函数
      drop function if exists get_risk_factor_for_client;
      delimiter $$
      create function get_risk_factor_for_client (client_id int)
      returns int
      -- 设置函数属性,确定性,能读,能更改
      -- deterministic 
      -- modifies sql data
      reads sql data
      begin
      declare riskfactor decimal(9,2) default 0;declare invoices_total decimal;declare invoices_count int;select count(*),sum(invoice_total)into invoices_count,invoices_totalfrom invoices iwhere i.client_id=client_id;set riskfactor=invoices_total/invoices_count*5;return ifnull(riskfactor,0);
      end$$
      delimiter ;-- 正常内置函数使用
      select client_id,name,get_risk_factor_for_client(client_id)
      from clients;
  • 其他约定
    • 驼峰命名法
    • 下划线命名法

相关文章:

SQL - 存储过程

假设你在开发一个应用&#xff0c;应用有一个数据库&#xff0c;你要在哪里写SQL语句&#xff1f;你不会在你的应用代码里写语句&#xff0c;它会让你的应用代码很混乱且难以维护。具体在哪里呢&#xff1f;在存储过程中或函数中。存储过程是一组为了完成特定功能的SQL语句集合…...

RabbitMQ环境搭建

2.5.RabbitMQ 安装 a.docker方式安装&#xff1a; 1.在我的docker学习笔记中具有详细的安装过程 b.rpm包方式安装&#xff1a; 1.MQ下载地址2.这里是提前下载好后上传安装包到服务器得opt目录下&#xff1a; 3.安装MQ需要先有Erlang语言环境&#xff0c;安装文件的Linux命令…...

多视点抓取(Multi-View Grasping)

目录 前言 一、在机器人抓取检测领域里&#xff0c;多视点抓取是什么意思 二、以GG-CNN为例&#xff0c;GG-CNN是怎么结合多个视点进行抓取预测的 前言 多视点抓取&#xff08;Multi-View Grasping&#xff09;是机器人抓取和检测领域的一个重要概念&#xff0c;它涉及到机器…...

【人工智能】对智元机器人发布的远征A1所应用的AI前沿技术进行详细分析,基于此整理一份学习教程。

智元机器人在其新品发布中应用了多项AI前沿技术。我们可以从以下几个方面来分析和整理这些技术&#xff0c;并基于此整理一份学习教程&#xff1a; 一、智元机器人应用的关键AI技术 自然语言处理 (NLP) 语音识别: 利用先进的语音识别技术&#xff0c;如OpenAI的Whisper&#x…...

影刀RPA--如何获取网页当页数据?

&#xff08;1&#xff09;点击数据抓取-选择需要获取数据的地方-会弹出是否是获取整个表格&#xff08;当前页面&#xff09; &#xff08;2&#xff09;点击“是”&#xff1a;则直接获取整个表格数据-点击完成即可 &#xff08;3&#xff09;点击“否”&#xff1a;如果你想…...

Bean对象生命周期流程图

Bean生命周期流程图&#xff1a;https://www.processon.com/view/link/5f8588c87d9c0806f27358c1 Spring扫描底层流程&#xff1a;https://www.processon.com/view/link/61370ee60e3e7412ecd95d43...

24/8/17算法笔记 策略梯度reinforce算法

import gym from matplotlib import pyplot as plt %matplotlib inline#创建环境 env gym.make(CartPole-v0) env.reset()#打印游戏 def show():plt.imshow(env.render(mode rgb_array))plt.show() show()定义网络模型 import torch #定义模型 model torch.nn.Sequential(t…...

【Linux学习】Linux开发工具——vim

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a;Linux学习 目录 &#x1f308;前言&#x1f525;vim的基本概念&#x1f525;vim的基本操作&#x1f525;vim命令模式的命令集&#x1f525;简单vim配置⭐一键配置美观的vim安装方法卸载方…...

【2025校招】4399 NLP算法工程师笔试题

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间&#xff1a;2024/08/19 &#x1f504; 输入输出&#xff1a;ACM格式 ⏳ 时长&#xff1a;2h 本试卷分为单选&#xff0c;自我评价题&#xff0c;编程题 单选和自我评价这里不再介绍&#xff0c;4399的编程题一如既往地抽象&#xff…...

数据库原理--关系1

目录 一、表的基本构成要素 二、域(Domain) 三、笛卡尔积 四、关系模式 五、关系模式与关系 六、关系的特性 一、表的基本构成要素 表又被叫做关系&#xff0c;在数据库当中&#xff0c;我们可以把行叫做元组和记录&#xff0c;而列在数据库当中通常被我们叫做字段或者…...

【人工智能】AI工程化是将人工智能技术转化为实际应用、创造实际价值的关键步骤

AI工程化是将人工智能技术转化为实际应用、创造实际价值的关键步骤。以下是对AI工程化的详细介绍&#xff1a; 一、概念与定义 AI工程化是使用数据处理、预训练模型、机器学习流水线等技术开发AI软件的过程&#xff0c;旨在帮助企业更高效地利用AI创造价值。它是软件工程在AI…...

《C语言实现各种排序算法》

文章目录 一、排序1、排序的各种方式分类 二、插入排序1、直接插入排序2、希尔排序3、希尔排序时间复杂度分析 三、选择排序1、直接选择排序2、堆排序 四、交换排序1、冒泡排序2、快速排序3、快速排序hoare找基准值4、快排挖坑法找基准值5、前后指针法6、快速排序非递归实现 五…...

【888题竞赛篇】第五题,2023ICPC澳门-传送(Teleportation)

这里写自定义目录标题 更多精彩内容256题算法特训课&#xff0c;帮你斩获大厂60W年薪offer 原题2023ICPC澳门真题传送B站动画详解 问题分析思路分析图的构建最短路径算法具体步骤 算法实现Dijkstra 算法图的构建 代码详解标准代码程序C代码Java代码Python代码Javascript代码 复…...

javascript写一个页码器-SAAS本地化及未来之窗行业应用跨平台架构

一代码 接引入 <script type"text/javascript" src"CyberWin_APP_Page.js" alt"未来之窗页码"></script>function 未来之窗页面触发器(页码){console.log("当前用户新"页码);}CyberWin_Page.set_callback(未来之窗页面触发…...

微信小程序如何自定义一个组件

微信小程序支持组件化开发&#xff0c;这有助于我们复用代码&#xff0c;提高开发效率。下面我将给出一个简单的微信小程序组件化示例&#xff0c;包括一个自定义组件的创建和使用。 1. 创建自定义组件 首先&#xff0c;在项目的 components 目录下创建一个新的组件文件夹&am…...

【数学建模备赛】Ep05:斯皮尔曼spearman相关系数

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、斯皮尔曼spearman相关系数&#xff1a;☀️☀️☀️1. 回顾皮尔逊相关系数2. 斯皮尔曼spearman相关系数3. 斯皮尔曼相关系数公式4. 另外一种斯皮尔曼相关系数定义5. matlab的用法5. matlab的用法 三、对斯皮尔曼相…...

MATLAB进行神经网络建模的案例

下面是一个使用MATLAB进行神经网络建模的案例&#xff0c;该案例涉及使用神经网络来逼近一个未知系统的输入输出关系。这个案例与您提到的学习资料中的实例类似&#xff0c;但我会简化并解释每个步骤。 案例背景 假设我们有一组输入和输出数据&#xff0c;我们希望通过建立一…...

每天一个数据分析题(四百八十九)- 主成分分析与因子分析

关于主成分分析和因子分析的区别&#xff0c;下列描述正确的是&#xff08; &#xff09; A. 主成分分析是一种无监督学习算法&#xff0c;而因子分析是一种有监督学习算法 B. 主成分分析是一种线性变换方法&#xff0c;而因子分析是一种非线性变换方法 C. 主成分分析的结果…...

Java RPC、Go RPC、Node RPC、Python RPC 之间的互相调用

Java RPC、Go RPC、Node RPC、Python RPC 之间的互相调用是完全可以实现的&#xff0c;但需要满足一些条件和依赖于特定的工具和协议。以下是如何实现不同语言之间的RPC互相调用的详细解释&#xff1a; 1. 使用通用协议和标准&#xff1a;gRPC gRPC 是一个高性能、开源的RPC框…...

国外代理IP选择:IP池的大小有何影响

代理IP是跨境人不可或缺的工具&#xff0c;广泛应用于广告验证、数据获取和账号矩阵管理等方面。而在选择代理IP时&#xff0c;IP池的大小往往是一个至关重要的考量因素。本文将深入解析IP池大小对代理IP选择的影响&#xff0c;帮助大家更好地理解这一关键决策点。 一、IP池的…...

如何快速实现手机号码定位查询:3步掌握号码地理位置追踪技术

如何快速实现手机号码定位查询&#xff1a;3步掌握号码地理位置追踪技术 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/g…...

仅剩127天!Python 3.14+原生AOT将成标准解释器默认后端:企业级迁移路线图与兼容性断点预警

第一章&#xff1a;Python 原生 AOT 编译方案 2026 生产环境部署全景概览Python 原生 AOT&#xff08;Ahead-of-Time&#xff09;编译在 2026 年已进入成熟商用阶段&#xff0c;核心由 CPython 官方主导的 cpython-aot 工具链与 PEP 718 所定义的字节码预优化规范共同支撑。该方…...

Nano-Banana与PyTorch Lightning集成:简化深度学习流程

Nano-Banana与PyTorch Lightning集成&#xff1a;简化深度学习流程 用更少的代码&#xff0c;做更多的事情——这就是PyTorch Lightning的魅力所在 如果你正在使用Nano-Banana进行深度学习项目&#xff0c;可能会发现编写训练循环、管理设备、处理日志记录这些重复性工作相当耗…...

从MATLAB到C++:手把手教你将鱼眼相机标定结果(Scaramuzza模型)部署到OpenCV项目

从MATLAB到C&#xff1a;手把手教你将鱼眼相机标定结果&#xff08;Scaramuzza模型&#xff09;部署到OpenCV项目 鱼眼相机因其超广视角在机器人导航、虚拟现实等领域应用广泛。但MATLAB标定结果如何无缝迁移到C工程环境&#xff1f;本文将彻底解决这个痛点&#xff0c;带您完成…...

互联网大厂Java求职面试实录:谢飞机的三轮技术问答与深度解析

互联网大厂Java求职面试实录&#xff1a;谢飞机的三轮技术问答与深度解析 一、面试背景简介 本文模拟了某知名互联网大厂Java研发工程师岗位的面试过程&#xff0c;通过主角谢飞机与严肃面试官的真实问答&#xff0c;覆盖Java后端开发常见知识点&#xff0c;帮助读者系统梳理面…...

Pixel Aurora Engine实战应用:像素游戏道具图标(武器/药水/装备)批量生成

Pixel Aurora Engine实战应用&#xff1a;像素游戏道具图标&#xff08;武器/药水/装备&#xff09;批量生成 1. 像素游戏道具生成的痛点与解决方案 独立游戏开发者经常面临一个共同挑战&#xff1a;如何高效制作大量风格统一的像素艺术道具图标。传统手工绘制方式存在三个主…...

NASM高级特性详解:条件汇编、上下文栈和宏重载

NASM高级特性详解&#xff1a;条件汇编、上下文栈和宏重载 【免费下载链接】nasm A cross-platform x86 assembler with an Intel-like syntax 项目地址: https://gitcode.com/gh_mirrors/na/nasm NASM&#xff08;Netwide Assembler&#xff09;是一款跨平台的x86汇编器…...

Pixel Aurora Engine应用场景:独立开发者低成本构建像素IP资产库

Pixel Aurora Engine应用场景&#xff1a;独立开发者低成本构建像素IP资产库 1. 像素艺术创作新纪元 在游戏开发领域&#xff0c;像素艺术始终保持着独特的魅力。从早期的《超级马里奥》到现代的《星露谷物语》&#xff0c;像素风格游戏凭借其怀旧感和艺术表现力&#xff0c;…...

OPCUA结构体数据处理全解析:C#如何高效读写ExtensionObject中的复杂数据

OPCUA结构体数据处理全解析&#xff1a;C#如何高效读写ExtensionObject中的复杂数据 在工业自动化与物联网系统中&#xff0c;OPCUA协议已成为设备间数据交换的事实标准。当面对复杂的自定义结构体数据时&#xff0c;ExtensionObject的处理往往成为开发者的痛点。本文将深入剖析…...

seo优化机构怎样选择才合适_什么是seo优化机构

SEO优化机构怎样选择才合适_什么是SEO优化机构 在当今的数字化时代&#xff0c;拥有一个高效的网站已经不再是企业竞争力的唯一标准&#xff0c;更重要的是这个网站能够在搜索引擎上获得良好的排名。这就是搜索引擎优化&#xff08;SEO&#xff09;的重要性所在。选择一个合适…...