Java学习 - MySQL存储过程、函数和触发器练习实例
存储过程
-
存储过程是什么
存储过程是一组已经编译好的SQL语句
-
存储过程优点有什么
安全 性能高 提高代码复用性
-
创建存储过程的语法
DELIMITER $ # 不能加分号CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型) BEGIN存储过程语句块 END;$DELIMITER ;
-
创建一个无参的存储过程:打印 myemployees 库中 employees 表中 employee_id = 168的first_name,并调用
DELIMITER $CREATE PROCEDURE myprocedure1() BEGINSELECT first_nameFROM employeesWHERE employee_id = 168; END;$DELIMITER ;CALL myprocedure1();
-
创建一个IN参数存储过程:打印传递进来的参数
DELIMITER $CREATE PROCEDURE myprocedure2(IN v INT) BEGINSELECT v; END;$DELIMITER ;SET @v = 10;CALL myprocedure2(@v);
-
创建一个IN参数和OUT参数存储过程:传递来一个变量 invalue = 10,输出一个变量 outvalue = invalue * 2
DELIMITER $CREATE PROCEDURE myprocedure3(IN invalue INT,OUT outvalue INT) BEGINSELECT invalue * 2 INTO outvalue; END;$DELIMITER ;SET @invalue = 10; SET @outvalue = 0;CALL myprocedure3(@invalue,@outvalue);SELECT @outvalue;
-
创建一个INOUT参数存储过程:传递进来一个数,令其变为10倍
DELIMITER $CREATE PROCEDURE myprocedure4(INOUT inoutvalue INT) BEGINSET inoutvalue = inoutvalue * 10; END;$DELIMITER ;SET @value = 10;CALL myprocedure4(@value);SELECT @value;
-
创建一个IN参数存储过程:输入一个数,如果大于0显示’greater than 0’,小于零显示’less than 0’,等于0显示’equals 0’
DELIMITER $CREATE PROCEDURE myprocedure5(IN target INT) BEGINSELECTCASEWHEN target > 0 THEN 'greater than 0'WHEN target = 0 THEN 'equalse 0'ELSE 'less than 0'ENDAS result; END;$DELIMITER ;CALL myprocedure5(-1); CALL myprocedure5(0); CALL myprocedure5(1);
-
创建一个IN参数和OUT参数存储过程:输入一个数,如果等于1显示’Hello’,等于2显示’World’,否则显示’Byebye’,结果同时保存到OUT参数中
DELIMITER $CREATE PROCEDURE myprocedure6(IN target INT,OUT result VARCHAR(20)) BEGINSELECTCASE targetWHEN target = 1 THEN 'Hello'WHEN target = 2 THEN 'World'ELSE 'ByeBye'ENDINTO result; END;$DELIMITER ;CALL myprocedure6(0,@ret1); CALL myprocedure6(1,@ret2); CALL myprocedure6(2,@ret3);SELECT @ret1,@ret2,@ret3;
-
创建一个无参的存储过程:循环打印 myemployees 库中 employees 表中 employee_id = 168的first_name3次
DELIMITER $CREATE PROCEDURE myprocedure5() BEGINDECLARE times INT DEFAULT 0;WHILE times < 3 DOSELECT first_nameFROM employeesWHERE employee_id = 168;SET times = times + 1;END WHILE; END;$DELIMITER ;CALL myprocedure5();
-
创建一个IN参数存储过程:输入一个正整数,打印它这么多次"This is REPEAT UNITL"
DELIMITER $CREATE PROCEDURE myprocedure6(IN times INT) BEGINREPEAT SELECT 'This is REPEAT UNTIL';SET times = times - 1;UNTIL times < 0 END REPEAT; END;$DELIMITER ;CALL procedure6(10);
-
创建一个OUT参数存储过程:返回1x2x3x…x10的结果给一个OUT参数result,使用LOOP循环
DELIMITER $CREATE PROCEDURE myprocedure7(OUT result INT) BEGINDECLARE times INT DEFAULT 1;SET result = 1;tt:LOOPSET times = times + 1;SET result = result * times;IF times > 10THEN LEAVE tt;END IF;END LOOP; END;$DELIMITER ;SET @result = 0;CALL myprocedure7(@result);SELECT @result;
-
查看有哪些存储过程
SHOW PROCEDURE STATUS;
-
查看存储过程myprocedure1的创建语句
SHOW CREATE PROCEDURE myprocedure1;
-
删除当前数据库中本次练习创建的存储过程
DROP PROCEDURE myprocedure1; DROP PROCEDURE myprocedure2; DROP PROCEDURE myprocedure3; DROP PROCEDURE myprocedure4; DROP PROCEDURE myprocedure5; DROP PROCEDURE myprocedure6; DROP PROCEDURE myprocedure7; DROP PROCEDURE myprocedure8; DROP PROCEDURE myprocedure9; DROP PROCEDURE myprocedure10;
函数
-
函数是什么,与存储过程的区别
类似存储过程,是一组编译好的SQL语句
-
函数与存储过程的区别
函数必须有返回值和return语句,参数形式为 参数名 参数类型,取消了参数模式 函数如果使用 SELECT,则必须配合INTO关键字,因为函数不允许出现结果集
-
函数优点是什么
增强代码复用性 将执行过程封装起来,增强安全性 因为是已经编译好的SQL语句,性能较高
-
创建函数的语法
DELIMITER $CREATE FUNCTION 函数名(参数名 参数类型) RETURNS 返回值类型 BEGIN函数体 END;$DELIMITER ;
-
函数能不要返回值,不要return语句吗
不行,必须要有返回值和return语句
-
创建一个无参的函数:用于查找 myemployees 库中 employees 表中 employee_id = 168的first_name
DELIMITER $CREATE FUNCTION myfunction1() RETURNS VARCHAR(30) BEGINDECLARE ret varchar(30);SELECT first_name INTO retFROM employeesWHERE employee_id = 168;RETURN ret; END;$DELIMITER ;SELECT myfunction1();
-
创建一个含参函数:接收传递进来的参数,返回这个参数与"-myfunction2"的拼接结果
DELIMITER $CREATE FUNCTION myfunction2(invar VARCHAR(30)) RETURNS VARCHAR(30) BEGINRETURN CONCAT(invar,'-myfunction2'); END;$DELIMITER ;SELECT myfunction2('abc');
-
创建一个含参函数:传递来一个变量 invalue = 10,返回 invalue * 2
DELIMITER $CREATE FUNCTION myfunction3(invalue INT) RETURNS INT BEGINRETURN invalue * 2; END;$DELIMITER ;SET @invalue = 10;SELECT myfunction3(@invalue);
-
创建一个含参函数:输入一个数,如果大于0返回’greater than 0’,小于零返回’less than 0’,等于0返回’equals 0’
DELIMITER $CREATE FUNCTION myfunction4(invalue INT) RETURNS VARCHAR(30) BEGINRETURN CASEWHEN invalue > 0 THEN 'greater than 0'WHEN invalue = 0 THEN 'equals 0'WHEN invalue < 0 THEN 'less than 0'END; END;$DELIMITER ;SELECT myfunction4(-1); SELECT myfunction4(0); SELECT myfunction4(1);
-
创建一个含参函数:输入一个数,如果等于1返回’Hello’,等于2返回’World’,否则返回’Byebye’
DELIMITER $CREATE FUNCTION myfunction5(invalue INT) RETURNS VARCHAR(30) BEGINRETURN CASE invalueWHEN invalue = 1 THEN 'Hello'WHEN invalue = 2 THEN 'World'ELSE 'ByeBye'END; END;$DELIMITER ;SELECT myfunction5(1); SELECT myfunction5(2); SELECT myfunction5(3);
-
创建一个无参函数:返回1+2+…+100的结果【使用while循环】
DELIMITER $CREATE FUNCTION myfunction6() RETURNS INT BEGINDECLARE times INT DEFAULT 0;DECLARE retsum INT DEFAULT 0;WHILE times < 101 DOSET retsum = retsum + times;SET times = times + 1;END WHILE;RETURN retsum; END;$DELIMITER ;SELECT myfunction6();
-
创建无参函数:返回1x2x3x…x10的结果【使用LOOP循环】
DELIMITER $CREATE FUNCTION myfunction7() RETURNS INT BEGINDECLARE times INT DEFAULT 1;DECLARE retsum INT DEFAULT 1;tt:LOOPSET retsum = retsum * times;SET times = times + 1;IF times > 10THEN LEAVE;END IF;END LOOP;RETURN retsum; END;$DELIMITER ;
-
查看所有的函数
SHOW FUNCTION STATUS;
-
查看函数myfunction1的创建语句
SHOW CREATE FUNCTION myfunction1;
-
删除本次练习所创建的所有函数
DROP FUNCTION myfunction1; DROP FUNCTION myfunction2; DROP FUNCTION myfunction3; DROP FUNCTION myfunction4; DROP FUNCTION myfunction5; DROP FUNCTION myfunction6; DROP FUNCTION myfunction7;
触发器
-
什么是触发器
一类特殊的事务,可以监视某种DML操作,并触发相关DML操作
-
创建触发器的语法
DELIMITER $CREATE TRIGGER 触发器名字 BEFORE|AFTER INSERT|UPDATE|DELETE ON 表名 FOR EACH ROW BEGIN触发器的DML语句 END$DELIMITER ;
-
创建两张表
goods:
商品主键 商品名 库存 1 电脑 28 2 自行车 12 orders:
订单主键 购买数量 商品外键 1 3 2 2 5 1 CREATE TABLE IF NOT EXISTS goods (g_id INT,g_name VARCHAR(20),g_count INT,CONSTRAINT pk PRIMARY KEY(g_id),CONSTRAINT uk UNIQUE(g_name) );INSERT INTO goods(g_id,g_name,g_count) VALUES (1,'电脑',28),(2,'自行车',12);CREATE TABLE IF NOT EXISTS orders (o_id INT PRIMARY KEY,o_count INT,o_g INT,CONSTRAINT fk_goods_g_id FOREIGN KEY(o_g) REFERENCES goods(g_id) );INSERT INTO orders(o_id,o_count,o_g) VALUES (1,3,2),(2,5,1);
-
创建触发器,让orders购买数量增多时,goods数量相应减少
DELIMITER $CREATE TRIGGER my_trigger AFTER UPDATE ON orders FOR EACH ROW BEGINUPDATE goodsSET g_count = g_count - (new.o_count - old.o_count)WHERE g_id = new.o_g; END;$DELIMITER ;
-
查看所有的触发器
SHOW TRIGGERS;
-
查看my_trigger的创建语句
SHOW CREATE TRIGGERS my_trigger;
-
删除my_trigger
DROP TRIGGER my_trigger;
相关文章:

