mysql存储过程

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值