Mysql存储过程和游标的一点理解

news2024/11/17 12:33:16

最近学习数据库语言sql,学到了存储过程和游标这一块,上课一点没听,可以说是全程懵逼。不过好在有个课后的实验,然而cmd中的报错往往极其粗糙,只会告诉你什么附近有错(有时候还是错的),在不知error了多少次,破防多少次之后终于完成了老师的任务,觉得有必要写一篇记录一下。

全程cmd深空黑背景,胆小勿入。

首先先给出我自己定义的表的结构:

 简单介绍一下,这是一张员工信息表,empno就是员工号,ename员工姓名,job就是工作名,heredate工作时间,salary是薪资,comm是补贴,deptno是单位号,mgr是上司员工号。数据都是乱凑的,请勿当真。

存储过程在我理解来其实就是编程语言里面常说的函数,了解过其他语言的同学对于函数不会陌生,不过这个名字是真的高大上,本质就是把值传进去,然后计算好把值传出来。

下面直接贴出一道真题:

这道题就是根据输入empno然后你写一个存储过程,然后在其中计算号年收入,然后把答案输出。思路非常简单,就是根据员工号找到对应员工然后找到他的月薪和补贴(我就当做是每月补贴了),乘以一年的数量就是一年收入。

那么问题来了,该怎么写这个存储过程?存储过程的关键字是precedure,我们create一个新的precedure,然后前面说了存储过程就是函数,你得给他要算的人,所以把参数列表里面的empno前面加上一个in,表示是输入,因为你还要把值输出的,sql里面有没有return我不知道,但是我可以把参数列表里面的变量标记为out,表示输出,类似于其他语言的引用传参,如下;

create procedure cal_all_salary(in empno_in int,out all_salary double)
begin
    过程体
end

 cal_all_salary就是这个过程的名字,empno_in前面有了一个in,表示是输入,all_salary前面有个out,表示是输出,当然这个参数是需要你自己传进来的,然后begin和end就是过程的开始和结束的标志。

过程中要怎么写,无非就是把all_salary重新赋值,需要用到select...into变量from...方法,这个变量就是所需要赋值的。

select (comm+salary)*12 into all_salary from eemp where empno=empno_in;

当然这还不是一个完整的,因为还要涉及到过程的结束开始符,完整如下:

drop procedure if exists cal_all_salary;
delimiter //
create procedure cal_all_salary(in empno_in int,out all_salary double)
begin
select (comm+salary)*12 into all_salary from eemp where empno=empno_in;
end;
//
delimiter ;

因为是用记事本写的,所以也没啥缩进,格式也比较拉胯。第一句主要是为了避免名称重复,有重复就覆盖掉。delimiter 字符串表示把这个字符串作为结束符,我自己用//比较多,这是为了避免跟过程体内的 ; 搞混而设置的。

然后测试,可以利用set @变量名来定义一个变量:

set @ans=0;
cal_all_salary(1,@ans);
select @ans;

 效果:

所以说存储本身就是为了完成一个特定的任务,把完成这个任务的方法存储起来,因此功能性也比较明确,方便了数据库的管理。

接下来是游标。游标在我觉得就是循环,把符合条件的打包成一个集合,然后一个个取出来判断,进行计算。

游标的使用格式如下:(抄了别人的)

DECLARE 迭代变量名1
.
.
.
DECLARE 游标名字 CURSOR FOR 查询语句;
open 游标名
while/repeat..
fetch 游标名 into var_name...
close 游标名

大致就是上面几个步骤。首先我先把有用的几个属性打包起来放进游标内,格式就是{[属性1,属性2...],[属性1,属性2...]...},每一个游标指向一行,有着多个属性的值,然后我利用循环一条一条取出来然后去做我想做的事情。这里的fetch就是取值,然后分别赋值给对应的变量。需要注意的就是打开和关闭。

最后贴一道题:

代码如下,应该是正确实现了的

 

