MySQL----存储过程

news2025/1/21 3:00:45

目录

一、存储过程的介绍

二、存储过程的基本语法

三、变量

(1)系统变量

(2)用户自定义变量

(3)局部变量

四、存储过程的语法详解

(1)if判断

(3)条件判断case语句

(4)while循环语句

(5)repeat循环语句

(6)loop循环语句

(7)cursor游标


一、存储过程的介绍

存储过程是事先经经过编译并存储在数据库中的一段SQL语句的集合,调用存储
过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于高效数据处理
的效率是有好处的。
存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用,你可以将
它和C语言中的函数类比,注意是类比而不是相同。
特点:封装,复用,可以接受参数,也可以返回数据,减少网络交互,效率提升

二、存储过程的基本语法


创建存储过程:
  create procedure 存储过程名称(参数列表)
  begin
    -SQL语句
  end;

  调用存储过程:
  call 存储过程名称(参数)

  查看在哪个数据库下的存储过程的语句:
  select *from information_schema.routines where routine_schema='数据库名';

  查看某个存储过程的定义,也就是创建存储过程的语句
  show create procedure 存储过程名称; 
  
  删除存储过程:
  drop procedure if exists 存储过程名称:

 举例:

#使用class_first数据库
use class_first;
# 开始创建存储过程
create procedure p1()
begin
    select *from s;
end;
create procedure p2()
begin
    select *from p;
end;
# 调用其中一个存储过程p1
call p1();
# 查看当前数据库存在的存储过程
select *from information_schema.ROUTINES where routine_schema='class_first';
# 查看某一个创建某一个存储过程的语句,假如查看的是存储过程p1
show create procedure p1;

三、变量

(1)系统变量

系统变量是MySQL服务器提供,不是用户自定义的,属于服务器层面,分为全局变量(global)和会话变量(session),会话变量指的是在当前控制台的变量,假如修改了话变量,但是重新打开了另外一个控制台,查看时会发现并未修改。

查看系统变量
  show [session/global] variables;             查看所有系统变量
  show [session/global] variables like '...';  可以通过like模糊匹配方式查找变量
  select @@[session/global].系统变量名         查看指定变量的值
 
设置系统变量
  set [session/global] 系统变量名=值;
  set @@[session/global]系统变量=值;
show session variables;
show session variables like 'auto%';

set session autocommit=0;

关闭了当前会话的自动提交,但是其他会话并未关闭

全局变量的修改在MySQL服务器重新启动后还是会回到初始值,想要永久修改的话,要修改MySQL的部分配置文件。

(2)用户自定义变量

用户自定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用"@变量名"即可,假如这个时候并未赋值,那么得到的值就是NULL,其作用域为当前连接。

赋值
   set @变量名=值;
   set @变量名:=值;
   select @变量名:=值;
   
   从表格查询将查询的数据赋值给变量
   select 字段名 into @变量名 from 表名; 

  使用变量
   select @变量名;
select @s;#并未给s赋值,得到的是NULL

set @ss:=2;
select @io:='opop';
select @ss,@io;

(3)局部变量

 局部变量是根据需要定义的在局部生效的变量,访问之前,需要declare声明,可以作存储过程
  内的局部变量和输入参数,局部变量的范围是在其内声明的begin...end块。

声明:
  declare 变量名 变量类型 (如果有默认值则 default...)
  变量类型:int,bigint,char,varchar,dae,time

  赋值
   set 变量名=值
   set 变量名:=值
   select 字段名 into 变量名 from 表名...;
create procedure p3()
begin
    declare st int default 1;
    declare sss int;
    select  count(*) into sss from s;
    select sss;
end;

call p3();

四、存储过程的语法详解

(1)if判断

1:if判断
 if 条件 then
  ...
  end if

2:if...elseif判断
 if 条件 then
 ...
 elseif 条件2 then
 ...
 end if

3:if...else判断
if 条件 then
...
else 
...
end if

(2)参数

参数:
   in     该类参数作为输入,也就是需要调用时传入值(什么也没有是默认是in参数)
   out    该类参数作为输出,也就是该参数可以作为返回值
   inout  既可以作为输入参数,也可以作为输出参数


用法:
  create procedure 存储过程名称([in/out/inout]参数名 参数类型)
 begin
    SQL语句
 end;

 

