[数据库实验四]存储过程及函数

news2024/11/17 18:28:32

目录

一、实验目的与要求:

二、实验内容:

三、实验小结


实验中涉及到的数据及内容:数据库MySQL实验_Fxrain的博客-CSDN博客

一、实验目的与要求:

1、掌握存储过程工作原理、定义及操作方法

2、掌握函数工作原理、定义及操作方法

3、掌握游标工作原理、定义及操作方法

二、实验内容:

1. 创建存储过程,用来自动统计给定订单号的订单总金额

源码:

1创建函数

CREATE DEFINER=`root`@`localhost` FUNCTION `summoney`(s int) RETURNS decimal(8,2)

    READS SQL DATA

BEGIN

    RETURN (

        SELECT SUM(quantity*item_price)

        FROM orderitems

        where o_num=s

    );

END

2测试函数

select summoney(50010);

运行测试结果截图(输入订单号'50010'测试结果):

2.创建存储过程,自动搜索并添加客户及供货商帐号信息到新建的用户信息表。

 ①增加用户表信息user

表1   user表结构

字段名

字段说明

数据类型

主键

外键

非空

唯一

自增

id

ID号

int (11)

Y

N

Y

Y

Y

u_id

用户编号

int (11)

N

N

Y

Y

N

pwd

密码

blob

N

N

Y

N

N

remark

注释

varchar (255)

N

N

Y

N

N

源码:

CREATE TABLE user(  

    id INT(11) not NULL UNIQUE AUTO_INCREMENT,

    u_id INT(11) not NULL UNIQUE,

    pwd BLOB not NULL,

    remark VARCHAR(255) not NULL,

    PRIMARY KEY(id)

) COMMENT '';

运行结果图:

② 创建两个存储过程,分别把客户表的c_id和供货商表s_id的字段自动添加到用户信息表,补充pwd和remark字段。

要求:id字段自动增加,u_id 字段即客户或供货商的编号,pwd字段用AES_ENCRYPT函数加密,密码统一设置为用户编号u_id的值连接123456(如在当前表中u_id为10001,则其密码是10001123456),密钥是'hello'; remark字段内容是‘customer'或'supplier’

源码:

添加客户表帐号:

1创建存储过程

CREATE DEFINER=`root`@`localhost` PROCEDURE `customers_users`()

BEGIN

    DECLARE label INT;

    DECLARE u_id INT(11);

    DECLARE user_cur CURSOR for SELECT c_id from customers;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET label=1;

    SET label=0;

    OPEN user_cur;

    FETCH NEXT FROM user_cur INTO u_id;

    WHILE(label=0) DO

    insert into `user`(u_id,pwd,remark) VALUES(u_id,AES_ENCRYPT(CONCAT(u_id,'123456'),'hello'),'customer');

    FETCH NEXT FROM user_cur INTO u_id;

    END WHILE;

    CLOSE user_cur;

END

2测试procedure

CALL customers_users();

运行测试结果截图:

添加供货商帐号

1创建存储过程

CREATE DEFINER=`root`@`localhost` PROCEDURE `suppliers_users`()

BEGIN

    DECLARE label INT;

    DECLARE u_id INT(11);

    DECLARE use_cur CURSOR FOR SELECT s_id FROM suppliers;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET label=1;

    SET label=0;

    OPEN use_cur;

    FETCH NEXT FROM use_cur INTO u_id;

    WHILE (label=0) DO

    INSERT INTO `user`(u_id,pwd,remark) VALUES (u_id,AES_ENCRYPT(CONCAT(u_id,’123456’),'hello'),'supplier');

    FETCH NEXT FROM use_cur INTO u_id;

    END WHILE;

    CLOSE use_cur;

END

2测试代码

CALL suppliers_users();

运行测试结果截图:

3.创建存储过程或函数来批量修正订单详情表orderitems中的水果价格与水果表fruits中的价格一致。

提示:用游标

源码:

1创建set_name过程

CREATE DEFINER=`root`@`localhost` PROCEDURE `set_same`()

BEGIN

    DECLARE done INT DEFAULT FALSE;

    DECLARE field_value decimal(8,2);

    DECLARE label CHAR(10);

    DECLARE cur CURSOR FOR SELECT f_price,f_id FROM fruits;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;

    OPEN cur;

    #FETCH NEXT FROM cur INTO field_value,label;

    WHILE(done=FALSE) DO

        UPDATE orderitems SET orderitems.item_price=field_value WHERE orderitems.f_id = label;

        FETCH NEXT FROM cur INTO field_value,label;

    END WHILE;

    CLOSE cur;

END

2测试代码:

CALL set_same();

运行测试结果截图:

