mysql 存储过程学习

存储过程介绍

1.1 SQL指令执行过程

从SQL执行的流程中我们分析存在的问题:
1.如果我们需要重复多次执行相同的SQL,SQL执行都需要通过连接传递到MySQL,并且需要经过编译和执行的步骤;

2.如果我们需要执行多个SQL指令,并且第二个SQL指令需要使用第一个SQL指令执行的结果作为参数

1.2 存储过程执行过程

什么是存储过程:
将能够完成特定功能的SQL指令进行封装 (SQL指令集),编译之后存储在数据库服务器上,并且为之取一个名字,客户端可以通过名字直接调用这个SQL指令集,获取执行结果。

存储过程优点:
1.SQL指令无需客户端编写,通过网络传送,可以节省网络开销,同时避免SQL指令在网络传输过程中被恶意篡改保证安全性;
2.存储过程经过编译创建并保存在数据库中的,执行过程无需重复的进行编译操作,对SQL指令的执行过程进行了性能提升;
3.存储过程中多个SQL指令之间存在逻辑关系,支持流程控制语句 (分支、循环)可以实现更为复杂的业务;
存储过程的缺点:
1.存储过程是根据不同的数据库进行编译、创建并存储在数据库中;当我们需要切换到其他的数据库产品时,需要重新编写针对于新数据库的存储过程;
2.存储过程受限于数据库产品,如果需要高性能的优化会成为一个问题;
3.在互联网项目中,如果需要数据库的高 (连接)并发访问,使用存情过程会增加数据库的连接执行时间 (因为我们将复杂的业务交给了数据库进行处理)

1.3 创建存储过程语法:
create procedure <proc name>([IN/OUT args])begin
-- SQl
end;
-- 创建一个存储过程实现加法运算:Java语法中,方法是有参数和返回值的存储过程中,是有输入参数 和 输出参数的
create procedure proc_test1(IN a int,IN b int,OUT c int)
beginSET c = a+b;
end;
1.4 调用存储过程 
-- 调用存储过程
-- 定义变量@m
set @m = 0;
-- 调用存储过程,将3传递给a,将2传递给b,将@m传递给c
call proc_test1(3,2,@m);
-- 显示变量值
select @m from dual;
1.5 存储过程中变量的使用:存储过程中的变量分为两种:局部变量和 用户变量

1.6 局部变量

局部变量: 定义在存储过程中的变量,只能在存储过程内部使用。

局部变量定义语法:局部变量要定义在存储过程中,而且必须定义在存储过程开始

declare <attr_name> <type> [default value];


局部变量定义示例:

create procedure proc_test2(IN a int,OUT r int)
begindeclare x int default 0; -- 定义x int 类型,默认值为0declare y int default 1; -- 定义yset x = a*a;set y = a/2;set r = x+y;
end ;

1.7 用户变量

用户变量: 相当于全局变量,定义的用户变量可以通过 select @attrName from dual进行查询
用户变量会存储在mysql数据库的数据字典中(dual)
用户变量定义使用set关键字直接定义,变量名要以@开头
set @n=1 ;

1.8 给变量设置值

无论是局部变量还是用户变量,都是使用 set 关键字修改值

set @n=1 ;
call proc_test2(6,@n);
select @n from dual;
1.9 将查询结果赋值给变量

在存储过程中使用select..into..给变量赋值

查询学生数量--
create procedure proc_test3(OUT c int)
beginselect count(stu_num) INTO c from students;-- 将查询到学生数量赋值给c
end;-- 调用存储过程
call proc_test3(@n);
select @n from dual:

1.10 用户变量使用注意事项


 因为用户变量相当于全局变量,可以在SOL指令以及多个存储过程中共享,在开发中建议尽量少使用用户变量,用户变量过多会导致程序不易理解、难以维护。


1.11 存储过程的参数


MySQL存储过程的参数一共有三种: IN \ OUT \ INOUT


