Mysql之存储过程与函数

Mysql之存储过程与函数

  • 存储过程概述
    • 分类
    • 创建存储过程
      • 一般的语法格式
      • 完整的语法格式
      • 案例一
      • 案例二
    • 调用存储过程
      • 调用语法格式
    • 创建存储函数
    • 存储过程与函数的查看,修改和删除

存储过程概述

官网解释是:存储过程的英文是 Stored Procedure 。它的思想很简单,就是一组经过 预先编译 的 SQL 语句的封装。
执行的过程:
存储过程预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用
存储过程的命令,服务器端就可以把预先存储好的这一系列 SQL 语句全部执行

好处:
1.简化操作,提高了sql语句的重用性,减少了开发程序员的压力
2.减少操作过程中的失误,提高效率
3.减少网络传输量(客户端不需要把所有的 SQL 语句通过网络发给服务器) 4、减少了 SQL 语句暴露在网上的风险,也提高了数据查询的安全性

注意:存储过程一旦被创建出来,我们直接调用存储过程名就行 (类似函数的调用)

不过需要注意的是:存储过程是没有返回值的

分类

存储过程根据有无参数和有无返回值进行分类
1.没有参数(无参数无返回)
2.仅仅带 IN 类型(有参数无返回)
3.仅仅带 OUT 类型(无参数有返回)
4.既带 IN 又带 OUT(有参数有返回)
5.带 INOUT(有参数有返回)

关键字为IN, OUT,INOUT, 可以多个存在,多个存在用 | 连接

IN: 输入参数,代表着入参
OUT:输出参数,代表着出参
INOUT:既是输入参数,又是输出参数

创建存储过程

一般的语法格式

语法格式:

CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
BEGIN 
	#存储的Mysql语句
END

语法格式类似于C语言中的函数
如果只有一条Mysql语句,可以省略BEGIN 和END,如果有多条Mysql语句,那么就不能省略

因为MySQL默认的语句结束符号为分号‘;’。为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符

一般使用 $或者 // 来作为语句结束的符号

完整的语法格式

DELIMITER $
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]
BEGIN
sql语句1;
sql语句2;
END $
DELIMITER;  #注意:这个步骤不要忘记

案例一

创建存储过程select2_all_data(),查看 jobs 表的所有数据

DELIMITER $
CREATE PROCEDURE select2_all_data()
BEGIN
SELECT * FROM jobs;
END $
DELIMITER;

#CALL 用CALL调用
CALL select2_all_data();

在这里插入图片描述

案例二

在这里插入图片描述

这里注意:使用OUT输出结果的时候,在Mysql语句中药结合INTO 一起使用作为, INTO后面为变量名,存储结果

DELIMITER $ 
CREATE PROCEDURE show_data(IN empname varchar(20), OUT empsalary varchar(20))
BEGIN
	SELECT salary INTO empsalary FROM emp WHEREE last_name = empname
END $ 
DELIMITER;

#这里注意:使用set设置,  @ + 变量名
set @empname = 'ABEl';

#调用
show_data(@empname, @empsalary);

#选择
SELECT @emsalary;

调用存储过程

存储过程有多种调用方法。存储过程必须使用CALL语句调用,并且存储过程和数据库相关,如果要执行其他数据库中的存储过程,需要指定数据库名称,例如CALL dbname.procname

调用语法格式

IN参数模式

#IN参数 调用
CALL 存储过程名('值')

OUT参数模式

#OUT参数  调用
set @变量名
CALL 存储过程名(@变量量)
SELECT @变量名

INOUT参数模式

set @变量名  = '值'
CALL 存储过程名(@变量名)
SELECT @变量名

创建存储函数

语法格式

DELIMITER //
CREATE FUNCTION 变量名(参数)
[character 约束条件]
RETURN 返回值类型

BEGIN 
	函数体
END //
DELIMITER;

特别注意:
在这里插入图片描述