举个例子,输入成绩,得到成绩的等级

create procedure p1(in score int,out result varchar(10))
begin
     if score>=80&&score<=100 then
         set result:='优秀';
    elseif score>=60&&score<=100 then
         set result:='及格';
    elseif score>=0&&score<=100 then
         set result:='不及格';
    else
         set result:='输入的参数是非法参数';
     end if;
end;

call p1(819,@ioio);//这里第二个返回的参数是用户自定义的变量,记得要用@哦
select @ioio;

第二个例子是关于inout的使用

create procedure p1(inout result int)
begin
     set result:=result*0.5;
end;

set @9:=100;
call p1(@9);
select @9;

(3)条件判断case语句

case
  when 条件表达式1 then
    ...
  when 条件表达式2 then
   ...
  ...
  else
   ...
end case;

需求:一月到三月是第一季度,每三个月是一个季度,现在输入一个月份,判断是第几季度。

create procedure p1(in res int,out ul varchar(10))
begin
     case
         when res>=1&&res<=3 then
           set ul:='第一季度';
        when res>=4&&res<=6 then
           set ul:='第二季度';
        when res>=7&&res<=9 then
           set ul:='第三季度';
        when res>=10&&res<=12 then
           set ul:='第四季度';
        else
           set ul:='你输入的是非法参数';
        end case;
end;

call p1(-1,@res);
select  @res;

(4)while循环语句

如果条件是true就继续下去循环知道为false
while 条件 do
 SQL语句
end while;

需求:求1到n的和:

create procedure p1(in n int)
begin
    declare sum int default 0;
    declare i int default 1;
    while i<=n do
        set sum:=sum+i;
        set i:=i+1;
        end while;
    select sum;
end;
call p1(100);

(5)repeat循环语句

repeat和while循环不一样,while循环满足条件继续循环,而repeat循环满足条件则跳出循环。

repeat 
  SQL逻辑
  until 条件

end repeat:

如:求1到n的和

create procedure p1(in n int)
begin
    declare sum int default 0;
    declare i int default 1;
    repeat
        set sum:=sum+i;
        set i=i+1;
    until i>n
        end repeat;
    select sum;
end;
call p1(10);

(6)loop循环语句


loop可以配合一下两个语句实现简单的退出循环

leave:退出当前的循环
iterate:结束本次循环,直接进行下一次的循环

语法:
  循环名称:loop
     循环体
   end loop;

求1到n之间的和(使用loop)

create procedure p1(in n int)
begin
    declare sum int default 0;
    declare i int default 1;
    su:loop
        if i>n then
            leave su;
        end if;
        set sum:=sum+i;
        set i:=i+1;
    end loop;
    select sum;
end;
call p1(100);

求1到n之间偶数的和

create procedure p2(in n int)
begin
     declare sum int default 0;
     declare i int default 0;
     su:loop
         set i:=i+1;
        if i%2=1 then
          iterate su;
        end if;
        if i>n then
             leave su;
         end if;
        set sum:=sum+i;
     end loop;
     select sum;
end;
call p2(10);

(7)cursor游标

游标是用来莻查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环
的处理。游标的使用包括游标的声明,open,fetch和close。也就是说游标可以歌剧
自己想要的条件得到一个筛选过的结果集。其用法分别如下:

1:声明游标
 declare 游标名称 cursor for 查询语句;

2:打开游标
 open 游标名称

3:获取游标记录
 fetch 游标名称 into 变量,[变量];

4:关闭游标
 close 游标名

再具体举例之前还得说一下条件处理处理程序,为什么要说呢?在获取游标记录时我们使用循环来获取,直到游标中的数据获取完了,但要怎么判断获取结束,这时候就需要条件处理程序了。

条件处理程序可以用来定义在流程控制结构执行过程中遇到问题时相对应的处理步骤。

语法:
  declare  行为   handler for 状态码 +sql逻辑语句

行为:
  continue 继续执行当前程序
  exit 终止执行当前程序

状态码
  如02000之类

  sqlwarning sql警告,所有以01开头的代码简写
  not found  未找到数据,所以以02开头
  sqlexception 没有被sqlwarning和not found捕获的代码简写

具体我们来举个例子

