MySQL之函数、视图、存储过程

MySQL视图、函数与存储过程

1. 函数

1.1 语法

-- 函数是需要有返回值的,只能返回一个值
CREATE FUNCTION funcation_name (param_name data_type [, param_name2 data_type]) RETURNS return_data_type
DETERMINISTIC -- 可选项,用于执行函数对于相同入参,是否总返回相同结果
NO SQL -- 可选项,用于执行函数是否访问SQL数据,有SQL和NO SQL两个值
COMMENT '函数注释'
BEGIN-- 函数体-- 返回结果
END

1.2 例子1

CREATE FUNCTION add_numbers(x INT, y INT) RETURNS INT
BEGINDECLARE result INT;SET result = x + y;RETURN result;
END-- 调用函数
SELECT add_numbers(1, 2); -- 返回3

1.3 例子2

-- 删除函数如果存在的话
DROP FUNCTION IF EXISTS GetTopLevelDepartmentId;-- 创建一个函数,入参cur_dep_id为INT类型,返回值也为INT类型
-- 整个业务逻辑在BEGIN与END之间
CREATE FUNCTION GetTopLevelDepartmentId(cur_dep_id INT) RETURNS INT
BEGIN-- 定义INT类型变量 firstidDECLARE firstid INT;DECLARE parent_id INT;-- 定义INT类型变量 done 默认为FALSEDECLARE done INT DEFAULT FALSE;DECLARE tmp_dep_id INT;SET tmp_dep_id = cur_dep_id;-- WHILE ... DO循环WHILE NOT done DOSELECT id, SUPDEPID INTO firstid, parent_idFROM hrmdepartment WHERE id = tmp_dep_id;-- 条件判断语句IF parent_id <= 0 THENRETURN firstid;ELSESET tmp_dep_id = parent_id;SET done = FALSE;END IF;END WHILE;RETURN -1;
END-- 函数 GetTopLevelDepartmentName
DROP FUNCTION IF EXISTS GetTopLevelDepartmentName;
CREATE FUNCTION GetTopLevelDepartmentName(cur_dep_id INT) RETURNS VARCHAR(1000)
BEGINDECLARE dep_name VARCHAR(1000);DECLARE parent_id INT;DECLARE done INT DEFAULT FALSE;DECLARE tmp_dep_id INT;SET tmp_dep_id = cur_dep_id;WHILE NOT done DOSELECT DEPARTMENTNAME, SUPDEPID INTO dep_name, parent_idFROM hrmdepartment WHERE id = tmp_dep_id;IF parent_id <= 0 THENRETURN dep_name;ELSESET tmp_dep_id = parent_id;SET done = FALSE;END IF;END WHILE;RETURN dep_name;
END

1.4 条件判断

-- 在mysql的函数中条件判断
IF condition THEN-- 具体逻辑
END IF;IF condition THEN-- 逻辑1
ELSE-- 逻辑2
END IF;IF condition1 THEN-- 逻辑1
ELSEIF condition2 THEN-- 逻辑2
ELSE-- 逻辑3
END IF;-- CASE条件判断
CASE expressionWHEN value1 THEN-- 代码1WHEN value2 THEN-- 代码2ELSE-- 条件都不满足时,代码3
END CASE;-- NULLIF函数, 用于判断两个表达式是否相等, 相等返回NULL,否则返回第一个表达式
NULLIF(expression1, expression2);
SELECT NULLIF(1,2); -- 返回1
SELECT NULLIF(2,2); -- 返回NULL

1.5 循环

-- while循环
WHILE condition DO-- 循环体
END WHILE;-- repeat循环
REPEAT-- 循环体UNTIL condition END REPEAT;-- loop循环
LOOP-- 循环体IF condition THEN-- 代码END IF;END LOOP;
-- 例子
DROP FUNCTION IF EXISTS test;
CREATE FUNCTION test() RETURNS INT
DETERMINISTIC
NO SQL
BEGINDECLARE a INT DEFAULT 0;REPEATSET a = a + 1;UNTIL a >= 10 END REPEAT;RETURN a;
ENDSELECT test();DROP FUNCTION IF EXISTS test2;
CREATE FUNCTION test2() RETURNS INT
DETERMINISTIC
NO SQL
BEGINDECLARE a INT DEFAULT 0;LOOPSET a = a + 1;IF a >= 11 THENRETURN a;END IF;END LOOP;
END
SELECT test2();