案例:创建存储函数,名称为email_by_name(),参数定义为空,该函数查询Abel的email,并返回,数据类型为字符串型

CREATE FUNCTION email_by_name()
RETURNS VARCHAR(25)
DETERMINISTIC
CONTAINS SQL
BEGIN
RETURN (SELECT email FROM employees WHERE last_name = 'Abel');
END //
DELIMITER ;


#调用
SELECT email_by_name();

调用,这里使用SELECT 关键字来调用存储函数

存储过程与函数的查看,修改和删除

查看信息
语法格式

#查看创建信息
SHOW CREATE FUNCTION 名字;
SHOW CREATE PROCEDURE 名字;

#查看状态信息  (可用LIKE 取别名)
SHOW FUNCTION STATUS 名字;
SHOW PROCEDURE STATUS 名字;

修改信息
使用关键字ALTER

#修改定义
ALTER PROCEDURE CountProc
MODIFIES SQL DATA
SQL SECURITY INVOKER ;

删除信息
使用关键字DROP

DROP FUNCTION IF  EXISTS 名字;
DROP PROCEDURE IF EXISTS 名字;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发:循环定时删除阿里云oss上传的文件

上文有说到我们开发了定时删除阿里云oss的功能,但是一次只能删除10条。 本文我们做到一次删除全部过期的文件。 实现:使用while循环,在循环里获取是否还有已过期的,没有就break掉,有就走删除逻辑。 开始代码部分&am…

鸿蒙系统适配的流程

鸿蒙系统适配的流程通常涉及以下关键步骤,以下是鸿蒙系统适配的一般流程,具体流程可能会根据项目的具体需求和开发团队的情况进行调整和优化。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 准备工作&#…

常见限流算法及其实现

一、背景 在分布式系统中,随着业务量的增长,如何保护核心资源、防止系统过载、保证系统的稳定性成为了一个重要的问题。限流算法作为一种有效的流量控制手段,被广泛应用于各类系统中。本文将详细介绍四种常见的限流算法、两种常用的限流器工…

贝叶斯优化双向门控循环单元BO-BIGRU时序预测的matlab实现【源代码】

贝叶斯优化双向门控循环单元简介: 贝叶斯优化双向门控循环单元(BO-BIGRU)是一种结合了贝叶斯优化和双向门控循环单元(BIGRU)的神经网络模型。BIGRU是一种改进的循环神经网络(RNN),它…

ArcGIS学习(十三)多源数据下的城市街道功能评估

ArcGIS学习(十三)多源数据下的城市街道功能评估 本任务带来的内容是多元数据下的城市街道功能评估。本任务包括两个关卡: 城市街道空间中观解读 城市街道功能详细评价 首先,我们来看看本任务的分析思路。 1.城市街道空间中观解读 下面我们正式进入第一关的内容一- 城市…

学习Python类型和对象,看这篇文章足矣!

类型与对象 一点基础理论: 对象代表现实世界中像轿车、狗、自行车这些事物。对象具有数据和行为两个主要特征。 在面向对象编程中,我们把数据当作属性,把行为当作方法。即: 数据 → 属性 和 行为 → 方法 类型是创造单个对象实例的蓝本。…

Vue基础入门(2)- Vue的生命周期、Vue的工程化开发和脚手架、Vue项目目录介绍和运行流程

Vue基础入门(2)- Vue的生命周期、Vue的工程化开发和脚手架、Vue项目目录介绍和运行流程 文章目录 Vue基础入门(2)- Vue的生命周期、Vue的工程化开发和脚手架、Vue项目目录介绍和运行流程5 生命周期5.1 Vue生命周期钩子5.2 在creat…

面向对象高级编程上

面向对象高级编程 一、面向对象高级编程上(1)C代码基本形式(2)Header中的防卫式声明(3)不带指针类的实现过程1. 防卫式声明2. 访问级别3.构造函数4.重载4.1 成员函数(有this)4.2 非成…

Igraph入门指南 1

