数据库存储过程(全网最全)

article/2025/10/22 10:30:40

一、存储过程的概念

存储过程是定义在服务器上的一段子程序代码,存储过程时数据库对象之一。

  • 存储过程在服务器端运行,需要时调用,执行速度快,方便使用
  • 确保数据库的安全,存储过程可以完成所有的数据库操作
  • 降低网络负载,客户端不必提交sql语句
  • 可以接受用户参数,也可以返回参数

二、存储过程类型

  • 系统存储过程 【名字以sp_为前缀,存储在master库中】
  • 本地存储过程 【存储在用户定义的数据库中】
  • 扩展存储过程 【名字都已xp_为前缀,储存在master库中】
  • 临时存储过程 【名字以#开头的】

三、创建并调用存储过程

创建一个存储过程的语句:

delimiter $$ //这是定义一个结束符$$
create procedure [存储过程名称]([参数])
begin
......
end$$
delimiter ; //重新定义结束符为 ;

创建一个统计课程数量的存储过程:

create procedure count_course()
begin
select count(*) from course;
end$$
  • delimiter 重新定义结束符号

调用count_course存储过程

call count_course$$

在这里插入图片描述

四、存储过程的变量

1、变量定义

使用declare声明变量

declare number1 int default 20;
  • 一句declare只声明一个变量
  • 作用域在begin…end范围中
  • 变量具有与sql语句相同的数据类型和长度,还可以指定默认值与字符集和排序规则
  • 变量使用set赋值,也可以使用select into赋值

创建test()存储过程函数显示男和女的人数:

create procedure test()
begin
declare boys int(10);
declare girls int(10);
select count(*) into boys from student where Ssex='男';
select count(*) into girls from student where Ssex='女';
select boys,girls;
end$$

在这里插入图片描述

  • 在无参数的情况下返回变量值,可以用select语句。

2、变量的作用域

  • 一个函数可以有多个begin…end块,一个块里还可以嵌套多个begin…end块
  • 在函数父作用块中定义的变量对所有子块可用
  • 在单个begin…end块中,变量是局部变量,不能跨兄弟块使用
  • 函数传入参数属于全局变量,可以在所有块中使用

创建一个显示成年人和未成年人数量的表以及最大年龄和最小年龄的存储过程函数:

delimiter $$
create procedure age_count()
beginbegindeclare adult int;declare minor int;select count(*) into adult from student where Sage>=18;select count(*) into minor from student where Sage<18;select adult,minor;end;begindeclare age_max int;declare age_min int;select max(Sage) into age_max from student;select min(Sage) into age_min from student;select age_max,age_min;end;
end$$
delimiter ;
  • 在每个嵌套块的结尾end要加上 ; sql结尾符

在这里插入图片描述
把变量提到父begin块后,变量可以在两个块之间交换使用

drop procedure age_count;
delimiter $$
create procedure age_count()
begindeclare adult int;declare minor int;declare age_max int;declare age_min int;beginselect count(*) into adult from student where Sage>=18;select count(*) into minor from student where Sage<18;select adult,age_min;end;beginselect max(Sage) into age_max from student;select min(Sage) into age_min from student;select age_max,minor;end;
end$$
delimiter ;

在这里插入图片描述

五、存储过程参数

前面提到的函数都是没带参数的,只使用select返回结果集
函数可以带的参数分为:传入参数in 传出参数out 传入传出参数inout;

函数不指定参数类型的情况下,传进来的参数默认是in类型

drop procedure findname;
delimiter $$
create procedure findname(sno int)
begindeclare name varchar(10);select Sname into name from student where Sno=sno limit 1;select name;
end$$
delimiter ;

在这里插入图片描述

  • 使用 select into 语句赋值的时候要确保该语句只返回一条结果,或者加上 limit 1 来限制返回结果的行数
  • SQL变量名不能和列名一样

使用 out 类型的参数输出,结果应该与上题一致

drop procedure findname;
delimiter $$
create procedure findname(in sno int,out sname varchar(10))
beginselect Sname into sname from student where Sno=sno limit 1;
end$$
delimiter ;
set @name='';
call findname(2,@name);
select @name as studentname;

在这里插入图片描述

  • 这里出现了点问题没能出来暂时不深究,先留着以后再填坑

六、定义条件和定义处理的程序

定义条件:
事先定义好程序执行过程中可能遇到的问题
处理程序:
对已经定义好的问题作出相应处理,并保证存储函数在遇到警告或错误时能继续执行,避免程序异常停止工作

定义条件

declare [condition_name] condition for [错误码/错误值];
declare command_not_allowed condition for sqlstate '42000';//错误值
declare command_not_allowed condition for 42000;//错误码

