实验9 存储过程与函数的创建管理实验

news2024/9/21 12:27:08

一、实验目的:

  1. 理解存储过程和函数的概念。
  2. 掌握创建存储过程和函数的方法。
  3. 掌握执行存储过程和函数的方法。
  4. 掌握游标的定义、使用方法。

二、实验内容

1.某超市的食品管理的数据库的Food表,Food表的定义如表所示,
Food表的定义
在这里插入图片描述
各列有如下数据:
‘QQ饼干’,‘QQ饼干厂’,2.5,‘2008’,3,‘北京’
‘MN牛奶’,‘MN牛奶厂’,3.5,‘2009’,1,‘河北’
‘EE果冻’,‘EE果冻厂’,1.5,‘2007’,2,‘北京’
‘FF咖啡’,‘FF咖啡厂’,20,‘2002’,5,‘天津’
‘GG奶糖’,‘GG奶糖’,14,‘2003’,3,‘广东’

(1) 在food表上创建名为Pfood_price_count的存储过程。其中存储过程Pfood_price_count有3个参数。输入参数为price_infol和price_info2,输出参数为count。存储过程的满足:查询food表中食品单价高于price_infol且低于price_info2的食品种数,然后由count参数来输出,并且计算满足条件的单价的总和。

DELIMITER //
CREATE PROCEDURE Pfood_price_count(IN price_infol FLOAT, IN price_info2 FLOAT, OUT count INT)
BEGIN
  DECLARE sum_price FLOAT DEFAULT 0;
  SELECT COUNT(*), SUM(price) INTO count, sum_price FROM food WHERE price > price_infol AND price < price_info2;
  SELECT CONCAT('满足条件的食品种数为:', count) AS result;
  SELECT CONCAT('满足条件的单价总和为:', sum_price) AS result;
END //
DELIMITER ;

(2) 使用CALL语句来调用存储过程。查询价格在2至18之间的食品种数。代码如下:

CALL Pfood_price_count(2, 18, @count);

(3)使用DROP语句删除存储过程Pfood_price_count。代码如下:

DROP PROCEDURE Pfood_price_count; 

(4) 使用存储函数来实现(1)的要求。

DELIMITER //
CREATE FUNCTION Ffood_price_count(price_infol FLOAT, price_info2 FLOAT) RETURNS VARCHAR(100) DETERMINISTIC READS SQL DATA
BEGIN
  DECLARE count INT DEFAULT 0;
  DECLARE sum_price FLOAT DEFAULT 0;
  SELECT COUNT(*), SUM(price) INTO count, sum_price FROM food WHERE price > price_infol AND price < price_info2;
  RETURN CONCAT('满足条件的食品种数为:', count, ',满足条件的单价总和为:', sum_price);
END //
DELIMITER ;

(5)调用存储函数

SELECT Ffood_price_count(2, 18) AS result;

(6)删除存储函数

DROP FUNCTION Ffood_price_count;

2.学校教师管理数据库中的teacherInfo表,其表的定义如下表所示,请完成如下操作。
在这里插入图片描述
向teacherInfo表中插入记录:
1001,‘张龙’,‘男’,‘1984-11-08’,‘北京市昌平区’
1002,‘李梅’,‘女’,‘1970-01-21’,‘北京市海淀区’
1003,‘王一丰’,‘男’,‘1976-10-30’,‘北京市昌平区’
1004,‘赵六’,‘男’,‘1980-06-05’,‘北京市顺义区’

(1)创建名为teachernfo1的存储过程。要求:存储过程teachernfo1有3个参数。输入参数为teacherid和type,输出参数为info。满足:根据编号(teacherid)来查询teachernfo表中的记录。如果type的值为1时,将姓名(name)传给输出参数info;如果type的值为2时,将年龄传给输出参数info;如果type为其他值,则返回字符串“Error”。

DELIMITER //
CREATE PROCEDURE teachernfo1(IN teacherid INT, IN type INT, OUT info VARCHAR(50))
BEGIN
  DECLARE name VARCHAR(20);
  DECLARE birthday DATETIME;
  DECLARE age INT;
  SELECT name, birthday INTO name, birthday FROM teacherInfo WHERE num = teacherid;
  SET age = YEAR(CURDATE()) - YEAR(birthday);
  IF type = 1 THEN
    SET info = name;
  ELSEIF type = 2 THEN
    SET info = age;
  ELSE
    SET info = 'Error';
  END IF;
END //
DELIMITER ;

(2)调用存储过程,参数值teacher id为2,type为1。

CALL teachernfo1(2, 1, @info);
SELECT @info;

(3)使用DROP PRODECURE语句来删除存储过程

DROP PROCEDURE teachernfo1;