2. 视图

2.1 语法

CREATE OR REPLACE VIEW view_name AS
SELECT col1, col2, ...
FROM table_name
WHERE condition;

2.2 例子

-- 基于1.3中的例子2的函数创建视图
CREATE VIEW v_firstlevel_dept_new AS
SELECTa.id,a.DEPARTMENTNAME AS departmentname,GetTopLevelDepartmentId(a.id) AS firstid,GetTopLevelDepartmentName(a.id) AS firstdeptname
FROMhrmdepartment a 
WHEREa.CANCELED IS NULL OR a.CANCELED = 0;-- 调用视图, 相当于一张数据库表
select * from v_firstlevel_dept_new;

3. 存储过程

3.1 语法

-- 创建存储过程
DELIMITER //
CREATE PROCEDURE procedure_name()
BEGIN-- 存储过程的逻辑代码
END //
DELIMITER ;-- 删除存储过程
DROP PROCEDURE IF EXISTS procedure_name;-- 调用存储过程
CALL procedure_name();

3.2 例子

DROP PROCEDURE IF EXISTS GetTopLevelDepartment;
DELIMITER $$
CREATE PROCEDURE GetTopLevelDepartment(IN dept_id INT, -- 输入参数OUT child_id INT, -- 输出参数OUT child_name VARCHAR(1000), -- 输出参数OUT parent_dept_id INT, -- 输出参数OUT parent_dept_name VARCHAR(1000) -- 输出参数
)
BEGIN-- 定义变量DECLARE done INT DEFAULT FALSE;DECLARE v_count INT;DECLARE current_dept_id INT;DECLARE current_dept_name VARCHAR(1000);DECLARE root_id INT;IF (dept_id > 0) THEN-- 将参数dep_id赋值给变量current_dept_idSET current_dept_id = dept_id;SELECT COUNT(1) INTO v_countFROM hrmdepartmentWHERE id = current_dept_id;IF v_count > 0 THENSELECT id, DEPARTMENTNAME INTO current_dept_id, current_dept_nameFROM hrmdepartmentWHERE id = current_dept_id;SET child_id = current_dept_id;SET child_name = current_dept_name;-- while...do循环WHILE NOT done DOSELECT COUNT(1) INTO v_countFROM hrmdepartmentWHERE id = current_dept_id;IF v_count > 0 THENSELECT id, DEPARTMENTNAME, SUPDEPID INTO current_dept_id, current_dept_name, root_id FROM hrmdepartmentWHERE id = current_dept_id;IF root_id <= 0 THENSET parent_dept_id = current_dept_id;SET parent_dept_name = current_dept_name;SET done = TRUE;ELSESET current_dept_id = root_id;SET done = FALSE;END IF;ELSE SET done = TRUE;END IF;END WHILE;END IF;END IF;
END $$
DELIMITER ;-- 调用存储过程,
CALL GetTopLevelDepartment(334, @child_id, @child_name, @parent_dept_id, @parent_dept_name);
SELECT @child_id, @child_name, @parent_dept_id, @parent_dept_name;-- 说明
可以使用 @输出参数变量 来获取存储过程的输出参数
-- 上面的存储过程是通过定义输入输出的变量来获取存储过程的返回值
-- 下面可以通过如下方式返回多个值
DROP PROCEDURE IF EXISTS GetTopLevelDepartment2222;
DELIMITER $$
CREATE PROCEDURE GetTopLevelDepartment2222(IN dept_id INT
)
BEGINDECLARE done INT DEFAULT FALSE;DECLARE v_count INT;DECLARE child_id INT;DECLARE child_name VARCHAR(1000);DECLARE current_dept_id INT;DECLARE current_dept_name VARCHAR(1000);DECLARE root_id INT;IF (dept_id > 0) THENSET current_dept_id = dept_id;SELECT COUNT(1) INTO v_countFROM hrmdepartmentWHERE id = current_dept_id;IF v_count > 0 THENSELECT id, DEPARTMENTNAME INTO current_dept_id, current_dept_nameFROM hrmdepartmentWHERE id = current_dept_id;SET child_id = current_dept_id;SET child_name = current_dept_name;WHILE NOT done DOSELECT COUNT(1) INTO v_countFROM hrmdepartmentWHERE id = current_dept_id;IF v_count > 0 THENSELECT id, DEPARTMENTNAME, SUPDEPID INTO current_dept_id, current_dept_name, root_id FROM hrmdepartmentWHERE id = current_dept_id;IF root_id <= 0 THENSELECT child_id,child_name,current_dept_id,current_dept_name; -- 返回结果SET done = TRUE;ELSESET current_dept_id = root_id;SET done = FALSE;END IF;ELSE SET done = TRUE;END IF;END WHILE;END IF;END IF;
END $$
DELIMITER ;-- 调用存储过程
CALL GetTopLevelDepartment2222(334);

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

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