处理程序

declare [handler_type] handler for [condition_name]
......

handler_type 错误处理方式
mysql提供了三个值

  • continue //不处理错误,存储函数继续往下执行
  • exit //遇到错误立即退出
  • undo //遇到错误撤销之前操作

condition_name 错误类型
condition_name 可以自定义错误类型,mysql也有自带的错误类型:

  • sqlstate_value:包含5个字符的字符串错误值;
  • condition_name:表示declare condition定义的错误条件名称;
  • SQLWARNING:匹配所有以01开头的sqlstate错误代码;
  • NOT FOUND:匹配所有以02开头的sqlstate错误代码;
  • SQLEXCEPTION:匹配所有未被SQLWARNING或NOT FOUND捕获的sqlstate错误代码;

七、流程控制

运算符

在这里插入图片描述
优先顺序
在这里插入图片描述

条件语句

(1)if语句

基本结构:

单条件语句

begin
if(...)
then......
else......end if;
end$$

多条件语句

begin
if(...)
then......
elseif(...)
then......
else ......
end if;end$$
  • if 语句需要有 end if 来结束 if 语句

判断Cno是否有空值

delimiter $$
CREATE PROCEDURE ifnull()
begindeclare flag int;select count(*) into flag from student where Cno is null;if flag is nullthen select '没有空值' as '是否有空值';else select '仍有空值' as '是否有空值';end if;
end
delimiter ;

在这里插入图片描述
在这里插入图片描述
(2)case语句

case语句可以计算多个条件式,并将其中一个符合条件的结果报答是返回

case [测试表达式]
when [测试值1] then [结果表达式1]
when [测试值2] then [结果表达式2]
when [测试值3] then [结果表达式3]
......
else [结果表达式0]
end

DROP PROCEDURE IF EXISTS testCase;
DELIMITER //
CREATE PROCEDURE testCase(OUT result VARCHAR(255))
BEGINDECLARE val VARCHAR(255);SET val = 'a';CASE val IS NULLWHEN 1 THEN SET result = 'val is true';WHEN 0 THEN SET result = 'val is false';ELSE SELECT 'else';END CASE;
END //
DELIMITER ;
set @result='';
CALL testCase(@result);本例子原文链接:https://blog.csdn.net/yanluandai1985/article/details/83689524

根据输入的课程名,添加一行课程类别

create procedure course_cate(cid varchar(10))
begin
update course set cate=
case(select cname from course where Cid=cid)
when '语文' then '文科'
when '数学' then '理科'
else 'x'
end case
end

循环语句

(3)while语句

基本结构:

beginwhile([执行条件]) do......end while;
end;

新建一个Sscore列:

alter table student add Sscore int;

随机从1~100分插入成绩,输入参数i 作为需要修改成绩的人数,使用while循环一行行修改成绩

drop procedure add_math_score();
delimiter $$
create procedure add_math_score(i int)
begindeclare n int default 0;declare score int default 0;while(n<i) dobeginset n=n+1;set score=floor(100*rand());select score ;update student set Sscore=score where Sno=n;end;end while;
end$$
delimiter ;

结果:
在这里插入图片描述

  • 修改前12人的成绩为随机数

(4)repeat语句

基本结构:

beginrepeat......until [跳出条件]end repeat;
end;

参照while的例子,结果相同

drop procedure add_math_score();
delimiter $$
create procedure add_math_score(i int)
begindeclare n int default 0;declare score int default 0;repeatbeginset n=n+1;set score=floor(100*rand());select score ;update student set Sscore=score where Sno=n;end;until n>=15end repeat;
end$$
delimiter ;
  • repeat 和 while 的区别在于两点,一是条件写的位置,while是在循环块的开头写循环条件,repeat是在结尾处写。二是条件语句,while的条件语句是为真则执行,repeat是条件语句为真时跳出。
  • repeat 的 until 哪一行不加分号 ;

(5)loop语句

基本结构:

begin[循环名称]:loop......if [跳出条件] then leave [循环条件];end if;end loop [循环条件];
end

批量添加student表数据:

drop procedure add_data();
delimiter $$
create procedure add_data(i int)
begin
declare flag int default 0;
add_loop:loop
set flag=flag+1;
if flag>i then leave add_loop;
end if;
insert into student(Sname,Sno,Cno,Ssex,Sage,Sscore) values('批量人',flag+15,1002,'男',22,100);
end loop add_loop;
end
delimiter ;

结果
在这里插入图片描述

八、游标 Cursor

游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。 游标充当指针的作用。 尽管游标能遍历结果中的所有行,但他一次只指向一行。 游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。