Igraph入门指南 一、图的结构 图是顶点和边的集合,而边是通过顶点来描述。顶点和边,要用集合的理念去操作。 1、igraph中与图结构相关的函数 .igraph(), add_edges(), add_vertices(), complementer(),compose(), connect(), contract(), delete_ed…

自我对比: 通过不一致的解决视角更好地进行反思

一、写作动机: LLM 在自我评价时往往过于自信或随意性较大,提供的反馈固执或不一致,从而导致反思效果不佳。为了解决这个问题,作者提倡 "自我对比": 它可以根据要求探索不同的解决角度,对比差异…

并发编程并发安全性之Lock锁及原理分析

ReentrantLock 用途:锁是用来解决线程安全问题的 重入锁-> 互斥锁 满足线程的互斥性意味着同一个时刻,只允许一个线程进入到加锁的代码中。多线程环境下,满足线程的顺序访问 锁的设计猜想 一定会涉及到锁的抢占,需要有一个标记来实现互…

论文学习—Model-based Adversarial Meta-Reinforcement Learning

Model-based Adversarial Meta-Reinforcement Learning Abstract1. Introduction2. Related work3 Preliminaries基于模型的强化学习(MBRL):区别和联系: 4 Model-based Adversarial Meta-Reinforcement Learning4.1 Formulation 4.2 Computin…

java实现文件上传到本地

很多时候我们都需要进行文件上传和下载的操作,具体怎么实现网上的代码其实也是挺多的,刚好我的项目中也遇到了文件上传和下载的需求,本篇博文具体讲解上传操作,下篇博文讲解下载操作。 我们具体来想一想要将一个从前端传来的文件…

【原理图PCB专题】Allegro模块化移动器件报...has the LOCKED property怎么解锁?

在模块化原理图时,PCB也需要做一个模块.mdd文件。这时需要先画好图纸然后再制作模块化文件。 修改文件时会发现模块化器件报错,无法编辑模块内部器件和走线,器件和走线都被LOCKED,如下所示报错内容: Symbol "U1" Selected Cannot edit Symbol "U1". M…

磁性机器人在医学领域取得进展

磁性医疗机器人利用磁场梯度来控制设备的运动,并最终以高精度进入体内的目标组织。这些磁性机器人可以采用导管和微型或纳米机器人的形式,并由磁导航系统操纵。磁性机器人最近取得了一些进展,为临床诊断和治疗用途开辟了新的可能性。在本期的…

数据结构与算法:堆排序和TOP-K问题

朋友们大家好,本节内容来到堆的应用:堆排序和topk问题 堆排序 1.堆排序的实现1.1排序 2.TOP-K问题3.向上调整建堆与向下调整建堆3.1对比两种方法的时间复杂度 我们在c语言中已经见到过几种排序,冒泡排序,快速排序(qsor…

2024.3.5

作业1、使用select实现tcp服务器端&#xff0c;poll实现tcp客户端 服务器端&#xff1a; #include <myhead.h> #define SER_IP "192.168.199.131" //服务端IP #define SER_PORT 8888 //服务端端口号int main(int argc, const char *argv[])…

星瑞格数据库管理系统

一. 产品介绍 随着信息化的到来&#xff0c;数据安全成为保障信息化建设的一个关键问题&#xff1b;数据库作为信息化系统的基础软件其自身安全以及对数据的保障是至关重要。现阶段国内重要部门的信息系统存放着大量敏感数据&#xff0c;为了保障其数据的安全性&#xff0c;使用…

Mathcad tips_table相关

1. 可以插入表格&#xff0c;或者2. 从excel 文件导入 选择列 选择其中一行的数值

Batch Normalization和Layer Normalization和Group normalization

文章目录 前言一、Group normalization二、批量规范化(Batch Normalization)三、层规范化&#xff08;Layer Normalization&#xff09; 前言 批量规范化和层规范化在神经网络中的每个批次或每个层上进行规范化&#xff0c;而GroupNorm将特征分成多个组&#xff0c;并在每个组内…