相关文章

[ELK使用篇]:SpringCloud整合ELK服务

文章目录 一&#xff1a;前置准备-(参考之前博客)&#xff1a;1.1&#xff1a;准备Elasticsearch和Kibana环境&#xff1a;1.1.1&#xff1a;地址&#xff1a;[https://blog.csdn.net/Abraxs/article/details/128517777](https://blog.csdn.net/Abraxs/article/details/1285177…

关于uni.createInnerAudioContext()的duration音频长度获取不到问题

关于uni.createInnerAudioContext()的duration音频长度获取不到问题 代码如下&#xff1a; onLoad() {let _this this//初始化语音播放对象this.audioObj uni.createInnerAudioContext();this.audioObj.src 音频链接;// 音频进入可以播放状态&#xff0c;但不保证后面可以流…

MySQL explain详解

文章目录 0 环境准备1 explain 之 id2 explain 之 select_type3 explain 之 table4 explain 之 type5 explain 之 key6 explain 之 rows7 explain 之 extra MySQL 的 EXPLAIN 是一个用于查询优化的关键字。它用于分析和评估查询语句的执行计划&#xff0c;帮助开发者理解查询语…

gerrit +git + windows 配置常见问题总结

Git 正常安装 配置 ssh-keygen 后&#xff0c;git clone 服务器代码报错 clone 报错1 no matching key exchange method found. Their offer: **diffie-hellman-group1-sha1**clone 报错2 no matching host key type found. Their offer: ssh-rsa解决方案 用户目录文件下.s…

尚硅谷大数据项目《在线教育之采集系统》笔记001

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P004 P006 P007 P009 P010 P017 P025 P026 P027 P028 P030 P004 将数据以图形图表的方式展示出来&#xff01; P006 数据埋点 所谓埋点就是在应用中特定的流程收集一些信息&…

springboot 整合Caffeine项目中使用介绍

java接口的查询如何能提高性能&#xff0c;比每次都去数据库中查询要快的方案有了&#xff0c;就是下面要介绍的。 一、添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>…

(css)自定义登录弹窗页面

(css)自定义登录弹窗页面 效果&#xff1a; 代码&#xff1a; <!-- 登录弹窗 --> <el-dialog:visible.sync"dialogVisible"title"用户登录"width"25%"centerclass"custom-dialog":show-close"false":close-on-cli…

安卓逆向入门指南:介绍与准备

安卓逆向入门指南&#xff1a;介绍与准备 简介 安卓逆向工程是指通过分析、修改和破解安卓应用程序&#xff0c;获取其内部逻辑&#xff0c;探索其实现细节或者进行二次开发的技术过程。在这个系列博客中&#xff0c;我们将介绍安卓逆向的基础知识、常用工具和技术&#xff0…

【NLP】温和解读:transformer的核心思想