1.11.1  IN输入参数
  输入参数:在调用存储过程中传递数据给存储过程的参数(在调用的过程必须为具有实际值的变量 或者 字面值)

-- 创建存储过程: 添加学生信息
create procedure proc_test4(IN snum char(8),IN sname varchar(20), IN gender char(2), IN ageint,IN cid int,IN remark varchar(255))
begininsert into students stu_num, stu_name, stu_gender,stu_age, cid, remark)values( snum, sname, gender , age, cid, remark ) ;
end ;
-- 调用存储过程
call proc_test4('20210108',小丽',女',20,1,'aaa');


1.11.2  OUT输出参数

输出参数:将存储过程中产生的数据返回给过程调用者,相当于Java方法的返回值,但不同的是一个存储过程可以有多个输出参数
 

-- 创建存储过程,根据学生学号,查询学生姓名
create procedure proc_test5(IN snum char(8),0UT sname varchar(20))
beginselect stu_name INTO sname from students where stu_num = snum;
end ;set @name=''
call proc_test5('20210188',@name);
select @name from dual;

1.11.12 INOUT输入输出参数
 

create procedure proc_test6(INOUT str varchar(20))
begin select stu_name INTO str from students where stu_num=str;
end ;set @name= '20210108';
call proc_test6(@name);
select @name from dual;
2.1 存储过程中流程控制

在存储过程中支持流程控制语句用于实现逻辑的控制


2.1.1 分支语句

  • if-then-else