Java学习 - MySQL存储过程、函数和触发器练习实例
存储过程 存储过程是什么 存储过程是一组已经编译好的SQL语句存储过程优点有什么 安全 性能高 提高代码复用性创建存储过程的语法 DELIMITER $ # 不能加分号CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型) BEGIN存储过程语句块 END;$DELIMITER ;创建一个无参的存储…...

【深度神经网络 (DNN)】
深度神经网络 (DNN) 深度神经网络 (DNN) 是机器学习领域中一种强大的工具,它由多层神经元组成,能够学习复杂的数据模式,解决各种任务,如图像识别、语音识别、自然语言处理等。 DNN 的构成: 神经元: DNN 的基本单元&…...

ES全文检索支持繁简和IK分词检索
ES全文检索支持繁简和IK分词检索 1. 前言2. 引入繁简转换插件analysis-stconvert2.1 下载已有作者编译后的包文件2.2 下载源码进行编译2.3 复制解压插件到es安装目录的plugins文件夹下 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4…...

解决Visual Studio Code在Ubuntu上崩溃的问题
解决Visual Studio Code在Ubuntu上崩溃的问题 我正在使用Ubuntu系统,每次打开Visual Studio Code时,只能短暂打开一秒钟,然后就会崩溃。当通过终端使用code --verbose命令启动Visual Studio Code时,出现以下错误信息:…...

