实训七:存储过程与触发器 - 存储过程、函数与触发器

存储过程、函数与触发器

  • 第1关:创建存储过程
    • 任务描述
    • 相关知识
      • 存储过程的定义
      • 存储过程的创建和查询
      • 存储过程的查询和删除
    • 编程要求
    • 测试说明
    • 参考代码
  • 第2关:创建函数-count_credit
    • 任务描述
    • 相关知识
      • 自定义函数的定义
      • 自定义函数的创建
    • 编程要求
    • 测试说明
    • 参考代码
  • 第3关:存储过程-调用函数count_credit
    • 任务描述
    • 相关知识
      • 存储过程的定义
    • 编程要求
    • 测试说明
    • 参考代码
  • 第4关:创建触发器-计算总学分
    • 任务描述
  • 相关知识
      • 触发器的定义
      • 触发器的创建
      • after触发器
    • 编程要求
    • 测试说明
    • 代码参考
  • 第5关:创建触发器-练习级联删除操作
    • 任务描述
    • 相关知识
    • 编程要求
    • 测试说明
    • 代码参考

第1关:创建存储过程

任务描述

本关任务:创建存储过程 pro_findname 对学生姓名进行模糊查找,输入任一字输出姓名中含有该字的全部学生。

相关知识

为了完成本关任务,你需要掌握:
1.存储过程的定义;
2.存储过程的创建和查询;
3.存储过程的查询和删除。

存储过程的定义

存储过程Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。

简单的说存储过程就是具有名字的一段代码,用来完成一个特定的功能。

存储过程的创建和查询

创建存储过程:create procedure 存储过程名(参数)

  • 下面我们来创建第一个存储过程
    每个存储的程序都包含一个由 SQL 语句组成的主体。此语句可能是由以分号(;)字符分隔的多个语句组成的复合语句。例如:
CREATE PROCEDURE proc1()
BEGIN
SELECT * FROM user;
END;
  • 执行存储过程:call 存储过程名

  • 创建带有参数的存储过程
    存储过程的参数有三种:

    • IN:输入参数,也是默认模式,表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回;
    • OUT:输出参数,该值可在存储过程内部被改变,并可返回;
    • INOUT:输入输出参数,调用时指定,并且可被改变和返回。

存储过程的查询和删除

我们如何在数据库中查询我们已经创建过的存储过程呢:

SHOW PROCEDURE STATUS WHERE db='数据库名';

查看存储过程的详细定义信息:

SHOW CREATE PROCEDURE 数据库.存储过程名;

当我们不再需要某个存储过程时,我们可以使用:

DROP PROCEDURE [IF EXISTS] 数据库名.存储过程名;

编程要求

根据提示,在右侧编辑器补充代码,创建存储过程pro_findname 对学生姓名进行模糊查找,输入任一字输出姓名中含有该字的全部学生。

测试说明

平台会对你编写的代码进行测试,将调用你编写的存储过程:call pro_findname(‘明’),具体输出请参考右侧测试集。


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

参考代码

 use teachingdb;/****请在此编写代码,操作完毕之后点击评测******//**********Begin**********/delimiter ^create procedure pro_findname(in p_name char(3))Beginselect *from student where sname like concat('%',p_name,'%');End^delimiter ;/**********End**********/

第2关:创建函数-count_credit

任务描述

本关任务:设计函数 count_credit,根据学号计算该学生的总学分,只有当成绩大于等于60分时才能获得该门课程的学分。

相关知识

为了完成本关任务,你需要掌握:

  1. mysql 自定义函数的定义;
  2. 自定义函数如何创建。

自定义函数的定义

  • 自定义函数是一种过程式数据库对象,与存储过程十分相似的。是由 SQL 语句和过程式语句组成的代码片段。

自定义函数的创建

语法如下:

CREATE FUNCTION <函数名> ( [ <参数1> <类型1> [ , <参数2> <类型2>] ]) RETURNS <类型> <函数主体>

编程要求

根据提示,在右侧编辑器补充代码,设计函数 count_credit,根据学号计算该学生的总学分,只有当成绩大于等于60分时才能获得该门课程的学分。

测试说明

平台会对你编写的代码进行测试:本题中该学生选“马蓉”,学号为“97001”)


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

