数据库实验七:存储过程实验

  • 233333,实验八的时候总感觉好像实验七计算的公式不太对,懒得改了就这样吧2333
    • 定义一个存储过程proc2,更新给定订单的(含税折扣价)的总价,执行这个存储过程。
    • 定义一个存储过程proc3,更新某个顾客的所有订单的(含税折扣价)总价,执行这个存储过程。
    • 定义一个存储过程proc4,更新某个顾客的所有订单的(含税折扣价)总价并输出该总价,执行这个存储过程。
    • 删除存储过程proc4。
    • 定义一个存储过程proc1,更新所有订单(含税折扣价)的总价,执行这个存储过程。
      • 先使用游标逐行更新lineitem表所有extendedprice,再使用更新后的extendedprice更新totalprice
        • lineitem更新前
        • orders更新前
        • 更新exetendedprice的循环一的执行
        • 使用更新后的extendedprice更新totalprice的循环二的执行
        • 更新后的lineitem和orders
        • 主要问题所在:DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 这个问题很大,如果游标只是遍历一个表,而且操作也只在这个表,那么用这个语句标志循环结束,可能一般情况都没有问题,比如循环一就可以实现,但是的但是:在循环二中要更新orders中的totalprice,游标设置在orders表上,但是有些orderkey并不存在于lineitem表的orderkey中,那么如果依然用这个done做结束标志的话:在循环里orderkey一旦出现在lineitem中select找不到的情况,done直接置TRUE,然后执行完后面语句到until那里一判断就跳出循环了,而实际上我们想的是在lineitem里面的没有orders中的某个orderkey的时候,直接去获取orders中的下一个orderkey看看在lineitem中有没有,如果有那么就使用lineitem的内容计算所有这种orderkey行的extendprice的总和,把这个值赋值给orders的totalprice就行,所以不能再使用这种循环结束方式,然后我计算了一下orders中的行数,用这个行数循环orders就行了

233333,实验八的时候总感觉好像实验七计算的公式不太对,懒得改了就这样吧2333

定义一个存储过程proc2,更新给定订单的(含税折扣价)的总价,执行这个存储过程。

含税折扣总价=extendedprice*(税率+1)*折扣

SELECT lineitem.extendedprice,lineitem.orderkey,lineitem.tax,lineitem.discount,orders.totalprice  FROM lineitem,orders WHERE orders.orderkey=18 && orders.orderkey=lineitem.orderkey;
DELIMITER $$
CREATE PROCEDURE proc2()
BEGINDECLARE sum_price numeric(10,2);UPDATE lineitem SET extendedprice = extendedprice * discount  * (1+tax) WHERE orderkey = 18;SELECT SUM(lineitem.extendedprice) INTO sum_price FROM lineitem WHERE orderkey = 18 GROUP BY orderkey;UPDATE orders SET totalprice = sum_price WHERE orderkey = 18;
END;$$
DELIMITER ;
CALL proc2();
SELECT lineitem.extendedprice,lineitem.orderkey,lineitem.tax,lineitem.discount,orders.totalprice  FROM lineitem,orders WHERE orders.orderkey=18 && orders.orderkey=lineitem.orderkey;

定义一个存储过程proc3,更新某个顾客的所有订单的(含税折扣价)总价,执行这个存储过程。

SELECT lineitem.extendedprice,lineitem.orderkey,lineitem.tax,lineitem.discount,orders.totalprice  FROM lineitem,orders WHERE orders.custkey=320728 && orders.orderkey=lineitem.orderkey;
DELIMITER $$
CREATE PROCEDURE proc3()
BEGINDECLARE sum_price numeric(10,2);UPDATE lineitem SET extendedprice = extendedprice * discount  * (1+tax) WHERE orderkey IN (SELECT orderkey FROM orders WHERE custkey = 320728);SELECT SUM(lineitem.extendedprice) INTO sum_price FROM lineitem,orders WHERE orders.custkey = 320728 && lineitem.orderkey=orders.orderkey GROUP BY orders.custkey;UPDATE orders SET totalprice = sum_price WHERE custkey = 320728;
END;$$
DELIMITER ;
CALL proc3();
SELECT lineitem.extendedprice,lineitem.orderkey,lineitem.tax,lineitem.discount,orders.totalprice  FROM lineitem,orders WHERE orders.custkey=320728 && orders.orderkey=lineitem.orderkey;

