存储过程探秘:数据库编程的艺术

文章目录

  • 存储过程
    • 语法格式
    • BEGIN...END语句块
    • DECLARE(声明局部变量)
    • 流控制语句
    • if函数
    • 批处理操作
      • 测试2
      • 测试3
    • 存储过程与函数的关系

存储过程

MYSQL的存储过程是一组预处理的SQL语句,可以像函数一样在数据库中进行存储和调用。

它们允许在数据库中定义一系列的操作,然后通过简单的调用来执行这些操作。而不必每次重写相同的SQL语句。

存储过程通常用于实现复杂的业务逻辑,或执行繁杂的数据库操作。

语法格式

BEGIN…END语句块

存储过程可以使用begin… end… 复合语句来包含多个语句,Statement_list 代表一个或者多个语句的列表,

Statement_list 之间每个语句都必须用分号(;)来结束

存储过程的调用要Call procedure_name().

示例:

select * from user;-- 创建一个存储过程
-- 将语句分隔符改为// 使用完后要再改回;
DELIMITER //
CREATE PROCEDURE GetUser(IN user_id INT)
BEGINselect * from user where id = user_id;
END	//-- 将语句分隔符再修改回;
DELIMITER;-- 删除一个存储过程
DROP PROCEDURE GetUser;-- 调用一个存储过程
CALL GetUser(1);

DECLARE(声明局部变量)

DECLARE var_name[,...] type [DEFAULT value]不再需要@符号
这个语句被用来声明局部变量
要给变量提供一个默认值,要包含一个default 语句
值可以被指定为一个表达式,不需要为一个常数
如果没有default子句,初始值为NULL
局部变量的作用范围在他被声明的begin ... end语句块内。给局部变量更新值,可以使用SET。
-- 在存储过程内部可以定义局部变量
DELIMITER //
CREATE PROCEDURE test1() -- procedure
BEGIN DECLARE x INT;	-- declare 声明DECLARE y INT;set x = 1;set y = 2;SELECT x+y;
END	//DELIMITER ;DROP PROCEDURE test1;call test1();mysql> DELIMITER //
mysql> CREATE PROCEDURE test1() -- procedure-> BEGIN -> DECLARE x INT;-- declare 声明-> DECLARE y INT;-> set x = 1;-> set y = 2;-> SELECT x+y;-> END//
Query OK, 0 rows affected (0.00 sec)mysql> DELIMITER ;
mysql> call test1();
+------+
| x+y  |
+------+
|    3 |
+------+
1 row in set (0.01 sec)Query OK, 0 rows affected (0.01 sec)

流控制语句

在MySQL中,流控制语句用于控制程序的执行流程,包括条件判断、循环和跳转。主要的流控制语句包括:

IF-THEN-ELSE语句:用于基于条件执行不同的代码块。

CASE语句:用于基于多个条件执行不同的代码块。

WHILE循环:当指定条件为真时,重复执行一组语句。

REPEAT循环:先执行一组语句,然后重复执行,直到指定条件为真。

LOOP循环:无限循环,直到遇到LEAVE语句跳出。

LEAVE语句:用于从循环中跳出。

if函数

IF函数是一个MySQL内置函数,它在条件为真时返回一个值,否则返回另一个值。其基本语法如下:

在这里插入图片描述

-- 测试if函数
SELECT if(1 < 5, 'ABC', 'abc');mysql> SELECT if(1 < 5, 'ABC', 'abc');
+-------------------------+
| if(1 < 5, 'ABC', 'abc') |
+-------------------------+
| ABC                     |
+-------------------------+
1 row in set (0.00 sec)-- 测试concat 字符串的拼接函数
SET @i:=10;
select concat(10, 'ABC', '4564');mysql> SET @i:=10;
Query OK, 0 rows affected (0.00 sec)mysql> select concat(10, 'ABC', '4564');
+---------------------------+
| concat(10, 'ABC', '4564') |
+---------------------------+
| 10ABC4564                 |
+---------------------------+
1 row in set (0.00 sec)

批处理操作