下图分别为fruits表格和orderitems表格

三、实验小

1.实验中遇到的问题及解决过程

问题一:在计算订单总金额时使用函数计算的订单总价与实际不符

计算得到的:269

实际值:268.80

解决过程:函数最后应返回decimal值,而不是int值

问题二:在创建procedure时无法运行整个过程

解决过程:不使用LOOP循环,改为do while循环

问题三:在创建user表格时,密码应该为用户编号u_id的值连接123456(如在当前表中u_id为10001,则其密码是10001123456)而代码中直接使用u_id+123456则会导致密码不是10001123456,而是10001+123456

解决过程:不能使用u_id+123456,而应该通过CONCAT把u_id和123456相连接。

问题四:将fruits表格中的f_price与orderitems表格中的item_price对应,即根据orderitems表格中的数据修改fruits表格,不符合逻辑关系。

解决过程:在循环中应该更新orderitems表格使orderitems表格中的数值与fruits中的数值相同。

  1. 实验中产生的错误及原因分析

错误一:在函数中使用两个return

原因分析:一个存储过程不能使用两个及两个以上的return

错误二:如以下代码所示,在更新orderitems表格时需要有条件,即orderitems.f_id=fruits.f_id,但是测试时orderitems表格中数值都相同

CREATE DEFINER=`root`@`localhost` PROCEDURE `set_same`()

BEGIN

    DECLARE done INT DEFAULT FALSE;

    DECLARE field_value decimal(8,2);

    DECLARE cur CURSOR FOR SELECT f_price FROM fruits;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;

    OPEN cur;

    FETCH NEXT FROM cur INTO field_value;

    WHILE(done=FALSE) DO

        UPDATE orderitems SET orderitems.item_price=field_value WHERE orderitems.f_id = (SELECT f_id FROM fruits WHERE f_price = field_value);

        FETCH NEXT FROM cur INTO field_value;

    END WHILE;

    CLOSE cur;

END

运行结果:

原因分析:根据给定的代码,它只会将orderitems表中的每个item_price都改为相同的数值,这是因为在循环中,每次迭代都会使用从游标中获取的第一个f_price值来更新orderitems表。因此,无论游标中的其他f_price值是什么,它们都会被忽略,并且只有第一个f_price值会被用于更新操作。

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

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

相关文章

数据结构——二叉搜索树、Map和Set

对于不同的数据结构,他们的使用场景是不一样的,map和set这两种数据结构主要用在搜索相关的场景中。学习这些之前我们先来了解一下二叉搜索树, 一、搜索树 1.1概念 二叉搜索树 又称 二叉排序树 ,它或者是一棵空树,或者…

宝塔面板,awk读取网站日志,筛选请求耗时排名前100的记录

背景 近期发现项目的访问量稳步上升 渐渐注意到一些接口响应时间过长,在此需设计读取接口耗时较长的日志(nginx 的 access.log日志) 在此将实现步骤记录如下,方便道友参考 . 环境配置 宝塔面板 Nginx 1.20.2 PHP-7.2.33实现步…

认知战认知作战:认知战目标对手分析,你需要知道的目标对手分析SOP

认知战认知作战:认知战目标对手分析,你需要知道的目标对手分析SOP 认知战认知作战:认知战目标对手分析你需要知道的目标对手分析SOP 关键词:认知战, 目标对手分析, 数据情报搜集, 自我审视, 洞悉对手, 精准攻击策略, 行动规划, …

【国家博物馆应对黄牛办法解析】

一 国家博物馆预约流程及独家预约问题 微信公众号的预约引导页,有微信小程序和PC端预约两种方式: PC端预约和微信小程序明明是两中方式,现在却变成一种了, 为何不能在支付宝小程序预约? 独家的背后往往有故事&#x…

从零开学C++:二叉搜索树

引言:在本篇博客当中,我们会将关于二叉树的进阶结构——二叉搜索树,强大的搜索效率让它在数据结构当中变得十分重要,让我们一起来进行学习吧! 更多有关C的知识详解可前往个人主页:计信猫 一,二叉…

Android开发版本更新和强制更新效果

Android开发版本更新和强制更新效果 版本更新基本每个app都有,这里加多个强制更新效果 一、思路: 用okhttp下载接口返回的apk下载地址,这样有进度条 二、效果图: Android开发教程实战案例源码分享-版本更新和强制更新效果 三、…

建筑师设计师必备的14个AI工具

从制作复杂的设计到可视化突破性的建筑创新,建筑领域一直与技术紧密交织。随着我们深入数字时代,建筑师和设计师利用尖端人工智能 (AI) 工具的力量来革新他们的工艺也就不足为奇了。但是,随着市场上 AI 工具的大量出现,哪些工具真…

