【MySQL】存储过程及游标

178 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

【MySQL】存储过程及游标

一、目的与要求:

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

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

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

二、实验内容:

  1. 创建函数,用来自动统计给定订单号的订单总金额

源码

create function OSum(n int)
returns decimal(8,2)
return (select sum(quantity*item_price) as ordersum
from orderitems 
where o_num = n);

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

在这里插入图片描述

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

①增加用户表信息user

在这里插入图片描述

create table user(
	id int(11) primary key auto_increment not null,
	u_id int(11) unique not null,
	pwd blob not null,
	remake varchar (255) not null
)

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

要求:id字段自动增加,u_id 字段即客户或供货商的编号,pwd字段用ENCODE函数加密,密码统一设置为'123456',密钥是'hello'; remark字段内容是‘customer'或'supplier’

-- 添加客户表帐号:
CREATE PROCEDURE insertC()
BEGIN

DECLARE numer INT;
DECLARE u_id INT(11); 
DECLARE inCus CURSOR FOR 
SELECT c_id from customers;
DECLARE CONTINUE HANDLER FOR 
NOT FOUND SET numer=1;
SET numer=0;
OPEN inCus;
FETCH next FROM inCus INTO u_id;
WHILE (numer=0) DO
INSERT INTO `user`(u_id,pwd,remake)
VALUES(u_id,ENCODE(123456,'hello'),'customers'); 
FETCH next FROM inCus INTO u_id;
END WHILE;
CLOSE inCus;

END

在这里插入图片描述

--添加供货商帐号:
CREATE PROCEDURE insertS()
BEGIN

DECLARE numer INT;
DECLARE u_id INT(11); 
DECLARE inSup CURSOR FOR 
SELECT s_id from suppliers;
DECLARE CONTINUE HANDLER FOR 
NOT FOUND SET numer=1;
SET numer=0;
OPEN inSup;
FETCH next FROM inSup INTO u_id;
WHILE (numer=0) DO
INSERT INTO `user`(u_id,pwd,remake)
VALUES(u_id,ENCODE(123456,'hello'),'supplier'); 
FETCH next FROM inSup INTO u_id;
END WHILE;
CLOSE inSup;

END

在这里插入图片描述

小结

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

在函数创建过程中,由于对该方面知识不够熟练遇到参数设置错误、属性不匹配等问题

2.产生的错误及原因分析

在实验过程中出现以下错误,原因为

在这里插入图片描述