Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例

场景

存储过程

存储过程是一组为了完成特定功能的SQL语句集合。使用存储过程的目的是将常用或复杂的工作预先用SQL语句写好并用一个指定名称存储起来,

这个过程经编译和优化后存储在数据库服务器中,因此称为存储过程。

当以后需要数据库提供与己定义好的存储过程的功能相同的服务时,只需调用"CALL 存储过程名字"即可自动完成。

创建存储过程

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

CREATE PROCEDURE sp_name ( [proc_parameter] ) [characteristic .. ·] routine body

CREATE PROCEDURE 为用来创建存储函数的关键字;

sp_name为存储过程的名称;

proc_parameter指定存储过程的参数列表 列表形式如下:

[ IN I OUT I INOUT ) param name type

IN 表示输入参数, OUT 表示输出参数, INOUT 表示既可以输入也可以输出 param_name 表示参数名称 type 表示参数的类型,

该类型可以是 MySQL 数据库中的任意类型。

characteristic 指定存储过程的特性,有以下取值

(1)LANGUAGE SQL:说明 routine_body部分是由 SQL 语句组成的,SQL是LANGUAGE特性的唯一值。

(2)[NOT] DETERMINISTIC: 指明存储过程执行的结果是否正确。 DETERMINISTIC表示结果是确定的,

当每次执行存储过程时相同的的输入会得到相同的输出;

NOT DETERMINISTIC 表示结果是不确定的,相同的输入可能得到不同的输出。

如果没有指定任意一个值,默认为NOT DETERMINISTIC。