drop procedure if exists avg_from_dept;
delimiter //
create procedure avg_from_dept(in dept_code int,out ans double)
begin
declare now_salary double;
declare no_data int default 0;
declare sum double default 0;
declare dept_cursor cursor for select salary from eemp where deptno=dept_code;
declare exit handler for not found set no_data = 1; 
open dept_cursor;
repeat
fetch dept_cursor into now_salary;
set sum=sum+now_salary;
set ans=sum/(select count(*) from eemp where deptno=dept_code);
until no_data=1
end repeat;
close dept_cursor;
end;
//
delimiter ;

set @dept_in=1;
set @ans=0;
call avg_from_dept(@dept_in,@ans);
select @ans;

都是记事本写的,格式很差...

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

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

相关文章

大一新生HTML期末作业 个人旅游图片博客HTML5 用DIV+CSS技术设计的个人网站(web前端网页制作课作业)

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

Centos7安装部署openLDAP并springboot集成openLDAP

这里安装部署都是基于docker的,供参考 安装docker 1、yum list docker 2、yum install -y yum-utils device-mapper-persistent-data lvm2 3、yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 4、yum install do…

斐波那契数列的矩阵乘法方法

1、求斐波那契数列矩阵乘法的方法 1.1 斐波那契数列的线性求解&#xff08;O(n)O(n)O(n)&#xff09;的方法 //斐波那契数列&#xff1a;1 1 2 3 5 8 ... int fibonacci(int n) {if (n < 1) return 0;if (n 1 || n 2) return 1;int a 1, b 1, c 0;for (int i 3; i &…

K_A08_002 基于 STM32等单片机驱动MAX1508模块按键控制直流电机正反转加减速启停

目录 一、资源说明 二、基本参数 1、参数 2、引脚说明 3、驱动说明 MAX1508模块驱动时序 对应程序: PWM信号 四、部分代码说明 接线说明 1、STC89C52RCMAX1508模块 2、STM32F103C8T6MAX1508模块 五、基础知识学习与相关资料下载 六、视频效果展示与程序资料获取 七、项目…

[附源码]计算机毕业设计springboot校园生活服务平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

PowerBI工作区连接Log Aanlytics

其实在2021.6月的时候微软已经更新了该功能&#xff0c;通过PowerBI高级容量工作区连接Log Analytics工作区&#xff0c;从而分析历史活动数据。并且在应用市场创建了一个模板应用方便分析日志数据。使用该模板可以&#xff1a; • 观察历史使用趋势 • 按照范围、容量、数据集…

常用通讯电平转换电路整理

常用通讯电平转换电路整理5V转3.3V 当5V端信号为低电平时&#xff0c;R4不导通&#xff0c;Q5基极高电平&#xff0c;Q5导通&#xff0c;Q5的集电极被拉低&#xff0c;3.3V端被拉低。R6在Q5导通时起到限流作用。 优势&#xff1a; 便宜&#xff1a;三极管容易常见并且容易采购&…

LOLBins免杀技术研究及样本分析

一、前言 自病毒木马诞生起&#xff0c;杀毒软件与病毒木马的斗争一直都没有停止过。从特征码查杀&#xff0c;到现在的人工智能查杀&#xff0c;杀毒软件的查杀技术也是越来越复杂。但是病毒木马却仍然层出不&#xff0c;这是因为大部分病毒木马使用了免杀技术。 免杀技术全称…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校教师工作量的核算的设计与实现g6ipj

大学计算机专业毕业的&#xff0c;实际上到了毕业的时候&#xff0c;基本属于会与不会之间。说会&#xff0c;是因为学了整套的理论和方法&#xff0c;就是所谓的科班出身。说不会&#xff0c;是因为实践能力极差。 不会的问题&#xff0c;集中体现在毕设的时候&#xff0c;系…

2023年天津天狮学院专升本市场营销专业《市场营销学》考试大纲

2023年天津天狮学院高职升本市场营销专业入学考试《市场营销学》考试大纲一、考试性质 《市场营销学》专业课程考试是天津天狮学院市场营销专业高职升本入学考试的必考科目之一&#xff0c;其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《市场营销学》…