【OpenGauss源码学习 —— (ALTER TABLE(SET attribute_option))】
ALTER TABLE(SET attribute_option) ATExecSetOptions 函数 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。…...

Elasticsearch 数据提取 - 最适合这项工作的工具是什么?
作者:来自 Elastic Josh Asres 了解在 Elasticsearch 中为你的搜索用例提取数据的所有不同方式。 对于搜索用例,高效采集和处理来自各种来源的数据的能力至关重要。无论你处理的是 SQL 数据库、CRM 还是任何自定义数据源,选择正确的数据采集…...

‘浔川画板v5.1’即将上线!——浔川python社
1 简介: 浔川画板是一款专业的数字绘画和漫画创作软件,它为艺术家和设计师提供了丰富的绘画工具、色彩管理功能以及易于使用的界面。用户可以使用浔川画板进行手绘风格的绘画、精细的素描、漫画分格、UI设计等多种创作。该软件支持多种笔刷和特效&#…...

RockChip Android12 System之Datetime
一:概述 本文将针对Android12 Settings二级菜单System中Date&time的UI修改进行说明。 二:Date&Time 1、Activity packages/apps/Settings/AndroidManifest.xml <activityandroid:name="Settings$DateTimeSettingsActivity"android:label="@stri…...

详解 ClickHouse 的副本机制
一、简介 副本功能只支持 MergeTree Family 的表引擎,参考文档:https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replication/ ClickHouse 副本的目的主要是保障数据的高可用性,即使一台 ClickHouse 节点宕机&#…...