Pymsql 插入数据时报错 Unkown column xxxx in field list

如图 从文字来看,它是说我们表里没有“247dxxxxxxx”这个字段,但问题是我建表的时候本来就没建这个字段,这一串字符是我要插入到“id”这个字段里的内容,它怎么就把它当成字段了呢? 后来发现是在传入参数的时候&#…

Java 发布jar包到maven中央仓库(2024年9月保姆级教程)

文章目录 前言一、账号准备1. 注册登录账号2. 新建命名空间3. 验证命名空间4. 生成令牌5. 为 maven 设置令牌二、GPG准备1. 下载GPG2. 发布证书2.1 新建证书2.2 发布证书到服务器2.3 验证发布三、发布jar包到中央仓库1. 编辑项目pom文件2. 打包上传3. 发布jar包4. 搜索我们的ja…

分片上传和断点续传

今天介绍两个概念: 1、分片上传 分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。 2、断点续传 断点续…

C语言课程设计题目三:图书管理系统设计

题目三:图书管理系统设计 图书管理信息包括:图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等。 主要功能: 新进图书基本信息的输入。图书基本信息的查询。对撤销图书信息的删除。为借书人办理注册。办理借书手续。办理…

数据流处理技术与Flink框架

一数据流 数据流定义: 数据流(Data Stream)是指数据以连续不断的方式到达和处理的序列。在现实世界中,许多数据来源都是以流的形式存在,比如: 1. 用户行为:用户在网站上的点击流、移动应用中…

微软 Win11 RP 226x1.4247(KB5043145)预览版发布!

系统之家于9月25日发出最新报道,微软面向Release Preview频道的用户发布了Win11的KB5043145更新。系统更新后版本号提升为22621.4247和22631.4247。此次更新新增多项功能,例如用户播放媒体时,媒体控件会显示在锁屏中央的下部。以下跟随小编看…

LeetCode2207解题思路

题目描述 字符串中最多数目的子序列 解题思路: 题目要求我们找到在 text 中 找到最多可组成 pattern 的字符串个数,并且允许在 text 的任意位置插入 pattern 中一个字符,也就是说我们只需要考虑 text 中的 pattern 含有的字符即可。例如示例…

【React】组件基础使用

1. react组件 在react中&#xff0c;组件就是首字母大写的函数&#xff0c;内部存放了组件的逻辑、UI&#xff0c;渲染组件只需要把组件当成标签书写。 使用组件有两种方式&#xff1a;自闭和 、成对标签 function App() {// 定义组件function Component() {return <div&…

从入门到入土:计算机视觉CV学习路线图

在当今这个被数据和图像淹没的世界&#xff0c;计算机视觉&#xff08;CV&#xff09;正如一位聪明绝顶的魔术师&#xff0c;能够从无数的图像中提取出有意义的信息。对于那些初入这个领域的新人&#xff0c;学习计算机视觉既是一场冒险&#xff0c;也是一场盛宴。让我作为一位…

安科瑞诚邀您参加2024年CDCE国际数据中心及云计算展

展会邀请 安科瑞&#xff08;Acrel&#xff09;诚挚邀请您和您的公司代表参观我们在2024年CDCE国际数据中心及云计算展上的展位。 安科瑞&#xff08;Acrel&#xff09;是一家集研发、生产、销售和服务于一体的企业&#xff0c;成立于2003年并于2012年在创业板上市&#xff0…

探索机器人快换盘技术的未来之路:智能化与协作的革新

在当今快速发展的科技时代&#xff0c;机器人已成为众多领域不可或缺的得力助手。其中&#xff0c;机器人快换盘技术作为提升机器人灵活性和应用广度的重要技术&#xff0c;正经历着前所未有的变革与创新。下面请随我们一起深入探讨这一技术的未来发展趋势。 一、人工智能&…

建投数据获得安防工程企业设计施工维护能力证书(壹级)

近日&#xff0c;经中国安全防范产品行业协会审核&#xff0c;建投数据顺利获得安防工程企业设计施工维护能力证书&#xff08;壹级&#xff09;。 安防工程企业设计施工维护资质是对企业安防工程设计、施工、维护等领域专业能力的综合认证&#xff0c;是衡量企业规模、工程业绩…

阿里云百炼SFT微调实践

1. 场景识别 用户进行SFT前需要对应用场景进行识别和分析&#xff0c;一般进行模型微调的诉求是希望提升对应业务场景的能力&#xff0c;用户需要明确哪些能力是需要进行重点提升的。 场景划分上来讲&#xff0c;以垂类场景进行划分可分为教育、医疗、金融、法律、电商、旅游、…