(4)创建名为teacherinfo2的存储函数。要求:存储过程teacherinfo2有两个参数:teacher id和type。满足:根据编号(teacher id)来查询teacher表中的记录。如果type的值是1时,则返回姓名(name)值;如果type的值是2时,则返回年龄;如果type为其他值,则返回字符串“Error”。

DELIMITER //
CREATE FUNCTION teacherinfo2(teacherid INT, type INT) RETURNS VARCHAR(50)
BEGIN
  DECLARE name VARCHAR(20);
  DECLARE birthday DATETIME;
  DECLARE age INT;
  SELECT name, birthday INTO name, birthday FROM teacherInfo WHERE num = teacherid;
  SET age = YEAR(CURDATE()) - YEAR(birthday);
  IF type = 1 THEN
    RETURN name;
  ELSEIF type = 2 THEN
    RETURN age;
  ELSE
    RETURN 'Error';
  END IF;
END //
DELIMITER ;

(5)使用SELECT语句调用teacherinfo2存储函数。

SELECT teacherinfo2(2, 1);

(6)使用DROP FUNCTION语句来删除teacherinfo2存储函数。

DROP FUNCTION teacherinfo2;

三、观察与思考

(1) 什么时候适合通过创建存储过程来实现?
mysql中适合通过创建存储过程来实现的情况包括:执行复杂的数据库操作,提高代码重用性;封装业务逻辑,简化客户端开发;减少网络通信量,提升性能;实施细粒度的权限控制;确保事务的一致性和完整性。

(2) 功能相同的存储过程和存储函数的不同点有哪些?
mysql中存储过程和存储函数的主要不同点在于调用方式、返回值和语句类型。存储过程可以执行复杂逻辑,支持输出参数和多种sql语句类型,适合执行修改数据的操作。而存储函数必须返回单个值,通常用于计算和返回数据,适用于select语句中,作为表达式的一部分。

(3)使用游标对于数据检索的好处有哪些?
使用游标进行数据检索的好处包括:可以逐行处理结果集中的数据,提供更细粒度的控制;适合复杂的数据处理逻辑,如多步骤计算或条件判断;减少内存占用,尤其当处理大量数据时;提高代码的灵活性和可读性。

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

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

相关文章

GESP 2023年12月C++二级真题

参考程序1&#xff1a; #include<iostream> using namespace std;int first,second; int m,n; int sum 0;int fn(int n) {if(n1) {return first;} else if (n2) {return second;} else {return fn(n-1)fn(n-2);} } int main() {cin>>first>>second;cin>…

【Golang】map的使用

map声明的方式 //声明var m map[string]string//在使用map之前&#xff0c;先make&#xff0c;make的作用就是给map分配空间m make(map[string]string)m["lover"] "Yzx"m["friend1"] "Zxw"m["friend2"] "Zzc"…

【电子通识】什么是无源元件的认证用可靠性试验标准AEC-Q200?

目前电动汽车已经是一个大趋势&#xff0c;汽车上安装有由多个电子零部件构成的ECU&#xff08;电子控制单元&#xff09;。即使汽车在恶劣的环境下行驶&#xff0c;电子零部件也必须不出故障地正常工作。因此&#xff0c;车载电子零部件与消费类电子相比&#xff0c;要求其达到…

Idea调试Kotlin代码

1.配置java虚拟机jvm远程调试 例如 启动程序配置 java -agentlib:jdwptransportdt_socket,servery,suspendn,address127.0.0.1:5005 -jar KtTest.jar IDEA配置远程调试JVM idea编译的Kt代码为 // IntelliJ API Decompiler stub source generated from a class file // Im…

人工智能是帮助开发人员还是取代他们?

最近&#xff0c;神经网络已经成为应用开发中不可或缺的工具。它们大大简化和加速了这一过程。 例如&#xff0c;使用GitHub Copilot&#xff0c;可以根据任务描述自动生成重复的代码部分。神经网络可以创建和运行测试&#xff0c;识别错误&#xff0c;甚至提出修复错误的方法…

数据库管理软件Navicat Premium介绍

1、点击连接 2、主界面 3、软件版本 待续...

【ZYNQ】VDMA 的使用

VDMA, Video Direct Memory Access 是 Xilinx 官方提供的高速内存存取 IP,采用 AXI4-Stream 与 AXI4 协议实现存储映射接口(Memory Map)与非存储映射接口(Non-Memory Map)接口的转换,主要用于视频数据缓存,同时提供帧缓存与帧同步控制功能。本文主要介绍 AXI VDMA 的配置…

博客文章多平台发布工具

做过博客分享和自媒体的同学应该都知道&#xff0c;在多个平台上同步发布、更新自己的原创内容&#xff0c;是快速传播知识、提高用户触达率的有效方式。 然而&#xff0c;一篇文章要在N个平台上重复进行编辑、排版、图片/视频上传的苦恼&#xff0c;你一定经历过吧&#xff1…