速卖通测评成本低见效快,自养号测评的实操指南,快速积累销量和好评
对于初入速卖通的新卖家而言,销量和评价的积累显得尤为关键。由于新店铺往往难以获得平台活动的青睐,因此流量的获取成为了一大挑战。在这样的背景下,进行产品测评以积累正面的用户反馈和销售记录,成为了提升店铺信誉和吸引潜在顾…...

php反序列化漏洞简介
目录 php序列化和反序列化简介 序列化 反序列化 类中定义的属性 序列化实例 反序列化实例 反序列化漏洞 序列化返回的字符串格式 魔术方法和反序列化利用 绕过wakeup 靶场实战 修复方法 php序列化和反序列化简介 序列化 将对象状态转换为可保持或可传输的格式的…...

力扣随机一题 模拟+字符串
博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 1910.删除一个字符串中所有出现的给定子字符串【中等】 题目: …...

java-正则表达式 1
Java中的正则表达式 1. 正则表达式的基本概念 正则表达式(Regular Expression, regex)是一种用于匹配字符串中字符组合的模式。正则表达式广泛应用于字符串搜索、替换和解析。Java通过java.util.regex包提供了对正则表达式的支持,该包包含两…...

Python xlrd库:读excel表格
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

开发中遇到的一个bug
遇到的报错信息是这样的: java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [hm-api,hm-common,hm-service] are excluded from annotation processing 翻译过来就是存在循环引用的情况,导…...

Java面试题:对比不同的垃圾收集器(如Serial、Parallel、CMS、G1)及其适用场景
Java虚拟机(JVM)提供了多种垃圾收集器,每种垃圾收集器在性能和适用场景上各有不同。以下是对几种常见垃圾收集器(Serial、Parallel、CMS、G1)的对比及其适用场景的详细介绍: 1. Serial 垃圾收集器 Serial…...

每日一题——冒泡排序
C语言——冒泡排序 冒泡排序练习 前言:CSDN的小伙伴们,大家好!今天我来给大家分享一种解题思想——冒泡排序。 冒泡排序 冒泡法的核心思想:两两相邻的元素进行比较 2.冒泡排序的算法描述如下。 (1)比较相邻的元素。如果第一 个比…...

javascript浏览器对象模型
BOM对象: BOM 是浏览器对象模型的简称。JavaScript 将整个浏览器窗口按照实现的功能不同拆分成若干个对象; 包含:window 对象、history 对象、location 对象和 document 对象等 window对象: 常用方法: 1.prompt();…...

