首页 > 其他分享 >实验9 存储过程与函数的创建管理实验

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

时间:2024-07-12 22:30:56浏览次数:18  
标签:count 存储 函数 price 实验 type SELECT name

一、实验目的:

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

标签:count,存储,函数,price,实验,type,SELECT,name
From: https://blog.csdn.net/weixin_46186903/article/details/140389669

相关文章

  • 【eNSP模拟实验】单臂路由实现VLAN间通讯(复杂案例)
    实验需求如下图所示,PC1和PC2在vlan10下,PC3和PC4在vlan20下,Server1在vlan30下,需要实现这5台设备之间互相通讯。实验操作配置各个终端的ip地址PC1~PC4都按照下图进行配置(注意ip地址和网关有不同的地方),注意配置好之后要点击右下角的应用Server1配置如图下所示,配置好之后,点......
  • c语言的简易教法—— 函数递归
    文章目录一、什么是递归?1.1递归的思想1.2递归的限制条件二、递归案例2.1案例1:求n的阶层2.1.1分析2.1.2递归函数(Fact)的代码实现2.1.3测试:main函数实现2.1.4运行结果和画图推演2.1.5扩展:迭代方法求解n的阶乘2.2案例2:顺序打印⼀个整数的每⼀位2.2.1分析2.2.2打印数(p......
  • 如何在函数中使用return返回axios的请求结果
    使用场景:在添加学生上课记录的时候,需要先获取学生的剩余课时,需要通过接口获取。所以需要封装一个方法,能够通过接口获取学生的课时数量。解决方案:通过异步解决封装方法的代码如下:constgetStudentCourseCount=async()=>{letnum=0awaitaxios({method:......
  • 10个Python函数参数进阶用法及代码优化
    目录1.默认参数值:让函数更加灵活2.关键字参数:清晰的调用方式3.*args:拥抱不确定数量的位置参数4.**kwargs:处理不确定数量的关键字参数5.参数解包:简化多参数的传递6.命名关键字参数:限制关键字参数7.局部变量与全局变量:理解作用域8.高级:装饰器(@decorator)9.Lambd......
  • python每日学习4:函数的定义和各类参数定义与用法
    目录目录一、函数的定义二、参数的定义和用法1、必选参数2、默认参数3、可变参数4、关键字参数5、命名关键字参数三、参数在实际操作中的要求一、函数的定义1、函数代码块以def关键词开头,后接函数名称和圆括号()2、在圆括号内定义传入参数3、函数的第一行语句可以......
  • 我的MYSQL学习心得, 自定义存储过程和函数
    转载:https://www.cnblogs.com/lyhabc/p/3793524.html我的MYSQL学习心得(一)简单语法我的MYSQL学习心得(二)数据类型宽度我的MYSQL学习心得(三)查看字段长度我的MYSQL学习心得(四)数据类型我的MYSQL学习心得(五)运算符我的MYSQL学习心得(六)函数我的MYSQL学习心得(七)查询我的MYSQ......
  • 动态添加HTML时onclick函数参数传递
    onclick函数动态传参1.参数为数值类型时:var tmp=123;var strHTML="<divonclick=func(" +tmp+")>点击弹出数据及其类型</div>";info.append(strHTML); function func(tmp){    alert(typeof tmp+"" +tmp);}string12......
  • PostgreSQL 中如何处理数据的存储压缩和查询性能的平衡?
    文章目录PostgreSQL中数据存储压缩与查询性能的平衡之道PostgreSQL中数据存储压缩与查询性能的平衡之道在数据库管理的广袤领域中,PostgreSQL犹如一位稳重可靠的智者,为我们提供了丰富的功能和强大的性能。然而,当面对数据存储压缩和查询性能这对“欢喜冤家”时,如......
  • 《DNK210使用指南 -CanMV版 V1.0》第十二章 跑马灯实验
    第十二章跑马灯实验1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html5)正点原子......
  • C语言函数详解
    文章目录函数的概念库函数库函数的使⽤⽅法⾃定义函数形参和实参基本的传参类型嵌套调⽤链式访问多个⽂件函数的概念数学中我们其实就⻅过函数的概念,⽐如:⼀次函数y=kx+b,k和b都是常数,给⼀个任意的x,就得到⼀个y值。其实在C语⾔也引⼊函数(function)的概念,有些翻译为......