mysql 存储过程学习

news2024/11/18 20:47:57

存储过程介绍

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)
begin
  SET 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)
begin
    declare x int default 0; -- 定义x int 类型,默认值为0
    declare y int default 1; -- 定义y
    set 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)
begin
    select 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))
begin
    insert 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))
begin
    select 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)
begin
    if a=1 then
        insert 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)
begin
    if a=1 then
        insert into classes(class_name, remark) values('Java2109','test');
    else
        insert 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)
begin
    case a
      when 1 then
           -- SOL1 如果a的值为1 则执行SQL1
       insert into classes(class_name, remark) values( ' Java2110', 'wahaha');
      when 2 then
           -- SOL2 如果a的值为2 则执行SQL2
       insert 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)
begin
  declare 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)
begin
  declare i int;
  set i =0;
  repeat 
  -- SOL
    insert 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)
begin
 declare i int ;
 set i = 1;
 myloop: loop
   -- SOL
  insert into classes(class_name, remark) values( CONCAT('HTML',i) ,'....');
  set i = i+1;
  if i=num then
     leave myloop;
  end if;
 end loop;
end;

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

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

相关文章

哪吒汽车与经纬恒润合作升级,中央域控+区域域控将于2024年落地

近日&#xff0c;在2024哪吒汽车价值链大会上&#xff0c;哪吒汽车与经纬恒润联合宣布合作升级&#xff0c;就中央域控制器和区域域控制器展开合作&#xff0c;合作成果将在山海平台新一代车型上发布。 哪吒汽车首席技术官戴大力、经纬恒润副总裁李伟 经纬恒润在智能驾驶领域拥…

数据结构(绪论+算法的基本概念)

文章目录 一、绪论1.1、数据结构的基本概念1.2、数据结构三要素1.2.1、逻辑结构1.2.2、数据的运算1.2.3、物理结构&#xff08;存储结构&#xff09;1.2.4、数据类型和抽象数据类型 二、算法的基本概念2.1、算法的特性2.2、“好”算法的特质2.2.1、算法时间复杂度2.2.2、算法空…

一款强大的矢量图形设计软件:Adobe Illustrator 2023 (AI2023)软件介绍

Adobe Illustrator 2023 (AI2023) 是一款强大的矢量图形设计软件&#xff0c;为设计师提供了无限创意和畅行无阻的设计体验。AI2023具备丰富的功能和工具&#xff0c;让用户可以轻松创建精美的矢量图形、插图、徽标和其他设计作品。 AI2023在界面和用户体验方面进行了全面升级…

【GTK】GtkApplicationWindow/GtkApplication

一、GtkApplicationWindow 在GTK&#xff08;GIMP Toolkit&#xff09;应用程序开发中&#xff0c;并不是每个GTK程序都必须有一个GtkApplicationWindow&#xff0c;但大多数基于GTK的图形界面应用程序都会使用GtkApplicationWindow&#xff0c;因为它是一个方便的类&#xff…

幻兽帕鲁搭建私服,一键更新方法

看着帕鲁这么火&#xff0c;估计更新会变为常态了&#xff0c;如果有自己搭建私服的话&#xff0c;跟着我下面的方法去进行更新吧&#xff01; 如果你还没有自己的私服&#xff0c;快去三五十搞一个吧&#xff0c;只需三五分钟&#xff0c;叫上你的小伙伴一起去搞起来吧 只需3分…

EXCEL VBA抓取网页JSON数据并解析

EXCEL VBA抓取网页JSON数据并解析 链接地址&#xff1a; https://api.api68.com/CQShiCai/getBaseCQShiCaiList.do?lotCode10036&date2024-01-26 Sub test() On Error Resume Next Sheet.Select Sheet1.Cells.ClearContents [a1:g1] Split("preDrawIssue|preDrawTi…

呼叫中心语音质检解决方案-苏州磐石云

呼叫中心语音质检解决方案是一种利用自动语音识别&#xff08;ASR&#xff09;和自然语言处理&#xff08;NLP&#xff09;技术来分析和评估呼叫录音的工具。它可以帮助呼叫中心监控和改进客户服务质量&#xff0c;提供以下功能和特点&#xff1a; 语音转文本&#xff1a;利用A…

