MySQL-存储过程(头歌数据库实验题)

MySQL存储过程实验与自主练习

(学校数据库课程的头歌平台实验题,根据自己理解编写,希望对正在学的人有启发作用和借鉴帮助,不喜勿喷,有错请联系改正)

实验

存储过程:输入1

任务描述:

本关任务:编写一个存储过程,输入起始价格、价格分段长度、价格分段数,将Books表中处于某一区间段的价格数mSalePrice改为所在区间的起始数。比如输入0,5,10,则处理0-50的价格总区间,分段区间为[0,5),[5,9)....如果价格为7,则位于区间[5,9),将价格设置为5。建议使用循环语句进行编写。

AC代码:

  USE purchase_book;

#请在此处添加实现代码
########## Begin ##########
delimiter $$

create procedure MYPROC(in init decimal, in len decimal, in number decimal)
begin
  declare i int default 0;
  declare interval_start decimal;
  declare interval_end decimal;

  -- 循环遍历每个区间
  while i < number do
    -- 计算当前区间的起始和结束价格
    set interval_start = init + len * i;
    set interval_end = init + len * (i + 1); -- 减去0.01以确保区间是开区间
    
    -- 更新Books表中的价格
    update books
    set mSalePrice = interval_start
    where mSalePrice >= interval_start and mSalePrice < interval_end;
    
    -- 增加循环计数
    set i = i + 1;
  end while;
end$$

delimiter ;

########## End ##########  

存储过程:输入2

任务描述:

本关任务:编写一个存储过程。现有数据表books(cBookID char(10),mSalePrice decimal,cTypeID char(5))和booktype(cTypeID char(5),vTypeName varchar(100))。vTypeName包括(科技、经管、外语、文学、童书)五类书籍类别。输入一个书籍类别和一个标志符号,如果输入0,则把输入书籍类别价格乘以0.5,如果输入1,则将除了输入书籍类别的书籍的价格乘以0.5。存储过程声明如下:
create procedure MYPROC(in bookType varchar(100), in flag int)

AC代码:

  USE purchase_book;

#请在此处添加实现代码
########## Begin ##########
delimiter $$

create procedure MYPROC(in init decimal, in len decimal, in number decimal)
begin
  declare i int default 0;
  declare interval_start decimal;
  declare interval_end decimal;

  -- 循环遍历每个区间
  while i < number do
    -- 计算当前区间的起始和结束价格
    set interval_start = init + len * i;
    set interval_end = init + len * (i + 1); -- 减去0.01以确保区间是开区间
    
    -- 更新Books表中的价格
    update books
    set mSalePrice = interval_start
    where mSalePrice >= interval_start and mSalePrice < interval_end;
    
    -- 增加循环计数
    set i = i + 1;
  end while;
end$$

delimiter ;

########## End ##########  

存储过程:输出1

任务描述:

本关任务:编写一个存储过程。现有数据表books(cBookID char(10),vBookName varchar(100))以及
evaluation(cEvaluationID char(36),cBookID char(10),comment varchar(2000)
comment属性包括(非常好,很好,好,一般,差)。现在需要分别输出“非常好”最多的书名和相应“非常好”评价的数量到输出变量中。存储过程声明如下:
create procedure MYPROC(out bookname  varchar(100), out eval int)

AC代码:

  USE purchase_book;

#请在此处添加实现代码
########## Begin ##########
delimiter $$

create procedure MYPROC(out bookname varchar(100), out eval int)
begin
  select b.vBookName, count(*) as count into bookname, eval
  from evaluation e
  inner join books b on e.cBookID = b.cBookID
  where e.comment = '非常好'
  group by b.vBookName
  order by count desc
  limit 1;
end$$

delimiter ;
########## End ##########  

存储过程:输入输出1

任务描述:

本关任务:编写一个存储过程。现有数据表books(cBookID char(10),vBookName varchar(100),mSalePrice decimal, siQuantity smallint)。现在需要输入一个bookname varchar 变量和number int变量,找到价格小于bookname的、从大到小排在第number位的书籍,注意limit下标从0开始。然后将对应的vBookName赋值给bookname、siQuantity赋值给number。如果书籍不存在则给bookname赋值“not existed”。存储过程声明如下:
create procedure MYPROC(inout bookname  varchar(100), inout number int)

AC代码:

USE purchase_book;

DELIMITER //

CREATE PROCEDURE MYPROC(INOUT bookname VARCHAR(100), INOUT number INT)
BEGIN
    DECLARE found_book_name VARCHAR(100);
    DECLARE found_quantity SMALLINT;
    DECLARE book_price DECIMAL;
    DECLARE offset INT DEFAULT 0;
    
    -- 获取输入 bookname 对应的书籍价格
    SELECT mSalePrice INTO book_price
    FROM books
    WHERE vBookName = bookname;
    
    -- 检查是否找到了对应的书籍价格
    IF book_price IS NULL THEN
        SET bookname = 'not existed';
        SET number = 1;
    ELSE
        -- 计算LIMIT的起始值
        SET offset = number - 1;
        
        -- 查找价格小于输入 bookname 对应的书籍价格,从大到小排在第 number 位的书籍   
        SELECT vBookName, siQuantity INTO found_book_name, found_quantity
        FROM books
        WHERE mSalePrice < book_price
        ORDER BY mSalePrice DESC
        LIMIT offset, 1;

        IF found_book_name IS NULL THEN
            SET bookname = 'not existed';
            SET number = NULL;
        ELSE
            SET bookname = found_book_name;
            SET number = found_quantity;
        END IF;
    END IF;
END //

DELIMITER ;

因为limit语句第一个参数不能用表达式,所以用来一个offset变量来存储number-1,表示忽略前number-1个数据,返回后面的第一个数据。

存储过程:输入输出2

任务描述:

本关任务:编写一个存储过程。现有数据表books(cBookID char(10),vBookName varchar(100),mSalePrice decimal, siQuantity smallint)。现在需要输入一个价格变量price,找到离该价格最接近的价格和对应书籍,将找到的价格赋值给price。存储过程声明如下:
create procedure MYPROC(inout price decimal, out bookname varchar(100))

AC代码:

  USE purchase_book;

#请在此处添加实现代码
########## Begin ##########
DELIMITER $$

CREATE PROCEDURE MYPROC(INOUT price DECIMAL, OUT bookname VARCHAR(100))
BEGIN
    select mSaleprice, vBookName into price, bookname
    from books
    order by abs(price - mSaleprice)
    limit 1;
    
END $$

DELIMITER ;
########## End ##########  

这题主要是要想到用绝对值来排序就很好做了。

自主练习

存储过程:输入

任务描述:

本关任务:编写一个存储过程,输入基本销量baseQty,将销量(siQuantity)小于基本baseQty的商品的售价mSalePrice乘以cut数值。存储过程声明如下:
create procedure MYPROC(in baseQty decimal, in cut decimal(10,2))

AC代码:

USE purchase_book;

#请在此处添加实现代码
########## Begin ##########
delimiter $$
 
create procedure MYPROC(in baseQty decimal, in cut decimal(10,2))
begin
  update books
  set mSalePrice = mSalePrice * cut
  where siQuantity < baseQty;
end$$
 
delimiter ;
########## End ##########  

存储过程:输出

任务描述:

本关任务:编写一个存储过程,针对表books,如果siQuantity在0-99,则mSalePrice乘以0.9,如果siQuantity在100-499,则mSalePrice乘以1.1,否则乘以1.2。将书籍平均价格输出到price。存储过程声明如下:
create procedure MYPROC(out price decimal)

AC代码:

USE purchase_book;

#请在此处添加实现代码
########## Begin ##########

delimiter $$
 
create procedure MYPROC(out price decimal)
begin
  update books 
  set mSalePrice = mSalePrice*0.9
  where 0 <= siQuantity AND siQuantity <= 99;

  update books 
  set mSalePrice = mSalePrice*1.1
  where 100 <= siQuantity AND siQuantity <= 499;

  update books 
  set mSalePrice = mSalePrice*1.2
  where siQuantity<0 or siQuantity>=500;

  select avg(mSalePrice) into price
  from books;

end$$
 
delimiter ;
########## End ##########  

注意不能用0 <= siQuantity <= 99这种形式,这在Sql语法中是错误的。

存储过程:输入输出

任务描述:

本关任务:编写一个存储过程。现有数据表books(cBookID char(10),vBookName varchar(100),mSalePrice decimal, siQuantity smallint)和orderdetail(cOrderNo char, cBookID char, mSalePrice decimal, siQty smallint,mBookCost decimal),orders(cOrderNo,mTotalCost,vPayType varchar(20))。现在需要输入vPayType类型变量(包括 :网银、支付宝、微信),将对应的订单的总销量价值和最大订单销量价值取出放入变量totalCost和maxCost中。存储过程声明如下:
create procedure MYPROC(in paytype  varchar(20), out totalCost int, out maxCost int)

AC代码:

USE purchase_book;

#请在此处添加实现代码
########## Begin ##########
delimiter $$
 
create procedure MYPROC(in paytype  varchar(20), out totalCost int, out maxCost int)
begin
  select sum(mTotalCost), max(mTotalCost) into totalCost, maxCost
  from orders
  where vPayType = paytype;
end$$
 
delimiter ;
########## End ##########  

 (居然mTotalCost是销量)。。


(如果有帮助请点赞或评论支持,有问题请指正,其他问题请评论交流...) 

都看到这里了真不点个赞吗

### 关于头歌数据库实验九中存储过程的解析 存储过程是一种预编写的 SQL 脚本集合,能够实现特定的功能并提高数据库的操作效率[^1]。以下是针对头歌数据库实验九中可能涉及的存储过程设计的一个通用示例。 #### 示例代码:创建一个简单的存储过程 假设实验要求编写一个存储过程来计算员工工资总额,并将其更新到指定字段: ```sql DELIMITER $$ CREATE PROCEDURE UpdateTotalSalary(IN department_id INT, OUT total_salary DECIMAL(10, 2)) BEGIN DECLARE sum_salary DECIMAL(10, 2); -- 计算部门总薪资 SELECT SUM(salary) INTO sum_salary FROM employees WHERE dept_id = department_id; -- 更新总薪资至目标表 UPDATE departments SET total_salary = sum_salary WHERE id = department_id; -- 返回计算结果 SET total_salary = sum_salary; END$$ DELIMITER ; ``` 此代码片段展示了如何通过输入参数 `department_id` 来动态计算某个部门的总薪资,并将该值写入对应的数据库表中[^1]。同时,还利用了输出参数 `total_salary` 将结果反馈给调用者。 --- #### 数据库连接与 Text2SQL 的应用扩展 如果需要进一步结合实际场景(如自然语言查询),可以参考 Text2SQL 技术的应用方式[^2]。例如,在用户提问“某部门有多少名员工?”时,系统可以通过解析问题生成相应的 SQL 查询语句并与存储过程联动完成复杂逻辑运算。 以下是一个简化的 Python 接口用于调用 MySQL 中已存在的存储过程: ```python import mysql.connector def call_stored_procedure(department_id): connection = mysql.connector.connect( host="localhost", user="root", password="password", database="company_db" ) cursor = connection.cursor() result_args = [None] # 调用存储过程 cursor.callproc('UpdateTotalSalary', (department_id, result_args)) # 获取返回值 for result in cursor.stored_results(): print(result.fetchall()) cursor.close() connection.close() return result_args[0] ``` 上述脚本实现了从外部程序向数据库传递参数并通过存储过程获取处理后的数据功能。 --- #### 总结 以上内容涵盖了头歌数据库实验九中有关存储过程的核心知识点及其具体实现方法。通过合理运用这些技术手段不仅可以增强系统的灵活性还能有效减少冗余代码量从而达到更优的效果表现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wirepuller_king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值