-- 单分支: 如果条件成立,则执行SQL
if conditions then
-- SQL
end if;
-- 如果参数a的值为1,则添加一条班级信息
create procedure proc_test7(IN a int)
beginif a=1 theninsert into classes(class_name, remark) values( 'Java2109','test');end if;
end ;-- 双分支:如果条件成立则执行SQL1,否则执行SQL2
if conditions then-- SQL1
else-- SQL2
end if;
-- 如果参数a的值为1,则添加一条班级信息,否则添加一条学生信息
create procedure proc_test7(IN a int)
beginif a=1 theninsert into classes(class_name, remark) values('Java2109','test');elseinsert into students (stu_num, stu_name, stu_gender , stu_age, cid, remarkvalues('20210110',小花',女',19,1,'...');end if;
end ;
  •  case
-- case
create procedure proc_test8(IN a int)
begincase awhen 1 then-- SOL1 如果a的值为1 则执行SQL1insert into classes(class_name, remark) values( ' Java2110', 'wahaha');when 2 then-- SOL2 如果a的值为2 则执行SQL2insert into students(stu_num, stu_name, stu_gender, stu_age, cid, remark)values( '20210111','小刚','男',21,2,'...');else-- SQL (如果变量的值和所有when的值都不匹配,则执行else中的这个SQL)update students set stu_age = 18 where stu_num ='20210119' end case ;
end ;

2.2  循环语句

  • while
-- while
create procedure proc_test9(IN num int)
begindeclare i int;set i = 0;while i < num do-- SQL insert into classes(class_name,remark) values(CONCAT('Java',i) ,'....');set i = i+1;end while;
end;call proc test9(4);
  • repeat
- repeat
create procedure proc_test10(IN num int)
begindeclare i int;set i =0;repeat -- SOLinsert into classes(class_name, remark) values( CONCAT('Python',i) , '....');set i = i+1;until i > num end repeat;
end;
  • loop 
-- loop
create procedure proc_test11(IN num int)
begindeclare i int ;set i = 1;myloop: loop-- SOLinsert into classes(class_name, remark) values( CONCAT('HTML',i) ,'....');set i = i+1;if i=num thenleave myloop;end if;end loop;
end;

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

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

相关文章

【干货】【常用电子元器件介绍】【电阻】(二)--敏感电阻器

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。   电子电路中除了采用普通电阻器外&#xff0c;还有一些敏感电阻器&#xff08;如热敏电阻器、压敏电阻器、光敏电阻器等&#xff09;也被广泛地应用。然而…

vue 样式隔离原理

日常写单文件组件时&#xff0c;会在style添加scoped属性&#xff0c;如<style scoped>&#xff0c;目的是为了隔离组件与组件之间的样式&#xff0c;如下面的例子&#xff1a; <template><p class"foo">这是foo</p><p class"bar&q…

Python算法题集_无重复字符的最长子串

本文为Python算法题集之一的代码示例 题目3&#xff1a;无重复字符的最长子串 说明&#xff1a;给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "a…

少儿编程 2023年12月电子学会图形化编程等级考试Scratch一级真题解析(选择题)

2023年12月scratch编程等级考试一级真题 选择题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1、观察下列每个圆形中的四个数&#xff0c;找出规律&#xff0c;在括号里填上适当的数 A、9 B、17 C、21 D、5 答案&#xff1a;C 考点分析&#xf…

使用 CDC MinIO 汇入端为 CockroachDB 保持持久数据

CockroachDB 数据库迅速崭露头角&#xff0c;作为一个坚韧且可扩展的分布式 SQL 数据库。它从其昆虫名字的坚持不懈中汲取灵感&#xff0c;即使面对硬件故障&#xff0c;CockroachDB 也能保证高可用性。其分布式架构横跨多个节点&#xff0c;类似于其昆虫原型的适应性。 凭借强…

【RT-DETR有效改进】EfficientFormerV2移动设备优化的视觉网络(附对比试验效果图)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

【运行Python爬虫脚本示例】

主要内容&#xff1a;Python中的两个库的使用。 1、requests库&#xff1a;访问和获取网页内容&#xff0c; 2、beautifulsoup4库&#xff1a;解析网页内容。 一 python 爬取数据 1 使用requests库发送GET请求&#xff0c;并使用text属性获取网页内容。 然后可以对获取的网页…

Jmeter连接数据库报错Cannot load JDBC driver class‘com.mysql.jdbc.Driver’解决

问题产生: 我在用jmeter连接数据库查询我的接口是否添加数据成功时,结果树响应Cannot load JDBC driver class com.mysql.jdbc.Driver 产生原因: 1、连接数据库的用户密码等信息使用的变量我放在了下面,导致没有取到用户名密码IP等信息,导致连接失败 2、jmeter没有JDB…

Ps:将文件载入堆栈

Ps菜单&#xff1a;文件/脚本/将文件载入堆栈 Scripts/Load Files into Stack 将文件载入堆栈 Load Files into Stack脚本命令可用于将两个及以上的文件载入到同一个 Photoshop 新文档中。 载入的每个文件都将成为独立的图层&#xff0c;并使用其原始文件名作为图层名。 Photos…

《Vue3 基础知识》 Vue2+ElementUI 自动转 Vue3+ElementPlus(GoGoCode)

前言 GoGoCode 一个基于 AST 的 JavaScript/Typescript/HTML 代码转换工具。 AST abstract syntax code 抽象语法树。 实现 第一步&#xff1a;安装 GoGoCode 插件 全局安装最新的 gogocode-cli 即可 npm i gogocode-cli -g查看版本 gogocode-cli -V相关插件说明 插件描述…

01 Redis的特性+下载安装启动+客户端连接

1.1 NoSQL NoSQL&#xff08;“non-relational”&#xff0c; “Not Only SQL”&#xff09;&#xff0c;泛指非关系型的数据库。 键值存储数据库 &#xff1a; 就像 Map 一样的 key-value 对。如Redis文档数据库 &#xff1a; NoSQL 与关系型数据的结合&#xff0c;最像关系…

软件包管理:在CentOS 7中部署Tengine

目录 下载&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 部署&#xff1a; 实验操作 下载&#xff1a; 方法一&#xff1a; 1、打开浏览器搜索tengine并点击官网 2、选择需要安装的版本并复制链接链接 标题栏处可以更改为中文界面 下滑选择版本单击下载 在远程连…