dd 命令创建10G大小的文件

您可以使用Linux命令行工具dd来创建10GB大小的文件。以下是创建10GB文件的命令&#xff1a;dd if/dev/zero offile.img bs1G count10 在上述命令中&#xff0c;if参数指定输入文件为/dev/zero&#xff0c;这是一个特殊的文件&#xff0c;读取它会返回空字符&#xff08;即零&am…

通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别

1&#xff09;通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别 2&#xff09;OPPO相关机型没法在Unity启用90或120FPS 3&#xff09;手机输入法中的emoji 4&#xff09;Unity Application Patching怎么用 这是第369篇UWA技术知识分享的推送&#xff0c;精选了UW…

Linux常见指令汇总

目录 pwd√ ls√ cd√ 对文件的理解√ which√ alias√ touch√ linux系统目录结构√ mkdir / tree √ rmdir / rm √ man√ nano√ cp√ mv√ cat√ echo√ linux设计理念和三种重定向总结√ more/less√ head/tail√ wc√ uniq√ date / cal√ find√…

Qt Design Studio+Pyside项目

Qt Design Studio设计出的项目结构有多个层级的目录&#xff0c;我们直接用类似Qt Creator工具的方式加载main.qml文件时会报错提示module "content" is not installed&#xff0c;将content加入importPath后还是报同样的错误。 Qt Design Studio生成的文件包含了.qm…

传统图像处理算法的缺点是什么?

问题描述&#xff1a;传统图像处理算法的缺点是什么&#xff1f; 问题解答&#xff1a; 传统图像处理方法是基于一组参数&#xff0c;这些参数是在特定条件下对获取到的图像进行手动调整的。这些条件的任何变化&#xff0c;例如照明&#xff0c;都可能影响这些方法的可检测效…

element+vue 之 v-limit 按钮操作权限

1.新建一个permission.js文件 import store from /storeexport default {inserted: function (el, binding) {const { perms: limits } store.state.userconst { value: params } bindingif (!limits.length) returnif (params && Array.isArray(params)) {if (!limi…

three.js 鼠标选中模型弹出标签

效果&#xff1a;请关注抖音 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red;position: relative;"></div><…

前端工程化之:CSS工程化+Less

一、什么是Less&#xff1f; Less官网 Less中文网 Less 是一种更加简洁的样式代码&#xff0c;它非常像 CSS &#xff0c;但又不太一样&#xff0c;它让编写样式变得更容易。 Less 代码虽好&#xff0c;但它无法被浏览器识别&#xff0c;因此需要一个工具将其转换为纯正的 CS…

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

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

第四篇【传奇开心果短博文系列】鸿蒙开发技术点案例示例:TabBar和Navbar实现页面切换

传奇开心果短博文系列 系列短博文目录鸿蒙开发技术点案例示例短博文系列 短博文目录一、前言二、给Index.ets添加TabBar组件三、用TabBar组件实现页面切换四、给Index.ets添加Navbar组件五、使用Navbar独立实现页面切换六、Navbar和TabBar同时在Index.ets主页实现各自独立的页面…

taskflow 源码阅读笔记-1

之前写了一篇介绍Taskflow的短文&#xff1a;传送门 Taskflow做那种有前后依赖关系的任务管理还是不错的&#xff0c;而且他的源码里运用了大量C17的写法&#xff0c;觉得还是非常值得学习的&#xff0c;因此决定看一下他的源码&#xff0c;这里顺便写了一篇代码学习笔记。 概…

【深度学习】sdxl中的 text_encoder text_encoder_2 区别

镜像问题是&#xff1a;https://editor.csdn.net/md/?articleId135867689 代码仓库&#xff1a; https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main 截图&#xff1a; 为什么有两个CLIP编码器 text_encoder 和 text_encoder_2 &#xff1f; 在…

vivado DDS学习

实现DDS通常有两种方式&#xff0c;一种是读取ROM存放的正弦/余弦信号的查表法&#xff0c;另一种是用DDS IP核。这篇学习笔记中&#xff0c;我们要讲解说明的是VIVADO DDS IP核的应用。 目前本篇默认Phase Generator and SIN/COS LUT&#xff08;DDS&#xff09;的standard模式…