实训七:存储过程与触发器 - 数据库实验 存储过程

news2024/10/7 14:29:01

数据库实验 存储过程

  • 第1关:建立和调用存储过程(不带输出参数的存储过程)
    • 任务描述
    • 任务要求
      • 建立存储过程
      • 调用过程
    • 相关知识
      • 建立存储过程
      • 设置语句结束符
      • 参数列表
      • 声明局部变量
      • 显示表达式的值
    • 代码参考
  • 第2关:建立和调用存储过程(带输出参数)
    • 任务描述
    • 任务要求
      • 建立存储过程
      • 调用过程
    • 相关知识
      • 参数列表
      • 调用存储过程
      • case多分支语句
    • 参考代码
  • 第3关:建立和调用存储函数
    • 任务描述
    • 任务要求
      • 建立存储过程
      • 调用过程
    • 相关知识
      • 存储函数定义
      • 调用存储函数
    • 参考代码
  • 第4关:修改多个数据表的存储过程
    • 任务描述
    • 任务要求
      • 建立存储过程
      • 调用过程
    • 参考代码
  • 第5关:使用游标的存储过程
    • 任务描述
    • 任务要求
      • 建立存储过程
      • 调用过程
    • 相关知识
      • 声明游标
      • 打开和关闭游标
      • 读取游标信息
      • 遍历游标
    • 代码参考

第1关:建立和调用存储过程(不带输出参数的存储过程)

任务描述

本关任务:
该实验是针对数据表jdxx,该数据表有四个字段,分别是省份(sf)、城市(cs)、区县(qxmc)、街道(name)。
例如,查询天心区(qxmc)的所有字段的值结果如图所示
,

任务要求

建立存储过程

dqxx(in city varchar(10),in district varchar(10))
输入城市city和区县district的名称,显示乡x、镇z和街道jd、其他的个数
提示:即name字段含有乡、镇、街道及不包含上述选项的个数

调用过程

以长沙市和开福区为参数,调用dqxx过程
以厦门市和同安区为参数,调用dqxx过程

例如,以长沙市和岳麓区为参数,调用过程显示结果如下
乡 街道 镇 其他
1 9 1 0

相关知识

建立存储过程

命令格式:

CREATE PROCEDURE sp_name ( [proc_parameter] )
BEGIN    
过程体
END

设置语句结束符

注意:
DELIMITER //
在过程体前面使用DELIMITER 符号命令将其他符号(不是分号)作为语句结束符,从而使服务器可以完整地处理过程体中所有的sql语句。
DELIMITER ;
在过程结束后将语句结束符变为;

参数列表

([in|out|inout proc_name type][,in|out|inout proc_name type])
过程可以没有参数或多个参数,多个参数之间用逗号分隔
IN输入参数,使数据可以传递给存储过程
OUT输出参数,用于需要返回结果
INOUT输入输出参数 既可以充当输入参数也可以充当输出参数

声明局部变量

DECLARE 局部变量名 类型 [default 默认值]
过程体中使用的局部变量,必须在存储过程的开头处声明

显示表达式的值

SELECT 表达式 [as 列名]
计算并显示表达式的值


开始你的任务吧,祝你成功!

代码参考

 use province;
 #代码开始
 #定义过程
delimiter //
create procedure dqxx(in city varchar(10) , in district varchar(10))
begin
declare x int;
declare z int;
declare jd int;
declare qt int;
select count(*) from jdxx where name like '%乡' and cs =city and qxmc=district into x;
 #调用过程
select count(*) into jd from jdxx where name like '%街道' and cs=city and qxmc=district;
select count(*) into z from jdxx where name like '%镇' and cs=city and qxmc=district;
select count(*) into qt from jdxx where name not like '%乡' and name not like '%街道' and name not like '%镇' and cs=city and qxmc=district;
select x as '乡',jd as '街道' , z as '镇' ,qt as '其他';
end 
//
delimiter ;
call dqxx('长沙市','开福区');
call dqxx('厦门市','同安区');

 #代码结束

第2关:建立和调用存储过程(带输出参数)

任务描述

本关任务:
销售数据库有工作人员、销售单数据表
工作人员gzry数据表有雇员号gyh、姓名gyxm、出生日期csrq、学历xl、工资gz、部门bm、电话dh字段
,

销售单xsd数据表有销售单号xsdh、会员号hyh、雇员号gyh、销售日期xsrq、应付款yfk、实际付款sjfk字段
,

任务要求

建立存储过程