字符串哈希详解,单hash,双hash,滚动哈希

一、字符串哈希 1.1 基本概念 字符串哈希 将不同的字符串映射成不同的整数。 思想&#xff1a;将字符串映射成一个 p进制数字。 我们定义如下哈希函数&#xff1a; h a s h ( s ) ∑ i 1 n s [ i ] p n − i ( m o d M ) 其中 s 为长度为 n 的字符串&#xff0c;下标从…

自动驾驶中,实现三维点旋转原理

文章目录 1. 三维点旋转的方案2. 使用复数表示二维点的旋转2.1. 复数的概念2.2. 复数的三种形式及相互转换2.3. 复数概念扩展&#xff1a;实数、虚数、复数 3. 四元数旋转三维点原理4. 使用四元数进行旋转的公式5. 旋转叠加6. 四元数转换为三维点7. 代码实现 1. 三维点旋转的方…

《昇思25天学习打卡营第19天|生成式-Pix2Pix实现图像转换》

学习内容&#xff1a;Pix2Pix实现图像转换 1.模型简介 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c;该模型是由Phillip Isola等作者在2017年CVPR上提出的&#xff0c…

基于javaScript的简易ATM机

目录 一.设计要求 二.设计思路 三.案例展示 四.源代码展示 一.设计要求 首先里面已经存放了100元钱。如果用户执行存钱操作&#xff0c;就将输入进去的存钱数目和现有的钱相加&#xff0c;再显示余额提示框。如果用户执行取钱操作&#xff0c;就用现有的钱减去要取出钱的数目…

AutoHotKey自动热键(七)WINDOWS按键映射与鼠标映射(替换/组合)

该脚本支持简单的按键替换,可以针对某个窗口进行按键替换,还可以对鼠标和键盘进行互相替换,也可以用来禁用一些按键 键盘按键映射 普通按键映射 a::b这样子就直接在全局把所有的a键输入都映射成b键输出 上面这一行在执行过程中相当于拆解成下面两个,第一个是按下,第二个是弹…

【刷题汇总 --游游的水果大礼包、买卖股票的最好时机(二)、倒置字符串】

C日常刷题积累 今日刷题汇总 - day0111、游游的水果大礼包1.1、题目1.2、思路1.3、程序实现 2、买卖股票的最好时机(二)2.1、题目2.2、思路2.3、程序实现 3、倒置字符串3.1、题目3.2、思路3.3、程序实现 -- c语言3.4、程序实现 -- c 4、题目链接 今日刷题汇总 - day011 1、游游…

U盘打不开的终极解决方案:原因剖析、恢复策略与预防之道

U盘困境&#xff1a;打不开的焦虑与应对 在数字化时代&#xff0c;U盘作为数据交换与存储的重要工具&#xff0c;几乎成为了每个人工作、学习和生活中的必需品。然而&#xff0c;当您满怀期待地将U盘插入电脑&#xff0c;却遭遇“无法识别”、“无法访问”等提示&#xff0c;U…

安装isce2

今天再次尝试安装&#xff0c;之前试过2次都是卡在同一步&#xff0c;今天换成了用mamba conda就没有再报错了 全程参考云军老师的step by step教程&#xff0c;安装成功 GitHub - yunjunz/conda-envs: conda environment setup on Linux / macOS for InSAR data processing …

初识Spring Web MVC

1. 什么是 Spring Web MVC&#xff1f; Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"SpringMVC".Servlet&am…

宝马退出价格战,19万买不到i3了

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 宝马退出价格战 这一消息&#xff0c;源自知名汽车博主孙少军。 7月11日他发文称&#xff0c;“因价格战导致门店亏损严重&#xff0c;宝马7月将会开始降量保价。” 第二天他又做了补充&#xff0c…

SQL,python,knime将数据混合的文字数字拆出来,合并计算实战

将下面将数据混合的文字数字拆出来&#xff0c;合并计算 一、SQL解决&#xff1a; ---创建表插入数据 CREATE TABLE original_data (id INT AUTO_INCREMENT PRIMARY KEY,city VARCHAR(255),value DECIMAL(10, 2) );INSERT INTO original_data (city, value) VALUES (上海0.5…

如何判断代码是否是在UPDATE TASK的Session中执行?

1. 背景 有时我们想控制ABAP代码在UPDATE TASK中的逻辑&#xff0c;例如某些逻辑执行&#xff0c;某些逻辑不执行。 那么&#xff0c;我们应该如何判断当前代码运行的环境呢&#xff1f;也即&#xff0c;怎么知道一段运行时代码是运行在当前的ABAP session中&#xff0c;还是…