参考代码

 use teachingdb;/****请在此编写代码,操作完毕之后点击评测******/delimiter $$drop function if exists count_credit$$CREATE FUNCTION count_credit(stuno char(6)) returns intreads sql dataBegindeclare stucno char(3) ;declare cred int default 0;declare t_cred int default 0;declare done int default false;declare stucur cursor for select cno from score where sno=stuno and grade>=60;declare continue handler for not found set done=true;open stucur;loop_cursor:loopfetch stucur into stucno;if done then leave loop_cursor; End if;select credit into cred from course where cno=stucno;set t_cred=t_cred+cred;end loop;return t_cred;end$$delimiter ;

第3关:存储过程-调用函数count_credit

任务描述

本关任务:创建存储过程 p_count_credit,调用 count_credit 函数更新学生表的总学分值。

相关知识

为了完成本关任务,你需要掌握:
1.存储过程的定义;
2.存储过程的创建和查询;
3.存储过程的查询和删除。

存储过程的定义

存储过程Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。

存储过程是为了完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用

简单的说存储过程就是具有名字的一段代码,用来完成一个特定的功能。

编程要求

根据提示,在右侧编辑器补充代码,创建存储过程 p_count_credit,调用count_credit 函数更新学生表的总学分值。

测试说明

平台会对你编写的代码进行测试,将调用你编写的存储过程p_count_credit,函数的count_credit的功能和第2关中的相同,具体输出请参考右侧测试集。


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

参考代码

 use teachingdb;/****请在此编写代码,操作完毕之后点击评测******//**********Begin**********/delimiter $create procedure p_count_credit()Begindeclare flag  int  default 1;declare psno char(5);declare stucur cursor for select sno from student;declare continue handler for not found set flag=0;open stucur;while flag=1 do fetch stucur into psno;update student set totalcredit=count_credit(psno) where sno=psno;end while;close stucur;end $delimiter ;/**********End**********/

第4关:创建触发器-计算总学分

任务描述

本关任务:创建触发器 sum_credit,实现对 student 表总学分的计算,当 score 中添加记录时,student 表总学分的值做相应改变。当课程成绩大于等于60分时,将该课程的学分加到该学生的总学分中。

相关知识

为了完成本关任务,你需要掌握:
1.触发器的定义;
2.触发器的创建;
3.after 触发器。

触发器的定义

触发器Trigger)是存储在系统内部的一段程序代码。

触发器和存储过程类似,可以把它看作是一个特殊的存储过程。两者的区别是,触发器无需人工调用,当程序满足定义条件时就会被 MySQL 自动调用。这些条件可以称为触发事件,包括 INSERTUPDATEDELETE 操作。

核心就是数据库 SQL 语言层面的代码封装与重用

触发器的创建

  • 下面我们来创建一个触发器
CREATE TRIGGER trigger_name trigger_time trigger_eventON table_name FOR EACH ROW trigger_bodytrigger_time:触发器触发时机,有before和aftertrigger_event:触发器触发事件,有insert,update,delete三种trigger_body:触发器主体语句

after触发器

  • delete触发器
    建一个触发器 t_d_s,当删除表 student 中某个学生的信息时,同时将 grade 表中与该学生有关的数据全部删除。
CREATE TRIGGER trigger_t1
AFTER DELETE ON student
FOR EACH ROW
BEGIN DELETE FROM grade WHERE studentid = old.studentid;
END
  • UPDATE 创建一触发器 t_u_s,实现在更新学生表的学号时,同时更新 grade 表中的相关记录的 student 的 id 值。
CREATE TRIGGER t_u_s
AFTER UPDATE ON student
for EACH ROW
BEGINUPDATE grade SET studentid = new.studentid WHERE studentid = old.studentid;
END
  • INSERT 创建一个存储过程,根据 student 表中数据,一次性更新 class 表中每个班的人数
CREATE PROCEDURE p_tao()
BEGINDECLARE num int;DECLARE cid VARCHAR(20);DECLARE done boolean DEFAULT true;DECLARE cur CURSOR FORSELECT classid,COUNT(*)FROM studentGROUP BY classid;    DECLARE CONTINUE HANDLER FOR NOT found SET done = false;UPDATE class set studentnum = 0;OPEN cur;FETCH cur INTO cid,num;WHILE done DO        UPDATE class SET StudentNum = num WHERE classid = cid;    FETCH cur INTO cid,num;    END WHILE;CLOSE cur;
END
CALL p_tao();

编程要求

