1.创建三张表:
1.1.student
CREATE TABLE `student` (
`sid` int(10) NOT NULL DEFAULT 0 ,
`sname` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`classid` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`sid`)
)
插入数据:
INSERT INTO `student` VALUES (1, '小强', 1);
INSERT INTO `student` VALUES (2, '小刚', 2);
INSERT INTO `student` VALUES (3, '小明', 3);
INSERT INTO `student` VALUES (4, '小王', 1);
1.2.class
CREATE TABLE `class` (
`cid` int(10) NOT NULL DEFAULT 0 ,
`cname` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`cid`)
)
插入数据:
INSERT INTO `class` VALUES (1, '一班');
INSERT INTO `class` VALUES (2, '二班');
INSERT INTO `class` VALUES (3, '三班');
1.3.stu_info
CREATE TABLE `stu_info` (
`id` int(10) NOT NULL DEFAULT 0 ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`className` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
2.创建根据班级id获取班级名称的函数getClassName
CREATE FUNCTION `getClassName`(classId INTEGER)
RETURNS varchar(50) CHARSET utf8
DETERMINISTIC
BEGIN
#本函数根据传递进来的班级编号,获取它所在班级名称
DECLARE className VARCHAR(50) CHARSET utf8 DEFAULT '';
SELECT `cname` INTO className from class where cid=classId;
RETURN className;
END;
3.创建自动处理数据的存储过程process_data
CREATE PROCEDURE `process_data`()
BEGIN
#本存储过程用来根据student表和class表来加工生成stu_info表的数据
DECLARE done INT DEFAULT 0;
#定义stu_info表所需要的变量
DECLARE var_sid INTEGER(10);
DECLARE var_sname VARCHAR(50) CHARSET utf8 DEFAULT '';
DECLARE var_classid INTEGER(10);
DECLARE var_classname VARCHAR(50) CHARSET utf8 DEFAULT '';
#定义游标
DECLARE cur_student CURSOR FOR
SELECT sid,sname,classid from student;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
#循环处理纳税主体的数据
OPEN cur_student;
FETCH cur_student INTO var_sid,var_sname,var_classid;
WHILE done = 0 DO
#获取var_classid所对应的班级名称
SELECT getClassName(var_classid) INTO var_classname;
#插入数据
INSERT INTO stu_info VALUES(var_sid,var_sname,var_classname);
FETCH cur_student INTO var_sid,var_sname,var_classid;
END WHILE;
CLOSE cur_student;
END;
4.执行存储过程结果:
id name className
1 小强 一班
2 小刚 二班
3 小明 三班
4 小王 一班
5.注意:
在mysql中经常会出现:1366 - Incorrect string value: '\xE4\xB8\xAD\xE6\x96\x87' for column 'cName' at row 1类似的错误,这儿中错误主要是字符集问题导致的,一般都需要在定义变量,或者创建表的时候指定列或者变量的编码格式为utf8.