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)
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;

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

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

相关文章

Linux文本三剑客---awk

awk&#xff08;是一种处理文本文件的应用程序&#xff0c;它依次处理文件的每一行&#xff0c;并读取里面的每一个字段。&#xff09; awk 包含几个特殊的内建变量&#xff08;可直接用&#xff09;如下所示&#xff1a; 1、获取根分区剩余大小 #可以使用df -h命令来查看所有…

AlexNet,ZFNet详解

1 AlexNet 网络结构 对于AlexNet网络来说&#xff0c;因为当时资源环境受限&#xff0c;他从第一步卷积开始就把一个图像分到两个GPU上训练&#xff0c;然后中间进行组合最后进行融合成全连接成1000个置信度 1 得到一张3x224x224的图像&#xff0c;然后进行11x11的卷积&…

1|Java代码是怎么跑起来的?

相信每个Java程序员都想过一个问题&#xff1a; “我写的Java代码时怎样在机器上跑起来的&#xff1f;“&#x1f914; 这篇文章就尝试把这个问题说一下✍ Java代码执行流程 二话不说先把图丢出来&#xff1a; 大概经历了这么几个步骤&#xff1a; 一位高级程序猿&#xff0…

竞赛练一练 第31期:GESP和电子学会相关题目练习

Day20&#xff1a;CIE一级2020.09_小鸡与鸭妈拥抱 1. 准备工作 &#xff08;1&#xff09;背景&#xff1a;Farm; &#xff08;2&#xff09;角色&#xff1a;Chick、Duck。 2. 功能实现 &#xff08;1&#xff09;角色的初始位置、方向和造型如图所示。 &#xff08;2&am…

DualSPHysics v5.0源码编译教程,新手入门

目录 一、前期准备1. 安装C编译器2. 安装CUDA 二、下载源码三、编译四、报错解决五、验证 一、前期准备 DualSPHysics是可以编译运行在CPU和GPU上的&#xff0c;所以需要安装C编译器&#xff1a;例如gcc&#xff0c;和CUDA编译器&#xff1a;nvcc。 如果电脑上不支持CUDA&…

【笔试常见编程题01】删除公共字符串、组队竞赛、倒置字符串、排序子序列

1. 删除公共字符串 输入两个字符串&#xff0c;从第一字符串中删除第二个字符串中所有的字符。 例如&#xff0c;输入”They are students.”和”aeiou”&#xff0c;则删除之后的第一个字符串变成”Thy r stdnts.” 输入描述 每个测试输入包含2个字符串 输出描述 输出删除后的…

翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二 1. 将任何静态图表转换为动态数据可视化 ChatGPT Vision 不仅可以将涂鸦变成功能齐全的 Streamlit 应用程序&#xff0c;还…

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

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

LeNet跟LeNet5详解

1 LeNet结构 主要是为了手写数字识别 具体结构讲解&#xff1a;从图中例子可得 1 先传入一个灰度图像尺寸为1x28x28&#xff0c;通道数为1&#xff0c;尺寸为28x28的灰度图像 2 第一层5x5卷积&#xff0c;经过公式 输入图像尺寸-卷积核尺寸2padding/步长1&#xff0c;&#…

打造专业级ChatGPT风格聊天界面:SpringBoot与Vue实现动态打字机效果,附完整前后端源码

大家好&#xff0c;今天用SpringBoot、vue写了一个仿ChatGPT官网聊天的打字机效果。 所有代码地址:gitee代码地址 &#xff0c;包含前端和后端&#xff0c;可以直接运行 使用本技术实现的项目&#xff1a;aicnn.cn&#xff0c;欢迎大家体验 如果文章知识点有错误的地方&#xf…

Visio绘图文件阅读器 --- VSD Viewer

VSD Viewer是一款轻量级、直观易用的软件&#xff0c;专门设计用于查看和打印Microsoft Visio绘图文件。它支持多种Visio文件格式&#xff0c;如VSD、VSDX等&#xff0c;并能够快速加载Visio绘图文件&#xff0c;无需等待太长时间。VSD Viewer还提供高质量的打印功能&#xff0…

【目标跟踪】多相机环视跟踪

文章目录 一、前言二、流程图三、实现原理3.1、初始化3.2、输入3.3、初始航迹3.4、航迹预测3.5、航迹匹配3.6、输出结果 四、c 代码五、总结 一、前言 多相机目标跟踪主要是为了实现 360 度跟踪。单相机检测存在左右后的盲区视野。在智能驾驶领域&#xff0c;要想靠相机实现无…

Ps:根据 HSB 调色(以可选颜色命令为例)

在数字色彩中&#xff0c;RGB 和 HSV&#xff08;又称 HSB&#xff09;是两种常用的颜色表示方式&#xff08;颜色模型&#xff09;。 在 RGB 颜色模式下&#xff0c;Photoshop 的红&#xff08;Red&#xff09;、绿&#xff08;Green&#xff09;、蓝&#xff08;Blue&#xf…

空气质量预测 | Python实现基于线性回归、Lasso回归、岭回归、决策树回归的空气质量预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 政府机构使用空气质量指数 (AQI) 向公众传达当前空气污染程度或预测空气污染程度。 随着 AQI 的上升,公共卫生风险也会增加。 不同国家有自己的空气质量指数,对应不同国家的空气质量标准。 对于空气质量预测,…

SpringBoot将第三方的jar中的bean对象自动注入到ioc容器中

新建一个模块&#xff0c;做自动配置 config&#xff1a;需要准备两个类&#xff0c;一个自动配置类&#xff0c;一个配置类 CommonAutoConfig&#xff1a;此类用于做自动配置类它会去读取resoutces下的META-INF.spring下的org.springframework.boot.autoconfigure.AutoConfig…

EDEM仿真导入stl文件慢的原因

我在将solidworks导出为STL文件后&#xff0c;再导入EDEM软件进行离散元仿真时&#xff0c;导入速度特别慢&#xff0c;发现是因为stl文件分辨率设置的过于精细&#xff0c;将文件分辨率设置为粗糙后&#xff0c;导入速度就快了。

SSH客户端 Termius for Mac 中文激活版

Termius for Mac是一款强大的终端和SSH客户端&#xff0c;为开发人员、系统管理员和网络工程师提供了全面的远程访问和管理工具。 软件下载&#xff1a;Termius for Mac 中文激活版下载 无论您是在使用Mac、Windows还是Linux系统&#xff0c;Termius都能提供出色的功能和用户体…

一、计算机组成与体系结构【7分】

一、课程内容 二、分值 三、数据表示 1、进制转换 其他进制转换为十进制 十进制转换为其他进制 二进制转换为八进制与十六进制 2、码制 这一块目前不是很懂 3、浮点数表示 4、算数与逻辑运算 四、校验码 1、奇偶校验码&#xff08;只能检测出奇位的错误&#xff0c;…

mac上搭建hbase伪集群

1. 前言 之前我们已经搭建过了 hbase单点环境&#xff0c;(单机版搭建参见&#xff1a; https://blog.csdn.net/a15835774652/article/details/135569456) 但是 为了模拟一把集群环境 我们还是尝试搭建一个伪集群版 2. 环境准备 jdk环境 1.8hdfs &#xff08;hadoop环境 可选…

如何保证缓存与数据库双写时的数据一致性?

背景&#xff1a;使用到缓存&#xff0c;无论是本地内存做缓存还是使用 Redis 做缓存&#xff0c;那么就会存在数据同步的问题&#xff0c;因为配置信息缓存在内存中&#xff0c;而内存时无法感知到数据在数据库的修改。这样就会造成数据库中的数据与缓存中数据不一致的问题。 …