C语言之链表以及单链表的实现
一:链表的引入 1:从数组的缺陷说起 (1)数组有两个缺陷。一个是数组中所有元素类型必须一致,第二是数组的元素个数必须事先指定并且一旦指定后不能更改 (2)如何解决数组的两个缺陷:数…...

AI在线免费视频工具2:视频配声音;图片说话hedra
1、视频配声音 https://deepmind.google/discover/blog/generating-audio-for-video/ https://www.videotosoundeffects.com/ (免费在线使用) 2、图片说话在线图片生成播报hedra hedra 上传音频与图片即可合成 https://www.hedra.com/ https://www.…...

Elastic字段映射(_source,doc_value,fileddata,index,store)
Elastic字段映射(_source,doc_value,filed_data,index,store) _source: source 字段用于存储 post 到 ES 的原始 json 文档。为什么要存储原始文档呢?因为 ES 采用倒排索引对文本进行搜索,而倒排索引无法存储原始输入…...

kotlin空类型安全 !! ?. ?:
1、定义可空类型 fun main(){// 定义可空类型var x:String? "hello"x null } 2、!! 强转类型 定义可空类型之后,如果使用其内置方法,编译不会通过,因为值有可能为null,可以使用 !! 把类型强转为不可空:…...

通过 WireGuard 组建虚拟局域网 实现多个局域网全互联
本文后半部分代码框较多,欢迎点击原文链接获得更佳的阅读体验。 前言 上一篇关于 WireGuard 的文章通过 Docker 安装 wg-easy 的形式来使用 WireGuard,但 wg-easy 的功能比较有限,并不能发挥出 WireGuard 的全部功力。 如果只是想要出门在外连随时随地的连回家里的局域网,…...

qmt量化交易策略小白学习笔记第47期【qmt编程之期货仓单】
qmt编程之获取期货数据 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 感谢关注,咨询免费开通量化回测与获取实盘权限,欢迎和博主联系! 期货仓单 提示 1…...

点云处理中阶 Sampling
目录 一、什么是点云Sampling 二、示例代码 1、下采样 Downsampling 2、均匀采样 3、上采样 4、表面重建 一、什么是点云Sampling 点云处理中的采样(sampling)是指从大量点云数据中选取一部分代表性的数据点,以减少计算复杂度和内存使用,同时保留点云的几何特征和重…...

为什么print语句被Python3遗弃?
在开发和维护python项目的时候发现经常有print语句报错,原因是python3放弃了print语句 print 语句 早就被列在了不可靠的语言特性列表中,例如 Guido 的“Python 之悔”(Python Regrets)演讲【1】,并计划在 Python 300…...

067、Python 高阶函数的编写:优质冒泡排序
以下写了个简单的冒泡排序函数: def bubble_sort(items: list) -> list:for i in range(1, len(items)):swapped Falsefor j in range(0, len(items) - 1):if items[j] > items[j 1]:items[j], items[j 1] items[j 1], items[j]swapped Trueif not swa…...

【Python】从基础到进阶(一):了解Python语言基础以及变量的相关知识
🔥 个人主页:空白诗 文章目录 引言一、Python简介1.1 历史背景1.2 设计哲学1.3 语言特性1.4 应用场景1.5 为什么选择Python 二、Python语言基础2.1 注释规则2.1.1 单行注释2.1.2 多行注释2.1.3 文件编码声明注释 2.2 代码缩进2.3 编码规范2.3.1 命名规范…...

AI学习指南机器学习篇-KNN的优缺点
AI学习指南机器学习篇-KNN的优缺点 在机器学习领域中,K最近邻(K-Nearest Neighbors,KNN)算法是一种十分常见的分类和回归方法之一。它的原理简单易懂,但在实际应用中也存在一些优缺点。本文将重点探讨KNN算法的优缺点…...

全网最全!25届最近5年上海理工大学自动化考研院校分析
上海理工大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、历年真题PDF 七、初试大纲复试大纲 八、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试…...