本文已参与「新人创作礼」活动,一起开启掘金创作之路。
【MySQL】存储过程及游标
一、目的与要求:
1、掌握存储过程的工作原理、定义及操作方法
2、掌握函数的工作原理、定义及操作方法
3、掌握游标的工作原理、定义及操作方法
二、实验内容:
- 创建函数,用来自动统计给定订单号的订单总金额
源码
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.产生的错误及原因分析
在实验过程中出现以下错误,原因为