定义一个存储过程proc4,更新某个顾客的所有订单的(含税折扣价)总价并输出该总价,执行这个存储过程。

SELECT lineitem.extendedprice,lineitem.orderkey,lineitem.tax,lineitem.discount,orders.totalprice  FROM lineitem,orders WHERE orders.custkey=518445 && orders.orderkey=lineitem.orderkey;
DELIMITER $$CREATE PROCEDURE proc4()BEGINDECLARE sum_price numeric(10,2);UPDATE lineitem SET extendedprice = extendedprice * discount  * (1+tax) WHERE orderkey IN (SELECT orderkey FROM orders WHERE custkey = 518445);SELECT SUM(lineitem.extendedprice) INTO sum_price FROM lineitem,orders WHERE orders.custkey = 518445 && lineitem.orderkey=orders.orderkey GROUP BY orders.custkey;UPDATE orders SET totalprice = sum_price WHERE custkey = 518445;SELECT sum_price;
END;$$
DELIMITER ;
CALL proc4();
SELECT lineitem.extendedprice,lineitem.orderkey,lineitem.tax,lineitem.discount,orders.totalprice  FROM lineitem,orders WHERE orders.custkey=518445 && orders.orderkey=lineitem.orderkey;

删除存储过程proc4。

DROP PROCEDURE proc4;

定义一个存储过程proc1,更新所有订单(含税折扣价)的总价,执行这个存储过程。

先使用游标逐行更新lineitem表所有extendedprice,再使用更新后的extendedprice更新totalprice

lineitem更新前

orders更新前

DELIMITER $$
CREATE PROCEDURE proc1()
BEGINDECLARE totalprice_y numeric(10,2);DECLARE totalprice_x numeric(10,2); DECLARE count INT; #统计一共多少行DECLARE orderkey_y INT;/*orderkey 和 linenumber联合做主键,这里取这俩*/DECLARE linenumber_y INT;DECLARE extendedprice_y DECIMAL(15,2);DECLARE discount_y DECIMAL(3,2);DECLARE tax_y DECIMAL(3,2);DECLARE count_y INT DEfAULT 0;DECLARE done2 INT DEFAULT 0;DECLARE orderkey_u INT;DECLARE count2 INT;DECLARE count3 INT;DECLARE done BOOLEAN DEFAULT FALSE; DECLARE orderkey_x CURSOR FOR SELECTorderkey,linenumber,extendedprice,discount,tax FROM lineitem;DECLARE orderkey_z CURSOR FOR SELECTorderkey,totalprice FROM orders;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;#找不到的时候done置TRUE SELECT COUNT(DISTINCT orderkey) INTO count FROM lineitem; SELECT COUNT(DISTINCT orderkey) INTO count2 FROM orders;SET count3 = count2;#更新lineitem的所有extendedpriceOPEN orderkey_x;FETCH orderkey_x INTO orderkey_y,linenumber_y,extendedprice_y,discount_y,tax_y;
REPEATSET extendedprice_y = extendedprice_y * discount_y * (1.00 + tax_y);UPDATE lineitem SET extendedprice = extendedprice_y  WHERE orderkey = orderkey_y AND linenumber = linenumber_y;SELECT orderkey_y,linenumber_y,extendedprice_y,discount_y,tax_y,count_y;SET count_y = count_y + 1;FETCH orderkey_x INTO orderkey_y,linenumber_y,extendedprice_y,discount_y,tax_y;UNTIL done END REPEAT;
CLOSE orderkey_x;#更新orders的所有totalpriceOPEN orderkey_z;FETCH orderkey_z INTO orderkey_y,totalprice_y;WHILE count2 > 0 DO#orderkey_y取自orders,如果在lineitem中也存在,将orderkey_u=orderkey_y;
SELECT orderkey INTO orderkey_u FROM lineitemWHERE orderkey = orderkey_y GROUP BY orderkey;
#如果orderkey_u = orderkey_y; 计算该orderkey下的订单总和,否则done2置1
IF orderkey_u = orderkey_y THEN
SELECT SUM(extendedprice) INTO totalprice_x FROM lineitemWHERE orderkey = orderkey_u GROUP BY orderkey ;
SET done2 = 0;
ELSE
SET done2 = 1;
END IF;IF done2 = 0 THEN
UPDATE orders SET totalprice = totalprice_x WHERE orderkey = orderkey_y;
SELECT orderkey_y,totalprice_y as old_price, totalprice_x as new_price;
ELSE
SELECT orderkey_y,"该orderkey不在lineitem中";
END IF;SET done2 = 0;
FETCH orderkey_z INTO orderkey_y,totalprice_y;
SET count2 = count2 - 1;
END WHILE;CLOSE orderkey_z;select count_y as orderkey_linenumber_count_in_lineitem , count as distinct_orderkey_count_in_lineitem,count3 as orderkey_count_in_orders;
END$$
DELIMITER ;
CALL proc1();
更新exetendedprice的循环一的执行