根据提示,在右侧编辑器补充代码,创建触发器 sum_credit,实现对 student 表总学分的计算,当 score 中添加记录时,student 表总学分的值做相应改变。当课程成绩大于等于60分时,将该课程的学分加到该学生的总学分中。

测试说明

平台会对你编写的代码进行测试:平台会用“马小燕”为测试用例进行测试。


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

代码参考

 use teachingdb;/****请在此编写代码,操作完毕之后点击评测******//**********Begin**********/delimiter $create trigger sum_credit before insert on score for each rowBeginupdate student set totalcredit= totalcredit+(select credit from course where cno=new.cno)where student.sno=new.sno and new.grade>=60;End$delimiter ;/**********End**********/

第5关:创建触发器-练习级联删除操作

任务描述

本关任务:创建级联删除触发器 del_student_score,当删除 student 表中的学生时,也删除 score 表中的对应学号的学生成绩记录。

相关知识

见第4关。

编程要求

根据提示,在右侧编辑器补充代码,创建级联删除触发器 del_student_score,当删除 student 表中的学生时,也删除 score 表中的对应学号的学生成绩记录。

测试说明

平台会对你编写的代码进行测试。


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

代码参考

 use teachingdb;/****请在此编写代码,操作完毕之后点击评测******//**********Begin**********/delimiter @create trigger del_student_score before delete on student for each rowBegindelete from score where sno=old.sno;End@delimiter ;/**********End**********/

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

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

相关文章

【C++漂流记】函数的高级应用——函数默认参数、占位参数、重载

函数的高级应用&#xff0c;侧重介绍函数的默认参数、函数的占位参数、函数重载定义解释及使用。 文章目录 一、函数的默认参数二、函数的占位参数三、函数重载函数重载的注意事项 一、函数的默认参数 函数默认参数是指在函数声明时为参数提供一个默认值&#xff0c;这样在调…

算法通关村第十三关——溢出问题处理模板

前言 溢出问题是面试当中输出涉及到数字的一个需要特别注意的地方&#xff0c;典型的题目有三个&#xff1a;数字反转&#xff0c;将字符串转成数字和回文数。 1.整数反转 力扣7题&#xff0c;给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。…

ORACLE 11.2.0.4 RAC Cluster not starting cssd with Cannot get GPnP profile

最近&#xff0c;处理一次oracle 11.2.0.4 rac cluster由于cssd无法启动&#xff0c;导致集群一个节点的CRS集群无法正常启动的故障。原本&#xff0c;计划变更是从ASM剔除磁盘&#xff0c;解除存储到数据库服务器的映射&#xff1b;磁盘已经成功从ASM剔除&#xff0c;也已经成…

数据库误修改后的数据恢复

一不小心将数据库数据修改了&#xff0c;而且回滚无效&#xff0c;于是去尝试各种方法恢复数据 查询到修改时间点之前的数据 恢复数据 恢复数据库被修改数据的流程及代码&#xff0c;这里被修改的表是AUTH_USER,实际应用填写对应表名。 -- 通过时间恢复删除且已提交的数据-- 1…

uni-app rich-text组件富文本图片展示不全问题

背景&#xff1a;phpfastadmin富文本插件上传富文本内容到数据库&#xff0c;uni-app渲染富文本内容。这里后端不需要特殊处理。uni-app的rich-text组件展示图片跑板。直接贴代码。 <template><view><title-bar title"会员动态" back backcolor"…

解释区块链技术的应用场景和优势

概述 区块链技术是一种分布式数据库技术&#xff0c;用于存储和传输数字资产&#xff08;如加密货币&#xff09;的信息。它通过将交易记录分散保存到节点网络中的多个节点上&#xff0c;从而保证了数据的安全性和透明度。区块链技术的核心是基于密码学技术的算法&#xff0c;…

JDK1.8下载、安装和环境配置使用

JDK1.8下载、安装和配置 下载安装包解压文件配置测试安装 下载安装包 链接地址 https://pan.baidu.com/s/1RF7-ulq0_qAelpXskDxdvA 提取码 d1y0解压文件 jdk1.8.0_181 配置 右击我的电脑&#xff0c;选择属性 2.点击高级系统设置 在系统变量区里点击&#xff1a;新建…

Oralce集群管理-19C RAC 私有网络调整为BOND1