这里我创建了一张表,现在我要将年龄小于自定义输入的值再重新放入一个表格中(如年龄小于20岁):

create table sp(
    age int,
    name varchar(10)
);
insert into sp values (18,'李四'),
(20,'张三'),
(12,'王二麻子'),
(80,'赵云'),
(26,'查类'),
(40,'谢逊'),
(63,'李白'),
(52,'杜甫'),
(19,'韩信');

 

create procedure p1(in uage int)
begin
    declare usname varchar(10);
    declare u_age int;
    declare u_cursor cursor for select name,age from sp where age<uage;
    declare exit handler for not found close u_cursor;
    drop table if exists stu;
    create table stu(
        u_name varchar(10),
        u_age int
    );
    open u_cursor;
    while true do
        fetch u_cursor into usname,u_age;
        insert into stu(u_name, u_age) values(usname,u_age);
        end while;
    close u_cursor;
end;
call p1(20);

 

同时数据库中也出现了stu表

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

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

相关文章

数据要想管理得好,不得不提开源大数据处理解决方案

在很多企业里&#xff0c;内部数据的管理几乎是一团糟的。在大数据时代的环境中&#xff0c;不少企业急需要提升数据管理的效率&#xff0c;因此想通过一些有利途径来实现这一目的。开源大数据处理解决方案就是其中一个有效途径&#xff0c;是助力企业做好数据管理&#xff0c;…

07 ConfigMap/Secret:怎样配置、定制我的应用

文章目录1. ConfigMap/Secret 介绍1.1 为什么kubernets 要使用应用的配置管理&#xff1f;1.2 有什么类别的配置信息&#xff1f;2. 什么是 ConfigMap&#xff1f;2.1 创建ConfigMap模板文件2.1.1 ConfigMap 怎么生成带data 字段的 模板2.2 创建ConfigMap 对象2.3 查看ConfigMa…

傻白入门芯片设计,一颗芯片的诞生(九)

CPU生产和制造似乎很神秘&#xff0c;技术含量很高。许多对电脑知识略知一二的朋友大多会知道CPU里面最重要的东西就是晶体管了&#xff0c;提高CPU的速度&#xff0c;最重要的一点说白了提高主频并塞入更多的晶体管。由于CPU实在太小&#xff0c;太精密&#xff0c;里面组成了…

Java中的多线程如何理解——精简

目录 线程池处理Runnable任务 线程池处理Callable任务 Executors的工具类构建线程池对象 引言 通过前面的学习&#xff0c;我们已经学会了线程是如何创建的以及线程的常用方法&#xff0c;接下来呢&#xff0c;我们将要深入性了解线程中的知识&#xff0c;主要是线程安全&…

基于PHP+MySQL学生信息管理系统的开发与设计

一直以来我国领导人提倡以人为本的治国方案,而大学是未来人才的培养基地,如何能够更好的对学生信息进行管理,是很多高校一直在研究的一个问题,只有更加科学的对学生信息进行管理,才能够更加积极的培养国家的栋梁之才。 本系统是一个学生信息信息管理系统,为了能够更加灵活的对学…

mysql InnoDB 事务的实现原理

前言 关于mysql的InnoDB存储引擎的关键知识点&#xff0c;已经输出了6篇文章了&#xff0c;但是好像阅读量并不大&#xff0c;可能大家都不太喜欢理论性特别强的东西&#xff1f;或者是这些知识点难度有点高&#xff0c;不太容易被接受&#xff1f;不过&#xff0c;我觉得我分享…

【Java实战】工作中并发处理规范

目录 一、前言 二、并发处理规范 1.【强制】获取单例对象需要保证线程安全&#xff0c;其中的方法也要保证线程安全。 2.【强制】创建线程或线程池时请指定有意义的线程名称&#xff0c;方便出错时回溯。 3.【强制】线程资源必须通过线程池提供&#xff0c;不允许在应用中…

数仓数据同步策略

学习内容一、同步策略一、同步策略 数据同步策略的类型包括&#xff1a;全量同步、增量同步、新增及变化同步、特殊情况 全量表&#xff1a;存储完整的数据增量表&#xff1a;存储新增加的数据新增及变化表&#xff1a;存储新增加的数据和变化的数据特殊表&#xff1a;只需要…