使用更新后的extendedprice更新totalprice的循环二的执行

更新后的lineitem和orders

主要问题所在:DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 这个问题很大,如果游标只是遍历一个表,而且操作也只在这个表,那么用这个语句标志循环结束,可能一般情况都没有问题,比如循环一就可以实现,但是的但是:在循环二中要更新orders中的totalprice,游标设置在orders表上,但是有些orderkey并不存在于lineitem表的orderkey中,那么如果依然用这个done做结束标志的话:在循环里orderkey一旦出现在lineitem中select找不到的情况,done直接置TRUE,然后执行完后面语句到until那里一判断就跳出循环了,而实际上我们想的是在lineitem里面的没有orders中的某个orderkey的时候,直接去获取orders中的下一个orderkey看看在lineitem中有没有,如果有那么就使用lineitem的内容计算所有这种orderkey行的extendprice的总和,把这个值赋值给orders的totalprice就行,所以不能再使用这种循环结束方式,然后我计算了一下orders中的行数,用这个行数循环orders就行了

数据库实验七:存储过程实验相关推荐

  1. 数据库实验七 存储过程实验

    1.实验目的 掌握数据库存储过程的设计和使用方法. 2.实验内容和要求 存储过程的定义,存储过程运行,存储过程更名,存储过程删除.    3.实验步骤 (1)定义一个存储过程proc1,更新所有订单( ...

  2. 数据库实验 实验七 存储过程与触发器

    注:此内容仅仅只是记录成长与分享学习,不能保证绝对正确 实验七 存储过程与触发器 实验日期: 2022 年 5 月 20 日  星期 五  实验地点: 宿舍 一 实验目的 1. 掌握SQL Serve ...

  3. 实验六——存储过程实验

    实验六--存储过程实验 一.实验题目 二.实验目的 三.实验过程 (一)准备数据表 (二)存储过程实验 [存储过程简介] [存储过程优点] 1.创建存储过程 2.查看存储过程 3.修改存储过程 4.删 ...

  4. c语言实验七实验报告,C语言实验七 数 实验报告.doc

    C语言实验七 数 实验报告 C语言程序设计 实 验 报 告 实验题目 实验七 函数 实验目的 掌握函数定义的方法: 掌握函数实参与形参的对应关系,以及值传递的方式. 掌握函数的嵌套调用和递归调用的方法 ...

  5. c语言实验七 函数实验报告,C语言实验七函数实验报告.doc

    C语言实验七函数实验报告 C语言程序设计 实 验 报 告 实验题目 实验七 函数 实验目的 掌握函数定义的方法: 掌握函数实参与形参的对应关系,以及值传递的方式. 掌握函数的嵌套调用和递归调用的方法: ...

  6. matlab第二版实验七,matlab实验七.doc

    matlab实验七 实验七 控制系统的频率特性1.实验目的 1) 掌握运用MATLAB软件绘制控制系统波特图的方法: 2) 掌握MATLAB软件绘制奈奎斯特图Nyquist)的方法: 3) 利用波特图 ...

  7. matlab 实验七,matlab 实验七 数字填图问题

    实验七 数字填图问题 数字填图问题是数学问题的一种趣味形式.早在19世纪后半期,一些数学家就在报刊中大量使用数字填图游戏和字谜游戏等,目的是使业余爱好者也能通过简单的形式去认识.理解和琢磨深奥的数学问 ...

  8. 实验七 MapReduce实验:计数器

    实验指导: 7.1 实验目的 基于MapReduce思想,编写计数器程序. 7.2 实验要求 能够理解MapReduce编程思想,然后会编写MapReduce版本计数器程序,并能执行该程序和分析执行过 ...

  9. 大一python实验答案实验七_实验七参考答案

    (一) SQL 的定义功能 1 .用 SQL 的定义命令创建一个职工表( zg.dbf ) , 表结构如下所示. 字段名 类型 宽度 小数点 职工号 C 4 姓名 C 8 性别 C 2 出生日期 d ...

  10. 山东大学 2020级数据库系统 实验七

    What's more 山东大学 2020级数据库系统 实验一 山东大学 2020级数据库系统 实验二 山东大学 2020级数据库系统 实验三 山东大学 2020级数据库系统 实验四 山东大学 202 ...