ygyj(in nf int,in yf int,in xm varchar(10) out pj varchar(10))
输入年份nf和月份yf和姓名xm ,输出对该工作人员的评价pj
若该员工在指定年份和月份的销售业绩(销售单xsd的实际付款sjfk的合计)大于等于10000元,则返回优秀,大于等于5000元,则返回达标,大于0小于5000元返回不达标,若没有销售单则返回无业绩。

调用过程

以2015、7和王雅静为参数,调用ygyj过程,将结果存入@yj1
以2015、6和廖秉娴为参数,调用ygyj过程,将结果存入@yj2
以2015、7和赵敏为参数,调用ygyj过程,将结果存入@yj3
以2015、7和章伟为参数,调用ygyj过程,将结果存入@yj4

相关知识

参数列表

([in|out|inout proc_name type][,in|out|inout proc_name type])
过程可以没有参数或多个参数,多个参数之间用逗号分隔
IN输入参数,使数据可以传递给存储过程
OUT输出参数,用于需要返回结果
INOUT输入输出参数 既可以充当输入参数也可以充当输出参数

调用存储过程

CALL 存储过程(参数列表)
当有out参数时,可以用全局变量接收结果
全局变量以@开头,在mysql会话中一直有效

case多分支语句

CASE
WHEN   <条件1> THEN  <语句1>
WHEN   <条件2>   THEN <语句2>
……
[Else  <其他语句>]
END CASE 

开始你的任务吧,祝你成功!

参考代码

 use sale;
 #代码开始
 #定义过程
delimiter $
create procedure ygyj(in nf int,in yf int,in xm varchar(10) ,out pj  varchar(10))
begin
declare yj real;

select sum(sjfk) from xsd,gzry where xsd.gyh=gzry.gyh and year(xsrq)=nf and month(xsrq)=yf and gyxm=xm into yj;
case
when yj is null then set pj='无业绩';
when yj <5000 then set pj='不达标';
when yj <10000 then set pj='达标';
else set pj='优秀';
end case;

end 
$
delimiter ;

 #调用过程
call ygyj(2015,7,'王雅静',@yj1);
call ygyj(2015,6,'廖秉娴',@yj2);
call ygyj(2015,7,'赵敏',@yj3);
call ygyj(2015,7,'章伟',@yj4);


 #代码结束
 select @yj1,@yj2,@yj3,@yj4;

第3关:建立和调用存储函数

任务描述

本关任务:
销售数据库有顾客、销售单数据表
顾客gk数据表有会员号hyh、姓名name、性别sex、电话tel、部门dept字段
,

销售单xsd数据表有销售单号xsdh、会员号hyh、雇员号gyh、销售日期xsrq、应付款yfk、实际付款sjfk字段
,

任务要求

建立存储过程

gkjb(nf int, xm varchar(10) )
输入年份nf和姓名xm ,返回该会员的等级。
若该顾客在指定年份的消费金额(销售单xsd的实际付款sjfk的合计)大于等于10000元,则返回超级vip,大于等于5000元,则返回vip,大于0小于5000元返回一般会员,若没有销售数据则返回非会员。

调用过程

通过select查询所有顾客数据表的姓名和2015年的顾客级别,结果如下所示
,

相关知识

存储函数定义

存储函数由sql语句和过程语句组成的代码片段
可以定义输入参数(无需使用in),没有输出参数。
begin前通过returns <数据类型>语句指定返回值类型
在函数体中通过return返回值

CREATE FUNCTION func_name ( [func_parameter] )
Returns <返回参数类型>
BEGIN    
函数体
return 返回值
END

如果开启了 bin-log, 必须在begin之前指定一个参数DETERMINISTIC

调用存储函数

select 存储函数(参数列表)[as 列名]
可通过select语句调用并显示函数


开始你的任务吧,祝你成功!

参考代码

use sale;
#代码开始
delimiter $$
create function gkjb(nf int, xm varchar(10))
    returns varchar(10)
DETERMINISTIC
begin
    declare jg int;
    declare pj varchar(10);
    select sum(sjfk)
    from xsd join gk on gk.hyh = xsd.hyh 
    where name = xm and year(xsrq) = nf into jg;
        case
        when isnull(jg) then
        set pj = "非会员";
        when jg < 5000 then
        set pj = "一般会员";
        when jg < 10000 then
        set pj = "vip";
        else set pj = "超级vip";
        end case;
    return pj;
end $$
delimiter ;
select name 姓名, gkjb(2015, name) 等级 from gk;
#代码结束

第4关:修改多个数据表的存储过程

任务描述

本关任务:
图书管理数据库有读者reader图书book借阅数据表
读者表reader有读者证号dzzh、姓名xm、性别xb、身份sf、电话号码dhhm字段
读者数据表数据