DELIMITER //
CREATE PROCEDURE BathInsert(IN num INT)
BEGINDECLARE x INT;set x = 0;while x < num doinsert into user(name, passward) values(concat('name', x), concat('passwd', x));set x = x+1;end while;
END //
DELIMITER ;CAll BathINsert(10);mysql> DELIMITER //
mysql> CREATE PROCEDURE BathInsert(IN num INT)-> BEGIN-> DECLARE x INT;-> set x = 0;-> while x < num do-> 
Display all 779 possibilities? (y or n) -> insert into user(name, passward) values(concat('name', x), concat('passwd', x));-> 
Display all 779 possibilities? (y or n) -> set x = x+1;-> end while;-> END //
Query OK, 0 rows affected (0.01 sec)mysql> DELIMITER ;
mysql> select * from user;
+----+------+----------+
| id | name | passward |
+----+------+----------+
|  1 | tom  | 12345    |
|  2 | bob  | 123456   |
|  3 | jack | 8888     |
+----+------+----------+
3 rows in set (0.00 sec)mysql> CAll BathINsert(10);
Query OK, 1 row affected (0.05 sec)mysql> select * from user;
+----+-------+----------+
| id | name  | passward |
+----+-------+----------+
|  1 | tom   | 12345    |
|  2 | bob   | 123456   |
|  3 | jack  | 8888     |
|  4 | name0 | passwd0  |
|  5 | name1 | passwd1  |
|  6 | name2 | passwd2  |
|  7 | name3 | passwd3  |
|  8 | name4 | passwd4  |
|  9 | name5 | passwd5  |
| 10 | name6 | passwd6  |
| 11 | name7 | passwd7  |
| 12 | name8 | passwd8  |
| 13 | name9 | passwd9  |
+----+-------+----------+
13 rows in set (0.00 sec)

测试2

​ 设置用户变量的rownum为0,从score表中,显示 s_id,s_score,rownum(如果@c_id 等于 c_id, @row_num = @row_num+1,否则 等于 1,因为 c_id没有定义数值,所以第一次不会相同会赋值为1)别名为 rrank ,@c_id = c_id 别名为 c_id

测试3

存储过程与函数的关系

在这里插入图片描述

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

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

相关文章

非阻塞写入核心:asyncio.StreamWriter 的流量控制与数据推送之道

在 asyncio 的异步编程框架中&#xff0c;如果说 asyncio.StreamReader 是你异步应用的数据输入管道&#xff0c;那么 asyncio.StreamWriter 就是你异步应用的数据输出管道。它是一个至关重要的组件&#xff0c;让你能够方便、高效且非阻塞地向连接的另一端&#xff08;如 TCP …

控制台打开mysql服务报错解决办法

控制台打开mysql服务报错解决办法这个MySQL错误表示访问被拒绝&#xff0c;通常是因为没有提供正确的用户名和密码。以下是几种解决方法&#xff1a; 方法1&#xff1a;指定用户名和密码连接 mysql -u root -p然后输入root用户的密码。 方法2&#xff1a;如果忘记了root密码&am…

Unsloth 实战:DeepSeek-R1 模型高效微调指南(下篇)

食用指南 本系列因篇幅原因拆分为上下两篇&#xff1a; 上篇以基础环境搭建为主&#xff0c;介绍了 Unsloth 框架、基座模型下载、导入基座模型、数据集下载/加载/清洗、SwanLab 平台账号注册。 下篇&#xff08;本文&#xff09;以实战微调为主&#xff0c;介绍预训练、全量…

Ubuntu安装Jenkins

Ubuntu安装Jenkins方法1&#xff1a;使用官方的Jenkins仓库1. 添加Jenkins仓库2. 更新软件包列表3. 安装Jenkins4. 启动Jenkins服务5. 设置Jenkins开机启动6. 查找初始管理员密码7. 访问Jenkins方法2&#xff1a;使用Snap包&#xff08;适用于较新的Ubuntu版本&#xff09;1. 安…

ubuntu22.04下配置qt5.15.17开发环境

自从qt5.15版本开始&#xff0c;不再提供免费的离线安装包&#xff0c;只能通过源码自行编译。刚好最近需要在ubuntu22.04下配置qt开发环境&#xff0c;于是写篇文章记录配置的过程。 其实一开始是想配置qt5.15.2的&#xff0c;但是在编译配置参数这一步骤中出现如下报错 em…

S7-1200 与 S7-300 CPS7-400 CP UDP 通信 Step7 项目编程

S7-1200 CPU 与S7-300 CP STEP7 UDP通信S7-1200 与 S7-300 CP 之间的以太网通信可以通过 UDP 协议来实现&#xff0c;使用的通信指令是在S7-1200 CPU 侧调用通信-开放式用户通信TSEND_C&#xff0c;TRCV_C指令或TCON&#xff0c;TDISCON&#xff0c;TUSEND&#xff0c;TURCV 指…

基于YOLOv11的无人机目标检测实战(Windows环境)

1. 环境搭建 1.1 硬件与操作系统 操作系统&#xff1a;Windows 11 CPU&#xff1a;Intel i7-9700 GPU&#xff1a;NVIDIA RTX 2080&#xff08;8GB显存&#xff09; 1.2 安装CUDA和cuDNN 由于YOLOv11依赖PyTorch的GPU加速&#xff0c;需要安装CUDA和cuDNN&#xff1a; 安…

Spring Cloud分布式配置中心:架构设计与技术实践