游标时保存查询结果的临时区域。
游标是对行集进行逐行遍历操作,循环则是重复某一组操作
使用游标时需要有的操作

  • 定义
declare stopflag int default 0;
declare [游标名] cursor for [sql查询语句];
declare continue handler for not found set stopflag=1;//使用越界标志控制循环
  • 打开
open [游标名];
  • 取值
fetch [游标名] into [变量名];
  • 关闭
close [游标名]

把student表中Sno为偶数的学生改名

create procedure change_cursor()
begin
declare student_name varchar(10);
declare stopflag int default 0;
declare name_cur cursor for select Sname from student where Sno%2=0;
declare continue handler for not found set stopflag=1;
open name_cur;
fetch name_cur into student_name;
while(stopflag=0) do
begin
update student set Sname=concat(student_name,'雨课堂') where Sname=student_name;
fetch name_cur into student_name;
end;
end while;
close name_cur;
end;
  • 游标select的字段数需要与fetch into的变量数一致

结果:
在这里插入图片描述
关于游标的用法日后会单独开一篇详解,这里不做描述
关于mysql存储过程更多的补充可以在下面链接里找到:
https://blog.csdn.net/yanluandai1985/article/details/83715441
下面是本次实验用到的数据库:
](https://img-blog.csdnimg.cn/20200216224755872.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTU4OTAzMw==,size_16,color_FFFFFF,t_70)


http://chatgpt.dhexx.cn/article/I622Rtsb.shtml

相关文章

手把手教你轻松学会数据库存储数据类型(数据库入门必看)

数据库存储数据类型 目录 数据类型 1 numeric数字类型 2 string 字符串 3 date、time、datetime日期相关类型 4 enum set 复合类型 5 bit 布尔 6 json 7 binary 二进制 1 numeric数字类型 整数&#xff1a; tinyint smallint mediumint int bigint 小数&#xff1a; …

数据库服务器硬件运行环境,数据库存储服务器必须要满足的五大基本要求你知道几个?...

原标题&#xff1a;数据库存储服务器必须要满足的五大基本要求你知道几个&#xff1f; 说到这么多数据库的重要性&#xff0c;如何选择一个可靠稳定的数据库存储服务器呢&#xff1f;我们从五个方面入手&#xff0c;帮助您了解数据库服务器的服务器硬件需求。 选择数据库服务器…

数据库的存储过程

在数据库中建立存储过程主要是能更直观对数据库的表进行一系列操作&#xff0c;如增、删、查、改等。首先在创建的数据库中找到可编程性下的存储过程&#xff0c;右键新建存储过程&#xff1a; 将PROCEDURE后面的全部去除接[dbo].[存储名称]&#xff1a; 然后接as&#xff0c;a…

带你了解数据库的存储过程

目录 一. 存储过程概述 1.1.什么是存储过程 1.2.存储过程的优缺点 二. 存储过程语法 2.1.创建存储过程 2.2.调用存储过程 2.3.删除存储过程 2.4.查看存储过程 三. 存储过程实例 四. 数据库专栏 一. 存储过程概述 1.1.什么是存储过程 存储过程&#xff08;Stored P…

postgreSql 数据库存储目录

我的PostgreSql安装目录为&#xff1a;G:\Apps\PostgreSQL 数据库文件存储在&#xff1a;G:\Apps\PostgreSQL\14\data\base 执行sql查看数据库信息&#xff1a; select oid, datname from pg_database ; --pg_database表存储关于可用数据库的信息 结果如下&#xff1a;oid对应…

Mysql数据库存储emoji表情

一、起源 我想让我的新闻评论内容能更加丰富~话不多说。 &#xff08;1&#xff09;改变Navicat中的字段的字符集 然后发现还是没办法存进去正确的emoji表情嘞。&#xff08;失败了&#xff09; &#xff08;2&#xff09;找到mysql数据库配置文件 my.ini 增加&#xff…

达梦数据库存储过程

达梦数据库简单存储过程 文章目录 达梦数据库简单存储过程一、存储过程概述语法 二、达梦数据库简单存储过程编写 一、存储过程概述 存储过程数据库系统中&#xff0c;一组为了完成特定功能的SQL 语句集&#xff0c;它存储在数据库中&#xff0c;一次编译后永久有效&#xff0…

【学习笔记】25、关系数据库存储

关系数据库存储 一、关系数据库介绍 关系型数据库&#xff0c;是指采用了关系模型来组织数据的数据库&#xff0c;其以行和列的形式存储数据&#xff0c;以便于用户理解&#xff0c;关系型数据库这一系列的行和列被称为表&#xff0c;一组表组成了数据库。用户通过查询来检索数…

数据库存储图片路径并显示到前端

数据库存储图片路径并显示到前端 -为啥不直接存图片&#xff1a;因为图片本身太大了&#xff0c;虽然存取方便了程序员&#xff0c;但对数据库不友好。所以采取存取路径&#xff0c;再根据路径解析的方法。 一、数据库表设计&#xff1a; 从以上思想出发&#xff0c;需要存图…

SQL Server数据库基础知识——数据库存储过程怎么写

SQL Server数据库基础知识 存储过程概述 什么是存储过程&#xff1f; 存储过程的种类 如何创建、修改、删除、调用存储过程&#xff1f; 存储过程的优缺点 存储过程和触发器的区别? 存储过程和函数的区别? 存储过程的使用 1. 什么是存储过程&#xff1f; 存储过程是…

GaussDB数据库存储过程介绍

文章目录 一、前言二、GaussDB中的定义三、存储过程的使用场景四、存储过程的使用优缺点五、存储过程的示例及示例解析1、GaussDB存储过程语法格式2、GaussDB存储过程语法示例3、存储过程的调用方法 七、总结 一、前言 华为云数据库GaussDB是一款高性能、高安全性的云原生数据…

查看当前数据库存储引擎

一&#xff1a;查看当前数据库支持的存储引擎 show ENGINES; 二:查看指定数据库所有表使用的存储引擎 使用 show table status from dbname;命令&#xff0c;可以查看指定数据库所有表使用的存储引擎&#xff0c;其中“dbname”为数据库名。 show table status from 库名; 三…

数据库储存Excel表信息

目录 目标 实验背景 原理 具体实现 目标 以Java程序为中介&#xff0c;将Excel表中的信息储存到Mysql数据库中 实验背景 先需要将一张包含学生和老师信息的Excel表中的数据存储到Mysql数据库中 原理 先通过相关jar包的类从Excel表中读取到信息&#xff0c;接着对这些信息…

数据库之存储

无论是什么数据库&#xff0c;其本质还是以数据的形式存储在计算机的物理介质上的&#xff0c;所以&#xff0c;我们先来看看什么是物理存储介质。 物理存储介质:高速缓冲存储器->主存储器->快闪存储器->磁盘->光盘->磁带,从左到右性能由高到低&#xff0c;价格…

数据库存储介绍

数据存储在存储设备中&#xff0c;在实际应用中&#xff0c;有多种存储设备&#xff0c;下面我们一一介绍。同时在保存数据时&#xff0c;有特定的组织方式&#xff0c;在下面我也做简单介绍。 一 存储设备介绍 1.1 高速缓存 Cache&#xff0c;计算机拥有1M或跟多的高速…

Excel|给某一列添加同一个字

如图所示给新型冠状病毒肺炎数据中“武汉”这一列都加上“市”字&#xff1a; 先在D列打两行&#xff1a;“武汉市”、“孝感市” 然后在D3按CtrlE&#xff0c;即可全部填充 ps:如果删除某列同一个字的话用替换即可

鼠标单击就选中一个字的解决办法

有时候我们想在两个字中间插入一个字&#xff0c;点击鼠标时却总是选中一个字。 解决办法&#xff1a; 按一下键盘的Insert键就好了。 造成这种情况的原因&#xff1a;极大可能是因为我们删除文字时不小心碰到了Insert键。 看完如果对你有帮助&#xff0c;感谢点赞支持&…

什么是字节

** 什么是字节 ** 位&#xff08;bit&#xff09;:是计算机 内部数据 存储的最小单位 11001100是一个八位数的二进制数。 字节&#xff08;byte &#xff09;&#xff1a;是计算机中 数据处理的基本单位&#xff0c;习惯上用大写B来表示&#xff1b; 1B&#xff08;byte,字节…

关于“一个字等于多少字节?“的问题解答

网上有人说这个问法不严谨&#xff0c;我觉得严格说确实是这样&#xff0c;但是我个人觉得不能这样说&#xff01; 举个例子&#xff0c;这个问题就好比你上初中的时候那些证明题很多其实是很不严谨的&#xff0c;但是限于知识体系&#xff0c;到高中你会发现好像不是那么一回…

键盘打字时,打一个字后面少一个字如何解决

键盘敲字时&#xff0c;如果光标在中间&#xff0c;输入一个字后面就少一个字 文字输入的例子 只需要按INS键就可以恢复正常了 注&#xff1a;如果是手提笔记本电脑&#xff0c;一个键盘有两下两行&#xff0c;先按一下FN按键&#xff0c;再按INS即可切换为正常状态了