图书表book有条形码txm、书名sm、分类号flh,作者zz,出版社cbs,出版日期cbrq,售价sj,典藏类别dclb,在库zk,币种bz字段
图书

借阅表borrow有借阅编号jyid、读者证号dzzh、条形码txm、借阅日期jyrq、还书日期hsrq五个字段。
当读者借阅图书时,在借阅数据表中添加一条记录,还书日期设置为NULL,图书的在库zk字段被设置为0.
当读者归还图书时,将其对应借阅记录的还书日期设置为指定日期,并修改图书的在库zk字段为1.
借阅

任务要求

建立存储过程

hs(in sh varchar(8), in dzbh varchar(3) ,in rq date,out zt varchar(12) )
输入图书条形码sh、读者证编号dzbh和还书日期rq,办理还书。
检查借阅数据表是否有此记录(条形码txm为sh读者dzzh为dzbh,且还书日期hsrq是否为null,若没有则zt返回"没有该借阅",否则在借阅表将该借阅记录的还书日期改为rq。
并将图书数据表该图书的在库zk改为1,zt返回"成功还书".

调用过程

分别以下列参数调用过程,并将结果返回@zt1、@zt2
书号P0000001和读者证号001,还书日期2022-5-1
书号P0000001和读者证号002,还书日期2022-5-1


开始你的任务吧,祝你成功!

参考代码

use library;
#代码开始
delimiter $$
create procedure hs(in sh varchar(8), in dzbh varchar(3), in rq date, out zt varchar(12))
begin
    declare jywh int;
    select count(*) from borrow where txm=sh and dzzh=dzbh and isnull(hsrq) into jywh;
    if jywh=0 then
        set zt = "没有该借阅";
    else
        update borrow set hsrq=rq where dzzh=dzbh and txm=sh and isnull(hsrq);
        update book set zk=1 where txm=sh;
        set zt = "还书成功";
    end if;
end $$
delimiter ;
call hs("P0000001", "001", "2022-5-1", @zt1);
call hs("P0000001", "002", "2022-5-1", @zt2);
#代码结束
select @zt1,@zt2;
select txm, sm, zk from book;
select * from borrow;

第5关:使用游标的存储过程

任务描述

本关任务:
jdxx数据表有四个字段,分别是省份(sf)、城市(cs)、区县(qxmc)、街道(name)。
例如,查询天心区(qxmc)的所有字段的值结果如图所示
,

任务要求

建立存储过程

tjdq(in sf varchar(10))
输入省份的名称,将该省份所有城市的所有地区的
x、镇z和街道jd和其他的个数插入到数据表dqtj中。
dqtj数据表已经建立在数据库中,有城市(cs),区县名称(qxmc)、县(x)、街道(jd)、镇(z)、其他(qt)六个字段。分别存储指定省份的城市、区县名称和县、街道、镇、其他的个数。
以湖南省为参数,调用tjdq过程后
dqtj数据表部分数据如图所示
,

调用过程

以安徽省为参数,调用过程

提示:该过程先要删除dqtj数据表的所有数据
然后将指定省份的城市和区县的唯一信息值存入游标
然后将游标的各条信息依次取出循环,根据游标中的城市和区县名称,在jdxx数据表查出对应的乡、街道、镇和其他的个数,然后插入到dqtj数据表。

相关知识

声明游标

命令格式:
DECLARE 游标名 CURSOR FOR select语句

打开和关闭游标

命令格式:
open 游标名
close 游标名

读取游标信息

命令格式:
FETCH 游标名 INTO var1,var2[,…]
将游标声明时的查询结果逐条存放在变量中
每执行一次fetch将指针指向下一条结果
变量必须在声明游标前定义

遍历游标

,


开始你的任务吧,祝你成功!

代码参考

 use province;
delimiter $$
 #代码开始
create procedure  tjdq(in sfm varchar(10)) 
begin 
    declare n,m,x1,jd1,z1,qt1 int;
	declare flag int default 1;
    declare cs1,qxmc1 char(30)  charset  utf8;
    declare  rs cursor  for
    select distinct cs,qxmc from jdxx where sf=sfm; /* 同一个省份中同一个市有很多不同的区和街道,当有很多相同的值时要取distinct */
    declare continue handler for not found set flag = 0;
    DELETE FROM dqtj;
	open  rs; /*按循环将数据插入表中。*/
    fetch rs into cs1,qxmc1;
    while flag=1 do
        select count(*) from jdxx  where cs=cs1 and qxmc=qxmc1 and name like '%乡' into x1;
        select count(*) from jdxx  where cs=cs1 and qxmc=qxmc1 and name like '%街道' into jd1;
        select count(*) from jdxx  where cs=cs1 and qxmc=qxmc1 and name like  '%镇' into z1;
        select count(*) from jdxx  where cs=cs1 and qxmc=qxmc1 and name not like '%乡' and name not like '%街道' and name not like '%镇' into qt1;
        insert into dqtj(cs,qxmc,x,jd,z,qt) values(cs1,qxmc1,x1,jd1,z1,qt1);
        fetch rs into cs1,qxmc1;
    end while;
    close rs;
end $$
delimiter ;
call tjdq('安徽省');
 #代码结束
 select * from dqtj;

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

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

相关文章

小程序 快速配置https服务接口 - 项目是nodeJS配置本地https服务,不用下载源码不用付费,直接使用Git的openssh功能(亲测有效)

背景 学习网易云音乐小程序开发&#xff0c;用了老师的node JS做后端服务器&#xff0c;上线小程序体验版必须要https接口。 接下来就是配置NodeJs服务https踩的坑跟发现的惊喜。 配置https 下载与配置 密钥生成 1 运行命令 &#xff1a; openssl genrsa -out privatekey.p…

【Pyecharts】| 风电场运维可视化系统 | 文末送书

目录 一. &#x1f981; 摘要二. &#x1f981; 文章结构三. &#x1f981; 所用开发工具与相关技术3.1 PyCharm3.2 Flask3.3 Pyecharts3.4 Jinja2 四. &#x1f981; 设计与实现4.1 系统总体需求4.1.1 数据采集和处理4.1.2 可视化设计4.1.3 后台功能实现 4.2 系统用户模块的实…

「小产品独立变现实战训练营1期」正在进行中

本次训练营共3周&#xff0c;目前正在进行中的第2周&#xff0c;同学正在认真完成作业&#xff0c;跟随教学视频和产品源码进行学习。 大家好&#xff0c;我是凯凯刘&#xff0c;一名程序员&#xff0c;一直在做小产品的开发变现&#xff0c;目标就是让小产品的变现更简单。【小…

认识异常

目录 异常的概念与体系结构 异常的概念 异常的体系结构 异常的分类 异常的处理 防御式编程 1. LBYL: 2. EAFP: 异常的抛出 异常的捕获 异常声明throws try-catch捕获并处理 关于异常的处理方式 finally 异常的处理流程 自定义异常类 异常的概念与体系结构 异常…

【吃透网络安全】2023软考网络管理员考点网络安全(五)包过滤等多种防火墙详解

涉及知识点 什么是包过滤防火墙、应用层网关防火墙、状态监测防火墙&#xff1f;包过滤防火墙的概念及定义&#xff0c;包过滤防火墙、应用层网关防火墙的优缺点&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 后…

深入理解深度学习——BERT派生模型:ALBERT(A Lite BERT)

分类目录&#xff1a;《深入理解深度学习》总目录 预训练语言模型的一个趋势是使用更大的模型配合更多的数据&#xff0c;以达到“大力出奇迹”的效果。随着模型规模的持续增大&#xff0c;单块GPU已经无法容纳整个预训练语言模型。为了解决这个问题&#xff0c;谷歌提出了ALBE…

Redis【web应用实践_网页缓存、其他功能(发布与订阅、慢查询 、流水线pipeline)】(四)-全面详解(学习总结---从入门到深化)

目录 ​编辑 Redis构建web应用实践_网页缓存 创建springboot项目 选择组件 编写配置文件 创建表 编写持久层 编写业务层 编写控制层 下载压测工具 启动Jmeter工具 修改语言 创建压测任务 添加HTTP请求 配置HTT请求 添加压测结果报告 没有加缓存的吞吐量 ​ …

【java爬虫】selenium+browsermob入门实战

在爬虫领域&#xff0c;selenium几乎是最无所不能的一个框架了&#xff0c;在传统的爬虫无能为力的时候&#xff0c;我们可以使用selenium来请求动态页面获取信息。 当然&#xff0c;只有selenium还是不够的&#xff0c;因为使用selenium我们只能获取页面上展示的数据&#xf…

Linux驱动入门(四)——内核进程管理

文章目录 前言进程进程描述符及任务结构分配进程描述符进程描述符的存放进程状态设置当前进程状态进程上下文进程家族树 进程创建写时拷贝fork()vfork() 线程在Linux中的实现创建线程内核线程 进程终结删除进程描述符孤儿进程造成的进退维谷 总结 前言 进程是Unix操作系统抽象…

Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(七)

今天开始使用 vue3 ts 搭建一个项目管理的后台&#xff0c;因为文章会将项目的每一个地方代码的书写都会讲解到&#xff0c;所以本项目会分成好几篇文章进行讲解&#xff0c;我会在最后一篇文章中会将项目代码开源到我的GithHub上&#xff0c;大家可以自行去进行下载运行&…

驱动开发:摘除InlineHook内核钩子

在笔者上一篇文章《驱动开发&#xff1a;内核层InlineHook挂钩函数》中介绍了通过替换函数头部代码的方式实现Hook挂钩&#xff0c;对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能&#xff0c;此类功能的实现一般可在应用层进行&#xff0c;而驱动层只需要保留一…

idea如何使用git指令

&#xff08;1&#xff09;、打开setting,直接搜git (2)、点一下text 如果显示成功就不用管了&#xff0c;但如果失败就要重新设置一下目录&#xff1a; &#xff08;3&#xff09;、找到自己设置gitee ssh目录&#xff1a; 这里我们是不需要用.git对.idea进行管理的&#xff…

vue3原理和源码分析 - VirtualDOM和DOMDIFF

目录 VUE3的h/createVNode函数【vue的概念模型】 Virtual DOM&#xff08;组件化的概念模型&#xff09; VirtualDOM更新 WHY DOM-DIFF&#xff1f; DOM-DIFF原理 DOM-DIFF伪代码 DOM-DIFF分类讨论&#xff1a;属性变更 DOM-DIFF分类讨论&#xff1a;节点类型不同 DOM-…

正负整数小数在内存的存储

目录 补码引入 整数在内存的存储 小数十进制与二进制相互转化 小数的内存存储 本节会主要学习正负的整数小数在内存的存储方式 补码引入 补码在计算机有着重要的地位&#xff0c;计算机本身只能完成的加法&#xff0c;移位运算&#xff0c;减法&#xff0c;乘法&#xff0…

深入解析多人共享云盘:便捷文件协作与分享的全新模式

在当今数字化时代&#xff0c;云盘已成为许多人存储和共享文件的首选方式。但是&#xff0c;传统的个人云盘服务在多人协作方面存在一些限制。为了解决这个问题&#xff0c;多人共享云盘应运而生。什么是多人共享云盘&#xff1f; 多人共享云盘是一种允许多个用户同时访问、编辑…

【数据库六】存储过程

存储过程 1.存储过程概述1.1 存储过程定义1.2 存储过程优点1.3 创建存储过程 2. 存储过程参数2.1 输入参数2.2 输出参数2.3 输入输出参数2.4 存储过程参数总结 3. 删除存储过程4.存储过程的控制语句4.1 条件语句if --else4.2 循环语句4.3 存储过程控制语句总结 1.存储过程概述 …

Qt 实现SQLite全部语法(增删改查、内置函数、高级语法)

Qt 实现SQLite全部语法 【1】SQLite Qt界面设计【2】SQLite Qt数据库创建、打开、关闭、删除【3】SQLite Qt表格的创建【4】SQLite Qt表格的插入【5】SQLite Qt表格的查询【6】SQLite Qt表格的删除【7】SQLite Qt表格的更新【8】SQLite Qt表格的结构【9】SQLite Qt表格的修改【…

Python 教程:从零到大师

首先, 什么是Python? 用python作者Guido van Rossum自己的话来说&#xff0c;Python是这样的一门语言&#xff1a; "它是一门高级编程语言, 它的核心设计理念是让所有代码变得更易阅读&#xff0c;并给开发者们提供一种“仅仅几行代码就能编写编程逻辑”的语法。 那么&am…

SD/StableDiffusion部署图文教程,ai绘画教程,实现谷歌云端零成本部署,中文UI

目录 一、前言 二、准备前提 三、教程说明 四、开始搭建 1、第一步&#xff0c;下载ipynb脚本文件 2、第二步&#xff0c;上传一键脚本文件到谷歌云盘 3、选择该.ipynb文件--右键--打开方式--关联更多应用 4、输入框搜索Colaboratory找到该应用&#xff0c;安装 5、安…

【瑞萨RA6系列】RASC+Keil开发环境搭建和GPIO点灯指南

瑞萨RASCKeil开发环境搭建 一、简单开箱二、资料下载三、芯片简介四、开发环境搭建4.1 安装RASC4.2 安装Keil MDK4.3 安装RA6E1的MDK支持包 五、GPIO点灯指南5.1 创建RASC项目5.2 查阅开发板原理图5.3 设置LED1引脚为输出3.4 编写LED1闪烁的代码5.5 编译Keil项目5.6 修改Keil调…