从单体到微服务&#xff1a;Spring Cloud 开篇与微服务设计 Spring Cloud服务注册与发现&#xff1a;架构设计与技术实践深度分析 在以往分享中&#xff0c;码友们已经掌握了微服务的设计和注册中心的设计&#xff0c;部分聪明的码友已经察觉了&#xff0c;已经到了需要设计一个…

15.2 Common Criteria合规

目录1. Common Criteria简介1.1 CC评估要素1.2 CC与TF-A的关系2. TF-A的CC合规要求2.1 安全功能需求2.2 开发过程要求3. TF-A的CC合规实现3.1 关键安全机制3.2 开发流程控制4. CC认证实践指南4.1 认证准备步骤4.2 典型挑战与解决方案4.3 已认证案例参考5. 持续合规建议1. Commo…

【前端:Typst】--let关键字的用法

在 Typst 中&#xff0c;#let 命令是用于定义变量和函数的核心指令&#xff0c;其用法非常灵活。以下是详细的用法说明和示例。 目录 1.基础变量定义 2.函数定义 3.默认参数 4.内容块参数&#xff08;Content Blocks&#xff09; 5.递归函数 1.基础变量定义 // 定义简单…

Qt轮廓分析设计+算法+避坑

轮廓分析拟合方面我现在只考虑矩形拟合和圆形拟合细分的话&#xff0c;椭圆拟合&#xff0c;矩形拟合&#xff0c;最小外接矩形&#xff0c;最小外接圆。对于一张图像可能有不同的图形&#xff0c;不同的圆&#xff0c;不同的矩形&#xff0c;我需要对其进行筛选&#xff0c;也…

C++中STL六大组件List的简单介绍

一、前言C非常重视效率&#xff0c;对效率有损失的代码常常是能省则省。使用list要包含的头文件是<list>&#xff0c;要包含头文件就是#iinclude <list>&#xff0c;List肯定是一种链表&#xff0c;我们不妨回忆一下那种链表插入删除效率最快也就是最简单&#xff…

第十五节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - vue前端 生产部署

Vben Admin vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) + Python …

背包初步(0-1背包、完全背包)

当月光洒在我的脸上 我想我就快变了模样 有一种叫做撕心裂肺的汤 喝了它有神奇的力量 动态规划初步&#xff08;完全背包&#xff09; 目录动态规划初步&#xff08;完全背包&#xff09;0-1背包简介完全背包检查数组是否存在有效划分&#xff08;前缀划分DP&#xff09;单词拆…

Linux驱动06 --- UDP

目录 一、UDP 1.1 介绍 1.2 UDP 的通信方式 1.3 单播 发送函数 接收函数 1.4 广播 1.5 组播/多播 一、UDP 1.1 介绍 传输层的另外一个协议 面向无连接&#xff0c;不稳定&#xff0c;速度快&#xff0c;可以一对多 UDP&#xff08;User Datagram Protocol&…

AJAX 投票:技术解析与应用场景

AJAX 投票:技术解析与应用场景 引言 随着互联网技术的不断发展,Web应用的用户体验越来越受到重视。AJAX(Asynchronous JavaScript and XML)作为一种重要的技术,在实现异步数据交互方面发挥着关键作用。本文将深入探讨AJAX投票系统的技术原理、应用场景以及优化策略。 A…

【字节跳动】数据挖掘面试题0017:推荐算法:双塔模型,怎么把内容精准地推送给用户

文章大纲 双塔模型:推荐算法中的“高效匹配引擎一、双塔模型的核心思想:“分而治之” 的匹配逻辑二、双塔模型的结构:从特征输入到相似度输出1. 输入层:特征的 “原材料处理”2. 塔网络层:用户与物品的“个性化编码”3. 交互层:向量相似度的“偏好打分”三、双塔模型的优…

7月14日日记

数学类今天考完最后一科英语放假回家了。有点羡慕他们。今天英语成绩出来了&#xff0c;我是89分&#xff0c;一开始有点失望&#xff0c;感觉没有上90&#xff0c;这是一个很好的冲击4.0 的机会。但是后来一想好像也没什么可惜的&#xff0c;这个分数还是很高的。舍友小林是90…

js的局部变量和全局变量

全局变量常常定义在函数外&#xff0c;具有全局定义域&#xff0c;在整个js代码的任何地方都可以使用&#xff0c;这个就叫全局变量局部变量定义在函数内部&#xff0c;只在当前函数的定义域可以被使用&#xff0c;而且不同的函数可以定义相同的局部变量&#xff0c;他们之间相…

C++ 多态详解:从概念到实现原理----《Hello C++ Wrold!》(14)--(C/C++)

文章目录前言多态的概念多态的定义和实现虚函数虚函数的重写(覆盖)多态的构成条件override 和 final&#xff08;C11提出&#xff09;finaloverride重载、覆盖(重写)、隐藏(重定义)的对比抽象类接口继承和实现继承多态的原理虚函数表(也叫做虚表)引申:虚表的打印多态的原理静态…