最新文章

  1. 【云周刊】第208期:阿里云MWC 2019发布7款重磅产品,助力全球企业迈向智能化...
  2. C#正则表达式获取组名,按照组名输出匹配内容
  3. 文件还原工具Foremost
  4. python打印文件中的前三行_linux利用grep查看打印匹配的下几行或前后几行的命令...
  5. 计算机专业课的教学准备,计算机专业课程教学中的分层教学模式
  6. pythonwebview自动化测试_GitHub - githubwzg/python-appium: 基于PageObject UI自动化测试框架,支持Android/iOS...
  7. [BZOJ3676][Apio2014]回文串
  8. Bailian3180 整数减法【大数】
  9. 关键字 : this /self / parent
  10. 回溯策略的汉诺塔问题
  11. 网吧服务器系统ghost,深度网吧GHOST辅助工具
  12. Microchip PIC系列8位单片机入门教程(五)定时器
  13. 应用matlab快速实现实验对象随机分组,应用MATLAB快速实现实验对象随机分组
  14. static关键字详解
  15. 视频剪辑工具,视频怎样批量加背景音乐和特效
  16. 创建输入控件(input控件、文本框、密码框、单项选择、多项选择、重置与提交按钮的设置)
  17. MFC怎么封装CreateWindow
  18. oracle转换人民币,月光软件站 - 编程文档 - 数据库 - 如何在ORACLE中實現人民幣大寫的轉換...
  19. 全球与中国硅外延片市场深度研究分析报告
  20. 使用html语言检测鼠标微动是否发生双击

热门文章

  1. Java基础语法(九)——String类
  2. 数据库—查询(有无回调函数)
  3. Just for fun----zjfc 并查集操作
  4. JDK有BUG!!!
  5. C#网络编程复习资料
  6. 中文,拼音分词使用练习记录
  7. 3月23—3月27日三年级课程
  8. VS Code 使用火狐 FireFox 调试网页
  9. CentOS7忘记root密码,重置root密码
  10. C语言 计算某年某月某日是这一年的第几天