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

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:

    订单主键购买数量商品外键
    132
    251
    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) 是机器学习领域中一种强大的工具&#xff0c;它由多层神经元组成&#xff0c;能够学习复杂的数据模式&#xff0c;解决各种任务&#xff0c;如图像识别、语音识别、自然语言处理等。 DNN 的构成&#xff1a; 神经元: 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系统&#xff0c;每次打开Visual Studio Code时&#xff0c;只能短暂打开一秒钟&#xff0c;然后就会崩溃。当通过终端使用code --verbose命令启动Visual Studio Code时&#xff0c;出现以下错误信息&#xff1a;…...

【OpenGauss源码学习 —— (ALTER TABLE(SET attribute_option))】

ALTER TABLE&#xff08;SET attribute_option&#xff09; ATExecSetOptions 函数 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的情况下注明引用来源。…...

Elasticsearch 数据提取 - 最适合这项工作的工具是什么?

作者&#xff1a;来自 Elastic Josh Asres 了解在 Elasticsearch 中为你的搜索用例提取数据的所有不同方式。 对于搜索用例&#xff0c;高效采集和处理来自各种来源的数据的能力至关重要。无论你处理的是 SQL 数据库、CRM 还是任何自定义数据源&#xff0c;选择正确的数据采集…...

‘浔川画板v5.1’即将上线!——浔川python社

1 简介&#xff1a; 浔川画板是一款专业的数字绘画和漫画创作软件&#xff0c;它为艺术家和设计师提供了丰富的绘画工具、色彩管理功能以及易于使用的界面。用户可以使用浔川画板进行手绘风格的绘画、精细的素描、漫画分格、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 的表引擎&#xff0c;参考文档&#xff1a;https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replication/ ClickHouse 副本的目的主要是保障数据的高可用性&#xff0c;即使一台 ClickHouse 节点宕机&#…...

速卖通测评成本低见效快,自养号测评的实操指南,快速积累销量和好评

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

php反序列化漏洞简介

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

力扣随机一题 模拟+字符串

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

java-正则表达式 1

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

Python xlrd库:读excel表格

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

开发中遇到的一个bug

遇到的报错信息是这样的&#xff1a; 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 翻译过来就是存在循环引用的情况&#xff0c;导…...

Java面试题:对比不同的垃圾收集器(如Serial、Parallel、CMS、G1)及其适用场景

Java虚拟机&#xff08;JVM&#xff09;提供了多种垃圾收集器&#xff0c;每种垃圾收集器在性能和适用场景上各有不同。以下是对几种常见垃圾收集器&#xff08;Serial、Parallel、CMS、G1&#xff09;的对比及其适用场景的详细介绍&#xff1a; 1. Serial 垃圾收集器 Serial…...

每日一题——冒泡排序

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

javascript浏览器对象模型

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

C语言之链表以及单链表的实现

一&#xff1a;链表的引入 1&#xff1a;从数组的缺陷说起 &#xff08;1&#xff09;数组有两个缺陷。一个是数组中所有元素类型必须一致&#xff0c;第二是数组的元素个数必须事先指定并且一旦指定后不能更改 &#xff08;2&#xff09;如何解决数组的两个缺陷&#xff1a;数…...

AI在线免费视频工具2:视频配声音;图片说话hedra

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

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...