首页 > 数据库 >MySQL存储过程

MySQL存储过程

时间:2024-07-27 17:28:08浏览次数:13  
标签:存储 end 变量 -- MySQL 游标 sql 过程

目录

介绍

特点

创建

调用

查看

删除

变量

查看系统变量

设置系统变量

注意:

用户定义变量

赋值

使用

局部变量

声明

赋值

if

参数

用法:

case

while

repeat

loop

游标

条件处理程序


介绍
存储过程是事先经过编译并存储在数据库中的一段sql语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。
存储过程思想上很简单,就是数据库sql语言层面的代码封装与重用。
特点
封账,复用
可以接收参数,也可以返回数据
减少网络交互,效率提升
创建
create procedure 存储过程名称([参数列表])
begin
        -- sql语句
end;
调用
call 名称([参数]);
查看
select * from information_schema.routines where routine_schema = 'xxx'  --  查询指定数据库的存储过程及状态信息
show create procedure 存储过程名称; 查询某个存储过程定义
删除
drop procedure [if exists] 存储过程名称;

注意:在命令行中,执行创建存储过程的sql ,需要通过关键字delimiter指定sql语句的结束符。

变量
系统变量是mysql服务器提供,不是用户定义的,属于服务器层面。分为全局变量(global)、会话变量(session).
查看系统变量
show [session | global] varlables;   -- 查看所有系统变量
show [session | global] varlables like '.....'; -- 可以通过like模糊匹配方式查找变量
select @@[session | global] 系统变量名; -- 查看指定变量的值
设置系统变量
set [session | global] 系统变量名 = 值;
set [session | global] 系统变量名 = 值;
注意:
如果没有指定session/global,默认是session,会话变量。
mysql服务重新启动之后,所设置的全局参数会失效,想要不失效,可以再/etc/my.cnf中配置
用户定义变量
用户定义变量 是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 "@变量名" 使用就可以。其作用域为当前连接。
赋值
set @var_name= expr [,@var_name = expr]...;
set @var_name :=expr[,@var_name :=expr]...;
​
select @var_name := expr[,@var_name :=expr]....;
select 字段名 into @var_name from 表名;
使用
select @var_name;

注意: 用户定义的变量无需对其进行声明或初始化,只不过获取到的值为null.

局部变量
局部变量 是根据需要定义的在局部生效的变量,访问之前,需要declare声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的Begin ... end块。
声明
declare 变量名变量类型 [default.....];
变量类型就是数据库字段类型:int、bigint、char、varchar、date、time等。
declare stu_count int default 0;
赋值
set 变量名 = 值;
set 变量名: = 值;
select 字段名 into 变量名 from 表名...;
if
语法:
if 条件1 then
        .....
elself 条件2 then     ... 可选      
         .....
else                  ... 可选
        .....    
end if;
 
参数

用法:
create procedure 存储过程名称 ([in/out/inout 参数名 参数类型])
begin
        -- sql语句
end;
case
语法一
Case case_value
        when when_value1 then statement_list1
        [when when_value2 then statement_list2]....
        [else statement_list]
end case;
语法二
 case
    when search_condition1 then statement_list1
    [when search_condition1 then statement_list1]....
    [else statement_list]
 end case;
while
while 循环是有条件的循环控制语句。满足条件后,在执行循环体中的sql语句。具体语法为:
#先判定条件如果条件为true,则执行逻辑,否则,不执行逻辑
while 条件 do
    sql 逻辑....
end while; -- 每一个这里都有结束标志
repeat
repeat是有条件的循环控制语句,当满足条件的时候退出循环。
# 先执行一次逻辑,然后判断逻辑是否满足,如果满足,则退出,如果不满足,则继续下一次循环
repeat
        sql 逻辑
        until 条件
end repeat;
loop
loop实现简单的循环,如果不在sql逻辑中增加退出循环的条件,可以用其来实现简单的死循环。loop可以配合一下两个语句使用:
    leave:配合循环使用,退出循环。
    iterate: 必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。
[begin_label:] LOOP
    sql逻辑....
end loop [end_label];
leave label; -- 退出指定标记的循环体
iterate label; -- 直接进入下一次循环
游标
游标(cursor)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、open、fetch和close,
声明游标
declare 游标名称 cursor for 查询语句; // 变量要定义在游标前面,异常要定义在后面
打开游标
open 游标名称;
获取游标记录
fetch 游标名称 into 变量[,变量];
关闭游标
close 游标名称;
条件处理程序
条件处理程序 (handler) 可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。