(3){ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用 SQL语句的限制。

CONTAINS SQL 表明子程序包含SQL语句,但是不包含读或写数据的语句。

NOSQL 表明子程序不包含SQL语句。

READS SQL DATA 说明子程序包含读数据的语句。

MODIFIES SQL DATA 表明子程序包含写数据的语句。在默认情况下,系统会指定为 CONTAINS SQL。

(4)SQL SECURITY { DEFINER |INVOKER }: 指明谁有权限来执行。 DEFINER表示只有定义者才能执行。

INVOKER 表示拥有权限的调用者可以执行。在默认情况下 系统指定为 DEFINER。

(5)COMMENT 'string': 注释信息,可以用来描述存储过程或函数。

routine_ body是SQL代码的内容,可以用 BEGIN··· END 来表示 SQL 代码的开始和结束。

创建测试表test_student

CREATE TABLE test_student
(sid int PRIMARY KEY,sname VARCHAR(20),ssex CHAR(2),sage int,did int
);

插入测试数据

INSERT INTO test_student(sid,sname,sage,did)
VALUES (1,'张三',13,101),(2,'李四',14,101),(3,'王五',15,102),(4,'赵六',16,101);

创建查看student表的存储过程

CREATE PROCEDURE Proc_student () BEGINSELECT*FROMtest_student;
END;

调用存储过程

CALL 语句用来调用一个使用 PROCEDURE 创建好的存储过程,基本语法格式如下:

CALL sp name ([parameter [, ···]]}

CALL 调用语句中的 sp_name 为存储过程的名称, parameter 为存储过程的参数。

创建存储过程,查询某个班级的平均年龄,然后调用该存储过程

CREATE PROCEDURE avg_student (IN dep INT,OUT avg FLOAT ) BEGINSELECTavg( sage ) INTO avgFROMtest_studentWHEREdid = dep;
END;CALL avg_student(101,@aa);
-- 查询返回的结果
SELECT @aa;

查看存储过程

在存储过程创建好以后,用户可以通过如下三种方式进行查看

方式1:使用SHOW PROCEDURE STATUS 语句查看存储过程的状态

SHOW PROCEDURE STATUS LIKE 'avg_%';

获取数据库中所有名称以字母avg_开头的存储过程的信息。

只能查看存储过程操作哪一个数据库,存储过程的名称、类型,谁定义的, 创建和修改时间、字符编码等信息,

不能查看存储过程的具体定义。

如果需要查看详细定 ,需要使用 SHOW CREATE PROCEDURE 语句。

方式2:使用 SHOW CREATE PROCEDURE 语句

SHOW CREATE PROCEDURE avg_student;

它返回一个可用来重新创建已命名存储过程的确切字符串

方式3:通过information_schema.Routines 查看存储过程的信息。

SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_NAME = 'avg_student';

修改存储过程

在存储过程创建完成后,如果需要修改,可以使用ALTER语句进行修改

修改存储过程的定义,将读写权限改为MODIFIES SQL DATA,并指明调用者可以执行。

ALTER PROCEDURE avg_student
MODIFIES SQL DATA
SQL SECURITY INVOKER;

删除存储过程

使用DROP PROCEDURE 语句

DROP PROCEDURE avg_student;

存储函数

创建存储函数

创建存储函数需要使用 CREATE FUNCTION 语旬

基本语法格式如下

CREATE FUNCTION func_name ( [func_parameter] ) RETURNS type [characteristic···] routine_ body

CREATE FUNCTION 为用来创建存储函数的关键字:

func_name 表示存储函数的名称;

func_parameter 为存储过程的参数列表,

参数列表形式如下

{IN | OUT | INOUT } param_name type

其中,IN 表示输入参数,OUT 表示输出参数,INOUT 表示既可以输入也可以输出, param_name 表示参数名称,

 type 表示参数的类型,该类型可以是 MySQL 数据库中的任意类型。

 CREATE FUNCTION name_student ( aa INT ) RETURNS CHAR ( 50 ) BEGINRETURN ( SELECT sname FROM test_student WHERE did = aa );END

参数定义 aa 返回一个CHAR类型结果。

SELECT语句从student 表申查询 did 等于aa并将该记录中的sname字段返回。

如果提示:

This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled 
(you *might* want to use the less safe log_bin_trust_function_creators variable)

执行如下临时生效,重启后失效:

set global log_bin_trust_function_creators= TRUE;

调用存储函数

MySQL中,存储函数的使用方法和MySQL内部函数的使用方法是一样的。

用户自己定义的存储函数与MySQL内部函数的性质相同,区别在于存储函数是用户自己定义的,

而内部函数是MySQL开发者定义的。

SELECT name_student(102);

查看存储函数

可以使用 SHOW FUNCTION STATUS 语句或 SHOW CREATE FUNCTION 语句来查看

也可以直接从系统的 information_chema 数据库中查询。

SHOW FUNCTION STATUS LIKE 'name_student';
SHOW CREATE FUNCTION name_student;
SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_NAME = 'name_student';

删除存储函数

删除存储函数可以使用 DROP FUNCTION 语句

DROP FUNCTION name_student;

自定义函数

定义变量

MySQL 中使用 DECLARE 关键字来定义变量,定义变量的基本语法格式如下

DECLARE var_name[,···] type [DEFAULT value]

DECLARE 关键字用来声明变量。

var name 数是变量的名称,可以同时定义多个变量。

type参数用来指定变量的类型。

DEFAULT value 子句为变量提供一个默认值。默认值可以是一个常数,也可以是一个表达式。

如果没有给变量指定默认值,初始值为NULL

DECLARE studentid char(10) DEFAULT '一年级';

变量赋值

变量赋值使用SET语句

DECLARE v1;
SET v1=66;
-- MySQL中还可以使用SELECT··· INTO 语句为变量赋值
DECLARE student_name char(50);
SELECT sname into student_name
FROM test_student
WHERE sid= 2;

流程控制语句

IF语句

IF price>=30 thenSELECT '价格太高';
ELSE SELECT '价格适中';
END IF;

判断price的值,如果price大于等于30,输出字符串'价格太高',否则输出字符串'价格适中'。

IF语句都需要END IF来结束

CASE语句用来进行条件判断,

CASE did
WHEN 101 THEN SELECT '一年级';
WHEN 102 THEN SELECT '二年级';
END CASE;

LOOP语句

LOOP语句可以重复执行特定的语句,实现简单的循环,但是 LOOP 语句本身并不进行条件判断,

 没有停止循环的语句,必须使用LEAVE语句才能停止循环,跳出循环过程。

基本格式

[begin_label:] LOOP
statement list
END LOOP [end_label]

语法中的 begin_label 参数和 end_label 参数分别表示循环开始和结束的标志,

这两个标志必须相同 ,而且都可以省略 statement_list参数表示需要循环执行的语句

DECLARE aa int default 0;
Add_sum:loopSet aa=aa+1;
END loop Add_sum;

该例执行的是aa加1的操作,循环中没有跳出循环的语旬,所以该循环为死循环

LEAVE语句

LEAVE 语句主要用来跳出任何被标注的流程控制语句

DECLARE aa int default 0;
Add_sum:loopSet aa=aa+1;IF aa>50 then leave Add_sum;END IF;
END loop Add_sum;

ITERATE语句

ITERATE语句也是用来跳出循环的语句,但ITERATE只可以出现在LOOP 、REPEAT和WHILE语句内。ITERATE语句是跳出本次循环,然后直接进入下次循环,ITERATE的意思是再次循环

CREATE PROCEDURE pp(a INT)
BEGINLa: LOOPSET a=a+1;
IF a<10 THEN ITERATE la;
END IF;LEAVE la;END LOOP la;SET @x=a;
END;

该例中的a变量为输入参数,在LOOP循环中a的值加1,在 IF 条件语句中进行判断,如果a的值小于10,则使用ITERATE la 跳出本次循环,又一次从头开始 LOOP 循环,a的值再次加1;若a大于等于10,则ITERATE la 语句不执行 执行下面的 LEAVE la 语句跳出整个循环。

REPEAT 语句

REPEAT 语句创建的是带条件判断的循环过程。循环语句每次执行完都会对表达式进行判断,若表达式为真,则结束循环,否则再次重复执行循环中的语句。当条件判断为真时就会跳出循环语句。

REPEAT语句的基本语法格式

[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]

语法中的begin_label end_label为开始标记和结束标记 均可以省略。 statement_list 参数表示循
环的执行语旬, search_condition参数表示结束循环的条件,该条件为真时结束跳出循环 该参数为假时再次执行循环语句

DECLARE ss int DEFAULT 0;
REPEATSET ss=ss+1;UNTIL ss>=10;
END REPEAT;

WHILE 语句

WHILE 语句也是有条件控制的循环语句 WHILE 语句和REPEAT 语句是不同的。 WHILE语句在执行时先对条件表达式进行判断 若该条件表达式为真 则执行循环内的语句,否则退出循环过程

DECLARE ss int DEFAULT 0;
WHILE ss<=10 DO
SET ss=ss+1;
END WHILE;

光标/游标的使用

在存储过程或自定义函数中的查询可能会返回多条记录。

可以使用光标来逐条读取查询结果集中的记录。

光标在很多其他书 被称为游标。光标的使用包括光标的声明、打开光标、使用光标和关闭光标。

需要注意的是,光标必须在处理程序之前声明 在变量和条件之后声明。

声明光标

声明一个名为cursor_student的光标

DECLARE cursor_student CURSOR FOR SELECT sid,sname FROM test_student;

打开光标

OPEN cursor_student;

使用光标

使用名称为cursor_student的光标,将查询得到的数据存储在变量e_no e_name

FETCH cursor_student INTO e_no,e_name;

关闭光标

CLOSE cursor_student;

定义条件和处理程序

在程序的运行过程中可能会遇到问题,此时可以通过定义条件和处理程序来事先定义这些问题,

并且可以在处理程序中定义在遇到这些问题时应该采用什么样的处理方式,提出解决方法 保证存储过程或自

定义函数在遇到警告或错误时能够继续执行,从而增强程序处理问题的能力,避免程序出现异常,被停止执行

定义条件的语法格式

DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE [VALUE]  sqlstate_value | mysql_error_code

语法中的 condition_name 参数为条件的名称, condition_value 参数为条件的类型。

sqlstate_value和mysql_error_code 都可以表示 MySQL 的错误。

其中 sqlstate_value 为长度为5的字符串类型的错误代码,mysql_error_code 为数值类型错误代码。

示例:定 义RROR 1110(44000)的错误,名称为 command not find

DECLARE command_not_find CONDITION FOR sqlstate '44000';
DECIMAL command_not_find CONDITION FOR 1110;


定义处理程序

其语法格式如下:

DECLARE handler_type HANDLER FOR condition_value [,...] sp_statement


参数说明
handler_type : CONTINUE | EXIT | UNDO
handler_type 为错误处理方式,取上述3个值中的一个。

CONTINUE 表示遇到错误不处理,继续执行

EXIT 表示遇到错误马上退出;UNDO 表示遇到错误后撤销之前的操作。

condition_value 表示错误的类型,该参数可以取以下值。

SQLSTATE[VALUE] sqlstate_value 字符串错误值。

condition_name :使用DECLARE CONDITION 定义的错误条件名称。

SQLWARNING: NOT FOUND 匹配所有以 02 开头的 SQLSTATE 错误代码 SQLEXCEPTION 匹配所有没有被SQLWARNING或NOT FOUND 捕获的 SQLSTATE 错误代码。

示例 定义捕获 sqlstate_value 值。如果遇到 sqlstate_value 值为23SOO 执行 CONTINUE 操作,并且给变量x赋值20

DECLARE CONTINUE HANDLER FOR SQLSTATE '23S00'
SET @x= 20;

示例  该方法捕获 mysql_error_code 值。如果mysql_error_code值为1146,执行CONTINUE操作,并且给变量x赋值20

DECLARE CONTINUE HANDLER FOR 1146
SET @x= 20;

示例  该方法先定义NO TABLE 条件,遇到1150错误时执行CONTINUE操作,并输出"NO TABLE"信息。

DECLARE NO_TABLE CONDITION FOR 1150;
DECLARE CONTINUE HANDLER FOR NO_TABLE
SET @info= 'NO_TABLE';

示例  SQLWARNING捕获所有以01开头的sqlstate_value值,然后执行EXIT操作,并且输出 "ERROR"信息。

DECLARE EXIT HANDLER FOR SQLWARNING SET @info= 'ERROR';

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

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

相关文章

分享WPF的UI开源库

文章目录 前言一、HandyControl二、AduSkin三、Adonis UI四、Panuon.WPF.UI五、LayUI-WPF六、MahApps.Metro七、MaterialDesignInXamlToolkit八、FluentWPF九、DMSkin总结 前言 分享WPF的UI开源库。 一、HandyControl HandyControl是一套WPF控件库&#xff0c;它几乎重写了所…

uni-app 扫描二维码获取信息功能

首先是扫描二维码的功能&#xff0c;可以参考这篇博文 uni-app-H5页面调用设备摄像头扫描二维码_uni-app app端调用摄像头显示至指定元素上显示-CSDN博客 然后现在是可以扫描二维码的状态&#xff0c;扫描之后&#xff0c;可以看到首先是出发上一个页面的事件&#xff0c;然后…

每天一个数据分析题(四百二十五)- 单因素方差分析

关于下表&#xff0c;错误说法是&#xff08; &#xff09; A. 这是单因素方差分析的输出结果 B. 表中 F< F crit, 与 P-value 大于显著性水平是等价的 C. 表内组间均方差没有显著大于组内均方差 D. 由于组内SS数值显著大于组间SS&#xff0c;因此可以推断不同分类对于…

使用Python绘制面积图

使用Python绘制面积图 面积图效果代码 面积图 面积图展示数据随时间的累积变化&#xff0c;适合表现趋势和总量。通过填充图形下方的区域&#xff0c;可以直观地显示各时间点的数值及其变化。 效果 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-…

机器学习——决策树(笔记)

目录 一、认识决策树 1. 介绍 2. 决策树生成过程 二、sklearn中的决策树 1. tree.DecisionTreeClassifier&#xff08;分类树&#xff09; &#xff08;1&#xff09;模型基本参数 &#xff08;2&#xff09;模型属性 &#xff08;3&#xff09;接口 2. tree.Decision…

最新开源免费数字人工具

使用步骤更是简单到不行&#xff1a; 1. 输入图片&#xff1a;选择你想要生成动态视频的肖像图片。 2. 输入音频&#xff1a;提供与图片匹配的音频文件&#xff0c;EchoMimic会根据音频内容驱动肖像的动态效果。 3. 设置参数&#xff1a;一般保持默认设置即可&#xff0c;当然&…

排序题目:最小时间差

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;最小时间差 出处&#xff1a;539. 最小时间差 难度 3 级 题目描述 要求 给定一个 24 \texttt{24} 24 小时制的时间列表&#xff0c;时间以 &quo…

暗黑魅力:Xcode全面拥抱应用暗黑模式开发指南

暗黑魅力&#xff1a;Xcode全面拥抱应用暗黑模式开发指南 随着苹果在iOS 13和iPadOS 13中引入暗黑模式&#xff0c;用户可以根据自己的喜好或环境光线选择不同的界面主题。作为开发者&#xff0c;支持暗黑模式不仅能提升用户体验&#xff0c;还能彰显应用的专业性。Xcode提供了…

《梦醒蝶飞:释放Excel函数与公式的力量》11.4 ISERROR函数

第11章&#xff1a;信息函数 第四节 11.4 ISERROR函数 11.4.1 简介 ISERROR函数是Excel中的一个信息函数&#xff0c;用于检查指定单元格或表达式是否产生错误。如果单元格或表达式产生任何类型的错误&#xff08;如N/A、VALUE!、REF!等&#xff09;&#xff0c;则返回TRUE&…

全开源TikTok跨境商城源码/TikTok内嵌商城+搭建教程/前端uniapp+后端

多语言跨境电商外贸商城 TikTok内嵌商城&#xff0c;商家入驻一键铺货一键提货 全开源完美运营 海外版抖音TikTok商城系统源码&#xff0c;TikToK内嵌商城&#xff0c;跨境商城系统源码 接在tiktok里面的商城。tiktok内嵌&#xff0c;也可单独分开出来当独立站运营 二十一种…

FPGA原型验证(八):如何选择现成的原型验证平台?

第6章 如何选择现成的原型验证平台? 在第5章中,我们探讨了为基于FPGA的原型项目创建FPGA硬件平台时应考虑的详细因素。 现在,我们将考虑所谓的“自制还是购买”争论的另一方面。什么时候使用现成的FPGA板或甚至是更复杂的基于FPGA的系统,而不是设计定制板更有意义? 什么…

leetcode165.解密数字

题目表述&#xff1a; 这道题目和斐波那契数列以及跳台阶问题十分相似。 斐波那契数列&#xff1a;0、1、1、2、3、5, 8、13、21、34 …… leetcode跳台阶问题&#xff1a;1、1、2、3、5, 8、13、21、34....... 这类题目的特点都是第N项的结果等于前两项的和。 但是解密数…

java 在pdf中根据关键字位置插入图片(公章、签名等)

java 在pdf中根据关键字位置插入图片&#xff08;公章、签名等&#xff09; 1.使用依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.12</version><type>pom</type>…

【深度学习】图形模型基础(7):机器学习优化中的方差减少方法(1)

摘要 随机优化是机器学习中至关重要的组成部分&#xff0c;其核心是随机梯度下降算法&#xff08;SGD&#xff09;&#xff0c;这种方法自60多年前首次提出以来一直被广泛使用。近八年来&#xff0c;我们见证了一个激动人心的新进展&#xff1a;随机优化方法的方差降低技术。这…

车载测试资料学习和CANoe工具实操车载项目(每日直播)

每日直播时间&#xff1a;&#xff08;直播方式&#xff1a;腾讯会议&#xff09; 周一到周五&#xff1a;20&#xff1a;00-23&#xff1a;00 周六与周日&#xff1a;9&#xff1a;00-17&#xff1a;00 向进腾讯会议学习的&#xff0c;可以关注我并后台留言 直播内容&#xff…

Simscape物理建模步骤

为了介绍构建和仿真物理模型的步骤&#xff0c;这里以simulink自带示例模型Mass-Spring-Damper with Controller为例&#xff0c;下图为建立好的模型。 详细物理建模和仿真分析步骤如下&#xff1a; 步骤 1&#xff1a;使用 ssc_new 创建新模型 使用 ssc_new 是开始构建 Sims…

李彦宏所说的卷应用到底是什么?

李彦宏在2024世界人工智能大会上的发言强调了一个重要的观点&#xff0c;那就是在AI时代&#xff0c;技术的应用比技术本身更为关键。他所提出的“卷应用”而非“卷模型”&#xff0c;实际上是在呼吁业界关注AI技术的实际落地和价值创造&#xff0c;而不是单纯地在模型精度或规…

【 RESTful API 】

RESTful API 是一种用于构建 web 应用程序的设计风格和架构模式。它提供了通过 HTTP 协议访问和操作资源的规范方式。 REST&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;它强调在网络中以资源的形式进行数据传输和状态管理。RESTfu…

Memcached与Redis:缓存解决方案的较量与选择

标题&#xff1a;Memcached与Redis&#xff1a;缓存解决方案的较量与选择 在现代应用架构中&#xff0c;缓存是提升性能的关键技术之一。Memcached和Redis作为两款流行的开源缓存解决方案&#xff0c;它们各自有着独特的特点和使用场景。本文将深入比较Memcached和Redis的特性…

案例|LabVIEW连接S7-1200PLC

附带&#xff1a; 写了好的参考文章&#xff1a; 通讯测试工具和博图仿真机的连接教程【内含图文完整过程软件使用】 解决博图V15 V16 V17 V18等高版本和低版本在同款PLC上不兼容的问题 目录 前言一、准备条件二、步骤1. HslCommunicationDemo问题1&#xff1a;连接失败?问题…