变压器模型及其关键组件的概述。 一、介绍 在这篇博文中&#xff0c;我将讨论本世纪最具革命性的论文“注意力是你所需要的一切”&#xff08;Vaswani et al.&#xff09;。首先&#xff0c;我将介绍自我注意机制&#xff0c;然后介绍变形金刚的架构细节。在之前的博客文章《从…

基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章

最近在整理和编写基于C#的WinForm应用程序&#xff0c;然后碰到一个其他读者也可能碰到的问题&#xff0c;就是C#的Borderless无边框窗体的动画效果问题。 在Visual Studio 2022里&#xff0c;C#的WinForm程序提供了Borderless无边框窗体的样式效果&#xff0c;但是它没提供在无…

【Rust 基础篇】Rust 不可反驳模式与可反驳模式

导言 在Rust编程中,模式(Pattern)是一种强大的工具,用于匹配和解构数据。模式匹配不仅可以用于简单的变量绑定,还可以处理复杂的数据结构,从而让代码更加简洁和清晰。在本篇博客中,我们将探讨Rust模式的两种形式:不可反驳模式(Irrefutable Patterns)和可反驳模式(R…

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归多变量时间序列区间…

dp,最长上升子序列升级版

AcWing 896. 最长上升子序列 II - AcWing 896. 最长上升子序列 II 给定一个长度为 N 的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 N。 第二行包含 N 个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表…

Visual Studio Code Python 扩展中的包管理

排版&#xff1a;Alan Wang Python 凭借其简单的语法和强大的库&#xff0c;目前已成为最流行的编程语言之一&#xff0c;也是最适合那些刚接触编程的人们的语言。但是&#xff0c;随着项目复杂性和规模的增长&#xff0c;管理依赖项的复杂性也会增加。当新用户不断承接更成熟的…

数分面试题-SQL常见面试题型1

目录标题 1、连续时间问题1.1 最近一周内的活跃天数1.2 每个用户一周内最大连续活跃天数1.3 计算截至当前&#xff0c;每个用户已经连续签到的天数 2、时间间隔问题举例3、sql窗口分析函数3.1 有一个日志登陆列表&#xff0c;获取用户在某个页面停留时长3.2 寻找至少连续出现3次…

【Docker】Docker容器编排

目录 一、Docker Compose1.2Docker Compose 环境安装1.3 YAML 文件格式及编写注意事项2.3 Docker Compose配置常用字段2.4 Docker Compose 常用命令 二、Docker Compose实验2.1编写Nginx的Dockerfile脚本2.2编写MySQL&#xff0c;Dockerfile脚本2.3编写PHP&#xff0c;Dockerfi…

K8S中网络如何通信

Kubernetes 提出了一个自己的网络模型“IP-per-pod”&#xff0c;能够很好地适应集群系统的网络需求&#xff0c;它有下面的这 4 点基本假设&#xff1a; 集群里的每个 Pod 都会有唯一的一个 IP 地址。Pod 里的所有容器共享这个 IP 地址。集群里的所有 Pod 都属于同一个网段。…

STM32MP157驱动开发——按键驱动(POLL 机制)

文章目录 “POLL ”机制&#xff1a;APP执行过程驱动使用的函数应用使用的函数pollfd结构体poll函数事件类型实现原理 poll方式的按键驱动程序(stm32mp157)gpio_key_drv.cbutton_test.cMakefile修改设备树文件编译测试 “POLL ”机制&#xff1a; 使用休眠-唤醒的方式等待某个…

MySQL主从复制、读写分离

目录 一、MySQL的复制类型 二、MySQL主从复制工作流程 三、MySQL的同步方式 1、异步复制&#xff08;Async Replication&#xff09; 2、同步复制&#xff08;sync Replication&#xff09; 3、半同步复制&#xff08;Async Replication&#xff09; 四、MySQL应用场景 …

《向量数据库指南》:向量数据库Pinecone移动到生产环境

目录 概述 准备项目结构 测试查询结果 估计pod和副本的适当数量和大小 对索引进行负载测试 备份索引 性能调优 配置监控 规划扩展 了解如何获取支持 本文档的目的是通过预见生产环境中的问题并确定生产索引的最佳实践来准备用户开始在生产环境中使用其Pinecone索引。…