create procedure p6(in uage int) -- 这两个变量的名字还不能起一样的
begin
​
    declare uname varchar(200);
    declare usex varchar(200);
    declare u_cursor cursor for select name,gender from user where age <= uage;
    declare exit handler for sqlstate '02000' close u_cursor;
    -- declare exit handler for not found close u_cursor; 这两句都是可以的,主要用来结束循环的
    drop table if exists tb_user;
    create table tb_user(
      id int primary key auto_increment,
      name varchar(100),
      gender varchar(100)
    );
​
    open u_cursor;
​
    while true do
            fetch u_cursor into uname,usex;
            insert into tb_user value (null,uname,usex);
        end while;
​
    close u_cursor;
end;

标签:存储,end,变量,--,MySQL,游标,sql,过程
From: https://blog.csdn.net/weixin_42376775/article/details/140734964

相关文章

  • 1251 - Client does not support authentication protocol requested by server; cons
    错误记录:1251-Clientdoesnotsupportauthenticationprotocolrequestedbyserver;considerupgradingMySQLclient错误原因:mysql8之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password。解决方案:解决:①升级navicat驱动;②......
  • mysql安装以及多实例
    mysql安装启动----------------------------------------1.安装全流程yum源码编译rpm包装和卸载如何处理依赖关系都是要掌握的技能这里是,二进制解压即用#确认时间正确[root@tech-db-51/opt]#crontab-l*****ntpdate-untp.aliyun.com1.准备好包[root@......
  • PHP 之腾讯云对象存储生成临时地址
    一、代码示例/***生成cos签名*@paramstring$httpURI你的url地址,如:https://xxxx.com/123/23/test.png*@paramstring$expires有效时间分钟*@paramstring$headerList*@paramstring$urlParamList*@paramstring$httpParameters*@paramstring$htt......
  • MySQL索引
    索引的引入在数据库表中,查询某条数据记录通常就是遍历,遍历表中所有的数据,然后一条一条比对,因此注定它是O(N)的时间复杂度。由于数据库的数据是存储在磁盘上的,必然要进行大量IO数据的读取,冯诺依曼体系告诉我们,对磁盘数据的读取效率是远低于与内存中数据的,尽管存在局部性原理,O(N......
  • 计算机组成与体系结构-层次化存储体系
    将数据分为多个层次进行存储,以最优的控制调度算法和合理的成本,构成具有性能可接受的存储系统.解决两个矛盾采用层次化存储体系,可以通过平衡存储介质的速度和成本得到最佳的存储效用。解决了主存容量不足与高成本的矛盾、CPU与主存速度不匹配的矛盾存储器分类RAM,随机存取存......
  • 在 FastAPI 中更改来自 MySQL 的数据类型输入
    我的这一行有“serialize_response”错误:@app.get("/get-sensors/",response_model=List[Data])和这个:return{"status":"success","list":data}我该如何解决这个问题!我想获取字典类型的数据为了解决在FastAPI中更改来自MySQL的数据类型输入时遇到的......
  • Starlette SessionMiddleware 将会话数据存储在服务器上还是客户端上?
    我正在开发一个无状态FastAPI应用程序。身份验证通过GoogleOAuth(openid电子邮件配置文件范围)进行处理。我正在使用Authlib,它使用SessionMiddleware(request.session)来存储临时代码和状态。现在,我想使用令牌限制对某些端点的访问。为此......
  • MySQL索引详解full-text,b-tree,hash,r-tree
    一、MySQL索引类型mysql里目前只支持4种索引分别是:full-text,b-tree,hash,r-treeb-tree索引应该是mysql里最广泛的索引的了,除了archive基本所有的存储引擎都支持它.1.full-text索引full-text在mysql里仅有myisam支持它,而且支持full-text的字段只有char、varchar、text数据类型......
  • 在Pandas中 SQL操作:SQLAlchemy和PyMySQL的区别
    SQLAlchemy和PyMySQL的区别1.SQLAlchemy和PyMySQL简介SQLAlchemy是Python编程语言下的一款开源软件。它提供了SQL工具包和对象关系映射器(ORM)来进行数据库操作。SQLAlchemy可以与多种数据库系统进行交互,包括MySQL、PostgreSQL、SQLite等。PyMySQL是Python编程语言下的一个纯Pyt......
  • mysqldump: Got error: 1066: Not unique table/alias: 'act_evt_log' when using LOC
    先说解决办法:执行下面语句mysqldump-ushooter-p123123--single-transactionfd>fd.sql  lower_case_table_names区分大小写设置注意:此参数不可以动态修改,必须重启数据库 12341、参数含义:lower_case_table_names=1  表名存储在磁盘是小写的,但是比......