1 尝试在线添加私有网络的新接口 是否成功。 使用oifcfg命令在线添加新的网卡接口&#xff0c;在还没有配置bond1的条件下 也是可以添加成功的。 [gridorcldb1 ~]$ oifcfg getif eno3 192.168.224.0 global public ens3f0 10.2.0.0 global cluster_interconnect,asm eno…

2023年高教社杯数学建模国赛C题详细版思路

C 题 蔬菜类商品的自动定价与补货决策 2023年国赛如期而至&#xff0c;为了方便大家尽快确定选题&#xff0c;这里将对C题进行解题思路说明&#xff0c;以分析C题的主要难点、出题思路以及选择之后可能遇到的难点进行说明&#xff0c;方便大家尽快找到C题的解题思路。 难度排…

【OJ比赛日历】快周末了,不来一场比赛吗? #09.09-09.15 #15场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-09-09&#xff08;周六&#xff09; #5场比赛2023-09-10…

适用于多种场景功能强大的在线海报图片素材设计器源码

源码介绍: 在线海报设计系统素材设计源码是一个漂亮且功能强大的在线海报图片设计器, 仿照稿定设计而成。该系统适用于多种场景,包括海报图片生成、电商分享图、文章长图、 视频/公众号封面等。用户无需下载软件,即可轻松实现创意,迅速完成排版,让设计更简单! 该系统…

Python之基础数据类型(二)

目录 列表 list初始化切片&#xff08;有序&#xff09;可变数据类型存放任何数据类型 常用方法运算底层存储&#xff08;地址值的传递&#xff09;遍历示例 元组 tuple初始化与list的主要区别是不可变运算与list相互转换 字典 dict初始化删除字典的合并in、not in、values()遍…

Ubuntu离线或在线安装CMake

首先下载适用于Ubuntu的CMake安装包&#xff0c;可以去官网下载&#xff0c;也可以通过下面的命令下载&#xff08;需要联网&#xff09;&#xff1a; wget https://cmake.org/files/v3.22/cmake-3.22.1.tar.gz将下载的安装包进行解压&#xff1a; tar -xvzf cmake-3.22.1.ta…

本地如何使用HTTPS进行调试

在现代前端开发中&#xff0c;HTTPS已经成为不可或缺的一部分&#xff0c;因为它在保护用户数据和确保网站安全性方面发挥着关键作用。然而&#xff0c;有时在本地开发过程中启用HTTPS可能会变得有些复杂。在本文中&#xff0c;我们将介绍如何轻松地在本地进行HTTPS调试&#x…

JVM学习(五)--方法区

概念&#xff1a; 方法区就是存和类相关的东西&#xff0c;成员方法&#xff0c;方法参数&#xff0c;成员变量&#xff0c;构造方法&#xff0c;类加载器等&#xff0c;逻辑上存在于堆中&#xff0c;但是不同的虚拟机对它的实现不同&#xff0c;oracle的hotsport vm在1.6的时…

U-net网络学习记录

U-net网络 本质上是一个用于图像分割的神经网络 输入是一幅图&#xff0c;输出是目标的分割结果。继续简化就是&#xff0c;一幅图&#xff0c;编码&#xff0c;或者说降采样&#xff0c;然后解码&#xff0c;也就是升采样&#xff0c;然后输出一个分割结果。根据结果和真实分…

uwsgi部署多进程django apscheduler与问题排查

&#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;开源建设者与全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&#xff1a;Zeeland&#x1f4da; Github主页: Undertone0809 (Zeeland)&…

基于Simulink的用于电力系统动态分析

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【正版软件】Air Explorer - 一个程序访问您的所有云服务

前言&#xff1a;Air Explorer支持最好的云服务。 功能特点&#xff1a; 直接管理云中的文件 设置同一服务上的多个帐户 您可以在任何云服务或计算机之间同步文件夹 云文件浏览器易于使用 通过加入您的所有云服务来增加存储空间 应用程序适用于Windows/Mac Air Explorer…

vue+antd——table组件实现动态列+表头下拉选择功能——技能提升

Table 表格 展示行列数据。 何时使用 当有大量结构化的数据需要展现时&#xff1b; 当需要对数据进行排序、搜索、分页、自定义操作等复杂行为时。 最近在写vueantd的框架&#xff0c;遇到一个需求&#xff1a;就是要实现table表格的动态列&#xff0c;并且相应的表头要实现下拉…