【图像分割】DeepLabV3+

文章目录0. 介绍1. DeepLabV32. 结论3. 参考0. 介绍 DeepLabV3文章&#xff1a;https://arxiv.org/pdf/1802.02611.pdf DeepLabV3代码&#xff1a;https://github.com/VainF/DeepLabV3Plus-Pytorch 语义分割的两个主要问题&#xff1a; 物体的多尺度问题。多次下采样会造成特…

ABAP 计算时间差

源码 FUNCTION zfm_date_difference. *“---------------------------------------------------------------------- "“本地接口&#xff1a; *” IMPORTING *” VALUE(IV_DATE_BEG) TYPE SY-DATUM *" VALUE(IV_TIME_BEG) TYPE SY-UZEIT *" VALUE(IV_DATE_END)…

【赛后总结】第十三届服务外包创新创业大赛总结——A14

目录前言组队&#xff06;选题分工&项目推进提交材料&项目答辩区域赛初赛区域赛决赛全国总决赛写在最后前言 先摆两个参赛视频 初赛视频 决赛视频 比赛已经过去几个月了&#xff0c;也算是想起来这个比赛可以写一个总结了。在历时8个月左右的时间之后&#xff0c;我们…

香菇多糖-四甲基罗丹明 Lentinan-TRITC 四甲基罗丹明-PEG-香菇多糖

香菇多糖-四甲基罗丹明 Lentinan-TRITC 四甲基罗丹明-PEG-香菇多糖 中文名称&#xff1a;香菇多糖-四甲基罗丹明 英文名称&#xff1a;Lentinan-TRITC 别称&#xff1a;生物素修饰香菇多糖&#xff0c;生物素-香菇多糖 香菇多糖-聚乙二醇-四甲基罗丹明 TRITC-PEG-Lent…

[附源码]计算机毕业设计JAVA校园新闻管理系统

[附源码]计算机毕业设计JAVA校园新闻管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析

前言 集成ijkplayer&#xff0c;需要执行脚本init-ios.sh&#xff0c;那么init-ios.sh脚本干嘛用的了,花了半天时间&#xff0c;学习了下shell脚本&#xff0c;感觉脚本语言学起来还是比较容易上手的&#xff0c;现在仅仅能看懂了&#xff0c;但是要自己写&#xff0c;还需要花…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校学生社团管理系统n4pcu

要开始我们毕业设计的第一步的关键就是选好我们的课题&#xff0c;有的同学开始选题的时候想着按照传统的课题延续下去&#xff0c;在设计题目时&#xff0c;不要过于笼统广泛&#xff0c;选择题目其实并不难&#xff0c;要多从自身的角度出发&#xff0c;要结合你们当前所处的…

VTK网格细分-vtkAdaptiveSubdivisionFilter

欢迎大家加入社区&#xff0c;雪易VTK社区-CSDN社区云 前言&#xff1a;此博文主要分享VTK中关于细分网格的相关Filter&#xff0c;同时希望能给其他小伙伴一些帮助。 小结&#xff1a;VTK中关于网格细分的Filter包括vtkSubdivisionFilter和vtkAdaptiveSubdivisionFilter。其…

【服务器数据恢复】EMC Unity存储误操作删除数据卷的数据恢复案例

服务器数据恢复环境&#xff1a; EMC Unity某型号存储&#xff1b; 存储设备连接的2台硬盘柜上共创建2组独立的POOL&#xff1b; 2组POOL共包含21块520字节的硬盘。 服务器故障&检测&#xff1a; 误操作删除了2组POOL上的部分数据卷&#xff0c;和用户沟通后得知有5个数据…

Linux学习记录——사 权限与工具

目录的权限 想要进入一个目录&#xff0c;必须有x权限。对于目录来讲&#xff0c;r权限代表着可以查看当前目录下的文件名属性&#xff0c;w权限代表着可以在该目录下创建新文件。 默认权限 现在创建一个目录和文件 创建普通文件时&#xff08;不包括可执行&#xff09;&…