定义自定义指令;inserted()、update()

自定义指令的意义&#xff1a;对普通DOM元素进行底层操作&#xff1b; 作用 &#xff1a;可以获取到底层的dom&#xff0c;拿到想要的节点&#xff0c;从而进行操作&#xff1b; 实际应用&#xff1a;可以通过指令知道什么时候dom创建完成&#xff0c;从而进行依赖dom的库的初…

刷爆力扣之有效的山脉数组

刷爆力扣之有效的山脉数组 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#x…

超级浏览器的Cookies实现跨境电商防关联

大家有没有过这种感觉&#xff0c;打开电脑或手机&#xff0c;一些你喜欢的视频&#xff0c;总能一下子打到心巴上;心心念念想要下单的东西&#xff0c;总是不停出现在屏幕上诱惑你下单。你以为网络才是最懂你的人&#xff0c;其实是大数据正在研究你的一举一动。而聊到大数据&…

Cerebral Cortex:疼痛热刺激引起的脑功能网络分离与整合

目前的研究旨在确定热痛期间大脑网络整合/分离的变化&#xff0c;使用高时间分辨率的网络连接事件优化方法。参与者(n 33)主动判断施加于前臂掌侧的热刺激是否疼痛&#xff0c;然后在每次试验后评价温暖/疼痛强度。我们表明&#xff0c;试验中整合/分离的时间演化与疼痛的主观…

Ubuntu中安装Qt

文章目录Ubuntu中安装必要的软件安装流程配置运行配置运行Ubuntu中安装必要的软件 主要为了打开图形程序 sudo apt-get update sudo apt-get --assume-yes upgrade sudo apt-get install --assume-yes xfce4 xorg-dev libopencc2 libopencc2-data unzip zip主要是一些共享lib…

ECU简介

ECU是电子控制单元的简称&#xff0c;广泛用于汽车系统中&#xff0c;是电控系统的神经中枢。本文将以比较基础的方式展开ECU的工作原理。 一、基本结构 ECU主要由CPU、存储器、IO接口、信息传递总线组成。ECU可以把传感器传入的信号用内存程序和数据启动相应的程序&#xff0c…

人工智能:语音识别技术介绍

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&…

移动Web

her~~llo&#xff0c;我是你们的好朋友Lyle&#xff0c;是名梦想成为计算机大佬的男人&#xff01; 博客是为了记录自我的学习历程&#xff0c;加强记忆方便复习&#xff0c;如有不足之处还望多多包涵&#xff01;非常欢迎大家的批评指正。 目录 一、字体图标 1.1 使用字体图…

Windows使用scp上传文件到linux服务器

我不是管理员&#xff0c;所以上传有点麻烦&#xff0c;需要在windows电脑上操作scp命令&#xff0c; 命令格式&#xff1a;上传文件夹带上-r&#xff0c;上传文件就不用带-r了&#xff0c;而且只能上传到tmp目录下&#xff0c;然后再使用mv命令移动到你想要的目录下&#xff…

宝塔上的wordpress站点更换域名+配置SSL+改版百度收录

前言 好久没写文章了&#xff0c;甚是想念&#xff0c;近半年来发生了很多事情&#xff0c;心态也变了很多。 这个博客自创办以来&#xff0c;原域名叫“is-hash.com”&#xff0c;是我2019年的突发奇想注册此域名&#xff0c;“is-hash”即为“是#”&#xff08;hash是#的英…

力扣第73题

一、题目&#xff1a;73. 矩阵置零 二、题目解析&#xff1a; 解题步骤&#xff1a;注意题目要求原地算法–>利用矩阵的第一行和第一列记录矩阵需要置0的行和列&#xff0c;只要把0所在行和列的第一个位置置为0&#xff0c; 然后再根据第一行和第一列0的位置&#xff0c;对…

设备树覆盖:实现 DTO

前面我们学习了dts&#xff0c;也知道这个dtc、dtb。这个dto是什么&#xff1f; 实现 DTO 包括分割设备树、构建、分区和运行。 在实现可以正常工作之后&#xff0c;您还必须保持两个 DT 之间的兼容性&#xff0c;并确定用于确保每个 DT 分区安全性的策略。 1、分割 DT 首先…