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

MySQL创建存储过程和存储函数

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客


《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com)

MySQL9数据库技术_夏天又到了的博客-CSDN博客

存储程序可以分为存储过程和函数。在MySQL中,创建存储过程和存储函数使用的语句分别是CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句来调用存储过程,只能用输出变量返回值。存储函数可以从语句外调用(引用函数名),也能返回标量值。一个存储过程可以调用其他存储过程。

8.1.1  创建存储过程

创建存储过程,需要使用CREATE PROCEDURE语句,基本语法格式如下:

CREATE PROCEDURE sp_name ( [proc_parameter] )[characteristics ...] routine_body

各参数解释如下:

(1)CREATE PROCEDURE为用来创建存储过程的关键字。

(2)sp_name为存储过程的名称。

(3)proc_parameter为指定存储过程的参数列表,列表形式如下:

[ IN | OUT | INOUT ] param_name type

其中,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型,该类型可以是MySQL数据库中的任意类型。

(4)characteristics指定存储过程的特性,有以下取值:

  • LANGUAGE SQL:说明routine_body部分是由SQL语句组成的,当前系统支持的语言为SQL。SQL是LANGUAGE特性的唯一值。
  • [NOT] DETERMINISTIC:指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定的,每次执行存储过程时,相同的输入会得到相同的输出;NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定值,则默认为NOT DETERMINISTIC。
  • { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。CONTAINS SQL表明子程序包含SQL语句,但是不包含读写数据的语句;NO SQL表明子程序不包含SQL语句;READS SQL DATA说明子程序包含读数据的语句;MODIFIES SQL DATA表明子程序包含写数据的语句。默认情况下,系统会指定为CONTAINS SQL。
  • SQL SECURITY { DEFINER | INVOKER }:指明谁有权限来执行。DEFINER表示只有定义者才能执行;INVOKER表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER。
  • COMMENT 'string':注释信息,可以用来描述存储过程或存储函数。

(5)routine_body是SQL代码的内容,可以用BEGIN…END来表示SQL代码的开始和结束。

编写存储过程并不是一件简单的事情,可能需要复杂的SQL语句,并且要有创建存储过程的权限。但是,使用存储过程将简化操作,减少冗余的操作步骤;同时,还可以减少操作过程中的失误,提高效率。因此,存储过程是非常有用的,而且应该尽可能地学会使用。

下面的代码演示了一个存储过程的创建,其名称为“AvgFruitPrice”,返回所有水果的平均价格:

CREATE PROCEDURE AvgFruitPrice ()
BEGIN
SELECT AVG(f_price) AS avgprice
FROM fruits;
END;

上述代码中,名为“AvgFruitPrice”的存储过程使用CREATE PROCEDURE AvgFruitPrice ()语句定义。此存储过程没有参数,但是后面的()仍然需要。BEGIN和END语句用来限定存储过程体,过程本身仅是一个简单的SELECT语句(AVG()为求字段平均值的函数)。

【例8.1】创建查看表fruits的存储过程,SQL语句如下:

CREATE PROCEDURE Proc()BEGINSELECT * FROM fruits;END ;

上述代码创建了一个查看表fruits的存储过程,每次调用这个存储过程的时候都会执行SELECT语句查看表的内容,代码的执行过程如下:

MySQL> DELIMITER //
MySQL> CREATE PROCEDURE Proc()-> BEGIN-> SELECT * FROM fruits;-> END //
Query OK, 0 rows affected (0.00 sec)MySQL> DELIMITER ;

这个存储过程和使用SELECT语句查看表的效果得到的结果是一样的。

当然,存储过程也可以是很多复杂语句的组合,其本身也可以调用其他的函数来组成更加复杂的操作。

【例8.2】创建名称为“CountProc”的存储过程,SQL语句如下:

CREATE PROCEDURE CountProc (OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM fruits;
END;

上述代码的作用是创建一个获取表fruits中的记录条数的存储过程,其名称是CountProc;COUNT(*)计算后把结果放入参数param1中。执行结果如下:

mysql> DELIMITER // 
mysql> CREATE PROCEDURE CountProc(OUT param1 INT)-> BEGIN-> SELECT COUNT(*) INTO param1 FROM fruits;-> END;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;

8.1.2  创建存储函数

创建存储函数,需要使用CREATE FUNCTION语句,基本语法格式如下:

CREATE FUNCTION func_name ( [func_parameter] )RETURNS type[characteristic ...] routine_body

各参数解释如下:

(1)CREATE FUNCTION为用来创建存储函数的关键字。

(2)func_name表示存储函数的名称

(3)func_parameter为存储过程的参数列表,参数列表形式如下:

[ IN | OUT | INOUT ] param_name type

其中,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型,该类型可以是MySQL数据库中的任意类型。

(4)RETURNS type语句表示函数返回数据的类型。

(5)characteristic指定存储函数的特性,取值与创建存储过程时的相同,这里不再赘述。

【例8.3】创建存储函数,名称为NameByZip,该函数返回SELECT语句的查询结果,数值类型为字符串型,SQL语句如下:

CREATE FUNCTION NameByZip ()RETURNS CHAR(50)RETURN  (SELECT s_name FROM suppliers WHERE s_call= '48075');

上述语句创建了一个存储函数NameByZip(),参数定义为空,返回一个CHAR类型的结果。代码的执行结果如下:

mysql> set global log_bin_trust_function_creators=TRUE;
mysql> DELIMITER //
mysql> CREATE FUNCTION NameByZip()
-> RETURNS CHAR(50)
-> RETURN   (SELECT s_name FROM suppliers WHERE s_call= '48075');
-> //mysql> DELIMITER ;

如果存储函数中的RETURN语句返回一个类型不同于函数的RETURNS子句中的指定类型的值,则返回值将被强制为恰当的类型。例如,如果一个函数返回一个ENUM或SET值,但是RETURN语句返回一个整数,则对于SET成员集相应的ENUM成员,MySQL会将从函数返回的整数值转换为字符串。

8.1.5  光标的使用

查询语句可能返回多条记录,如果数据量非常大,则需要在存储过程和存储函数中使用光标来逐条读取查询结果集中的记录。应用程序可以根据需要滚动或浏览其中的数据。本小节将介绍如何声明、打开、使用和关闭光标。

光标必须在声明处理程序之前被声明,并且变量和条件还必须在声明光标或处理程序之前被声明。

1. 声明光标

在MySQL中,使用DECLARE关键字来声明光标,其语法的基本形式如下:

DECLARE cursor_name CURSOR FOR select_statement

其中,cursor_name参数表示光标的名称;select_statement参数表示SELECT语句的内容,返回一个用于创建光标的结果集。

【例8.10】声明名称为“cursor_fruit”的光标,SQL语句如下:

DECLARE cursor_fruit CURSOR FOR SELECT f_name, f_price FROM fruits ;

在本例中,光标的名称为“cur_fruit”,SELECT语句部分从表fruits中查询出f_name和f_price字段的值。

2. 打开光标

打开光标的语法如下:

OPEN cursor_name{光标名称}

【例8.11】打开名称为“cursor_fruit”的光标,SQL语句如下:

OPEN  cursor_fruit ;

3. 使用光标

使用光标的语法如下:

FETCH cursor_name INTO var_name [, var_name] ...{参数名称}

其中,cursor_name参数表示光标的名称;var_name参数表示将光标中的SELECT语句查询出来的信息存入该参数中,var_name必须在声明光标之前就已经定义好。

【例8.12】使用名称为“cursor_fruit”的光标将查询出来的数据存入fruit_name和fruit_price这两个变量中,SQL语句如下:

FETCH  cursor_fruit INTO fruit_name, fruit_price ;

在本例中,将光标cursor_fruit中用SELECT语句查询出来的信息存入fruit_name和fruit_price中,并且fruit_name和fruit_price必须在前面已经定义好。

4. 关闭光标

关闭光标的语法如下:

CLOSE cursor_name{光标名称}

这个语句关闭先前打开的光标。

如果光标未被明确地关闭,则它在被声明的复合语句的末尾关闭。

【例8.13】关闭名称为“cursor_fruit”的光标,SQL语句如下:

CLOSE  cursor_fruit;

 

相关文章:

MySQL创建存储过程和存储函数

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...

PyQt学习记录03——批量设置水印

0. 目录 PyQt学习记录01——加法计算器 PyQt学习记录02——串口助手 1. 前言 本次主要是为了学习Qt中的 QFileDialog 函数, QFileDialog.getExistingDirectory:用于选择文件夹,返回的是一个文件夹路径。 QFileDialog.getOpenFileName&…...

vivo手机和Windows电脑连接同一个WiFi即可投屏!

虽然现在很多人喜欢刷手机,但是对于长时间需要使用手机办公的人来说,手机屏幕还是太小了,当人一天二十四小时中要花费近十个小时摆弄手机,就会渴望手机屏幕能够大一点,至少看的时候,眼睛舒服一点。 因为嫌弃…...

芯盾时代数据安全产品体系,筑牢数据安全防线

芯盾时代数据安全治理(DSG)框架,以国家法律法规、行业监管标准、行业最佳实践为依据,从数据安全战略出发,以数据分类分级为支撑,构数据安全管理体系、数据安全技术体系、数据安全运营体系与数据安全监督评价…...

异位妊娠唯一相关的是年龄(U型曲线)

异位妊娠唯一相关的是年龄(U型曲线) 简介 异位妊娠,俗称宫外孕,是指受精卵在子宫体腔以外着床发育的异常妊娠过程 。正常情况下,受精卵会在子宫内着床并发育成胎儿,但在异位妊娠中,受精卵却在…...

CTF-WEB: 利用Web消息造成DOM XSS

如果索引中有类似如下代码 <!-- Ads to be inserted here --> <div idads> </div> <script>window.addEventListener(message, function(e) {document.getElementById(ads).innerHTML e.data;}); </script>这行代码的作用是将接收到的消息内容…...

【通俗易懂说模型】一篇弄懂几个经典CNN图像模型(AlexNet、VGGNet、ResNet)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...

Unity世界坐标转成UI坐标

Unity世界坐标转成UI坐标 介绍转换代码合并方法总结 介绍 在Unity中官方提供了很多坐标转换的API&#xff0c;但是还没有一个API是将世界坐标系转换成UI的坐标系&#xff0c;世界坐标系在屏幕中的位置是不固定的所以有时候需要转换成UI坐标系**&#xff08;注意这里不是转换成…...

自制游戏——斗罗大陆

很简陋&#xff0c;没有图&#xff0c;请见谅 // mine[0] 级数 // mine[1] 战力 //mine[2] 1 白虎 //mine[2] 2 昊天锤 //mine[2] 3 蓝银草 #include <bits/stdc.h> using namespace std; int mine[100],live3, dou 1, luo 1, da 1, bag[1000], huan 0, lia…...

MindStudio制作MindSpore TBE算子(四)算子测试(ST测试-Ascend910B/ModelArts)--失败尝试

上一节&#xff0c;MindStudio制作MindSpore TBE算子&#xff08;三&#xff09;算子测试&#xff08;ST测试&#xff09;&#xff0c;因此缺乏对应的硬件环境导致无法进行ST测试&#xff0c;导致难以自安&#xff0c;今天搞来Ascend910B服务器来填坑&#xff0c;看看是否是硬件…...

二、交换机的vlan子设备接入

一、交换机的vlan设置-CSDN博客 二、交换机的vlan子设备接入-CSDN博客 接上篇的文章&#xff0c;本文接入了子设备 网络结构如下&#xff1a; 用路由器A和POE交换机B代替第一篇中的笔记本电脑&#xff0c;路由器A和交换机B都关闭DHCP服务&#xff0c;并分别接入一个IPC&#…...

EFCore相关知识分享

EFCore相关知识分享 文章目录 EFCore相关知识分享前言EFCore 的优势SaveChang的作用EF Core 查询优化小技巧使用投影&#xff08;投影到所需的数据类型&#xff09;延迟加载&#xff08;Lazy Loading&#xff09;与显式加载&#xff08;Eager Loading&#xff09;使用 AsNoTrac…...

检测网络安全漏洞 工具 网络安全 漏洞扫描 实验

实验一的名称为信息收集和漏洞扫描 实验环境&#xff1a;VMware下的kali linux2021和Windows7 32&#xff0c;网络设置均为NAT&#xff0c;这样子两台机器就在一个网络下。攻击的机器为kali,被攻击的机器为Windows 7。 理论知识记录&#xff1a; 1.信息收集的步骤 2.ping命令…...

deepseek + kimi 高效生成PPT

1.在deepseek中生成ppt大纲 2.将大纲复制到kimi中生成PPT kimi&#xff1a;https://kimi.moonshot.cn/...

JavaWeb学习-Mybatis(增删改查)

(一)Mybatis入门程序 1.创建springboot工程,并导入 mybatis的起步依赖、mysql的驱动包。(项目工程创建完成后,自动在pom.xml文件中,导入Mybatis依赖和MySQL驱动依赖) <dependencies> <!-- mybatis起步依赖 --> <dependency> …...

软考高项(二十四)法律法规和标准规范 ★重点集萃★

&#x1f451; 个人主页 &#x1f451; &#xff1a;&#x1f61c;&#x1f61c;&#x1f61c;Fish_Vast&#x1f61c;&#x1f61c;&#x1f61c; &#x1f41d; 个人格言 &#x1f41d; &#xff1a;&#x1f9d0;&#x1f9d0;&#x1f9d0;说到做到&#xff0c;言出必行&am…...

Django中select_related 的作用

Django中这句代码Dynamic.objects.select_related(song)是什么意思&#xff1f; 在 Django 中&#xff0c;这句代码&#xff1a; Dynamic.objects.select_related(song) 的作用是 在查询 Dynamic 模型的同时&#xff0c;预加载 song 关联的外键对象&#xff0c;从而减少数据…...

vscode无法ssh连接远程机器解决方案

远程服务器配置问题 原因&#xff1a;远程服务器的 SSH 服务配置可能禁止了 TCP 端口转发功能&#xff0c;或者 VS Code Server 在远程服务器上崩溃。 解决办法 检查 SSH 服务配置&#xff1a;登录到远程服务器&#xff0c;打开 /etc/ssh/sshd_config 文件&#xff0c;确保以下…...

计算机组成原理——中央处理器(九)

在每一个清晨醒来&#xff0c;你都有一个全新的机会去塑造你的世界。无论昨日经历了多少风雨&#xff0c;今天的你依旧可以启航向梦想的彼岸。生活或许会给你设置障碍&#xff0c;但请相信&#xff0c;这些都是通往成功的垫脚石。不要让短暂的困境遮蔽了你的视野&#xff0c;因…...

网页版贪吃蛇小游戏开发HTML实现附源码!

项目背景 贪吃蛇是一款经典的休闲小游戏&#xff0c;因其简单易玩的机制和丰富的变形而深受玩家喜爱。本次开发目标是实现一款网页版贪吃蛇小游戏&#xff0c;并通过前端与后端结合的方式&#xff0c;提供一个流畅的在线体验。 实现过程 游戏逻辑设计 蛇的移动&#xff1a;…...

工业物联网实战启示:从14万亿预测看价值闭环与组织变革

1. 从一份价值14万亿美元的预测报告中&#xff0c;我们能学到什么&#xff1f;最近在整理一些行业旧闻时&#xff0c;翻到了2015年EE Times上的一篇老文章&#xff0c;讲的是埃森哲&#xff08;Accenture&#xff09;对工业物联网&#xff08;Industrial IoT, IIoT&#xff09;…...

面向软件测试从业者的多模态AI系统评估体系构建指南

随着人工智能技术的飞速演进&#xff0c;多模态AI系统正逐渐从实验室走向广泛的产业应用。这类系统能够同时处理和理解文本、图像、音频、视频等多种模态的信息&#xff0c;并实现跨模态的语义融合与推理。对于软件测试从业者而言&#xff0c;评估此类系统的复杂性远超传统单模…...

ITR9909反射光电管实测:10cm检测距离怎么来的?手把手教你做距离-电压曲线

ITR9909反射光电管深度测评&#xff1a;从原理到实战的距离-电压曲线构建指南 在工业自动化、机器人导航和智能家居领域&#xff0c;反射式光电检测管因其非接触式检测特性而广受欢迎。ITR9909作为一款性能优异的反射式红外光电管&#xff0c;其标称的10cm检测距离背后隐藏着怎…...

Pytorch图像去噪实战(八十):降级策略与熔断保护,保证高峰期服务不被大图请求拖垮

Pytorch图像去噪实战(八十):降级策略与熔断保护,保证高峰期服务不被大图请求拖垮 一、问题场景:高峰期几个大图请求,把整个服务拖慢 图像去噪服务在高峰期最怕两类请求: 超大图片 高质量模型请求 它们会占用大量 CPU/GPU 时间,导致普通小图请求也变慢。 这时如果没有…...

为vscode中的claude code插件配置taotoken后端以解决封号困扰

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为vscode中的claude code插件配置taotoken后端以解决封号困扰 许多开发者在 Visual Studio Code 中使用 Claude Code 插件时&#…...

【Midjourney Sumi-e风格创作终极指南】:20年AI绘画专家亲授3大笔触控制法则、5类水墨失真避坑清单与实时渲染参数配置表

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Sumi-e水墨美学与AI生成的本体论契合 留白即存在 水墨画中的“余白”并非空无&#xff0c;而是气韵流转的场域——这与生成式AI中隐空间&#xff08;latent space&#xff09;的拓扑结构惊人地同构。扩…...

如何快速将Figma设计文件转换为结构化JSON数据:完整指南

如何快速将Figma设计文件转换为结构化JSON数据&#xff1a;完整指南 【免费下载链接】figma-to-json &#x1f4be; Read/Write Figma Files as JSON 项目地址: https://gitcode.com/gh_mirrors/fi/figma-to-json 在当今的设计开发工作流中&#xff0c;Figma已成为UI/UX…...

学术人必抢的实时检索红利,Perplexity这4个隐藏功能90%研究者至今未启用,错过再等半年!

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Perplexity实时学术搜索怎么用 Perplexity 是一款面向研究者与开发者设计的实时学术搜索引擎&#xff0c;其核心优势在于直接对接 arXiv、PubMed、ACL Anthology、Semantic Scholar 等权威学术数据库&a…...

多云配置管理工具MCP:统一编排AWS、GCP等云资源的实战指南

1. 项目概述&#xff1a;一个高效的多云配置管理工具 最近在梳理团队的基础设施配置时&#xff0c;发现了一个挺有意思的开源项目&#xff0c;叫 malminhas/mcp 。乍一看这个名字&#xff0c;你可能会有点懵&#xff0c;这缩写代表什么&#xff1f;其实&#xff0c;MCP 在这里…...

别再让电机烧了!聊聊工业设备中三相电源保护的两种经典电路设计与选型

工业三相电机保护电路设计实战&#xff1a;从原理到工程落地 在空压机房嘈杂的轰鸣声中&#xff0c;老王师傅正对着烧毁的电机摇头叹气——这已经是本月第三台因电源故障报废的设备。类似场景在工业现场屡见不鲜&#xff0c;统计显示超过40%的电机故障源于电源异常&#xff0c;…...