存储过程——循环复制分表

  • 目的

把表(ejex_questions_jn)的数据分别添加到表(ejex_questions_item1)与表(ejex_questions1)中

数据格式

ejex_questions_jn(表A)

ejex_questions_item1(表B)

ejex_questions1(表C)

把表A数据中的first、second、third字段拼接成一个字段与topic、type、diff数据复制到表C中;表A数据中的options以##拆分开复制到表B中,并把ABCD提出来以及排序,表B表C相关联

  • 存储过程
drop procedure if exists insert_questions;
DELIMITER $$
CREATE PROCEDURE insert_questions()
BEGIN
	DECLARE qt_type VARCHAR(10);
	DECLARE qt_diff VARCHAR(20);
	DECLARE qt_topic TExt;
	DECLARE qt_options TExt;
    DECLARE qt_point1 TEXT; -- 知识点
    DECLARE qt_point2 TEXT;
    DECLARE qt_point3 TEXT;
    DECLARE qt_points TEXT;
	
	DECLARE item_title TExt;
	DECLARE qt_id int;
	declare item_abc varchar(20);-- A B C D
	declare item_seq int(10);-- 选项顺序

	-- 遍历数据结束标志
	DECLARE done INT DEFAULT FALSE;
	-- 游标
	DECLARE cur_que CURSOR FOR (select topic,type,diff,options,first,second,third from ejex_questions_jn);
	-- 将结束标志绑定到游标
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	-- 打开游标
	OPEN  cur_que;      
		-- 遍历
		my_loop: LOOP
			FETCH cur_que INTO qt_topic,qt_type,qt_diff,qt_options,qt_point1,qt_point2,qt_point3;  -- 取值 取多个字段
            SET qt_points = concat(qt_point1,'、',qt_point2,'、',qt_point3); -- 知识点拼接成一个字符串
            
			IF done THEN
				LEAVE my_loop;
			END IF;

			-- 插入试题
			INSERT INTO ejex_questions1(title,questions_type,degree,point) values(qt_topic,qt_type,qt_diff,qt_points);
            SET qt_id = LAST_INSERT_ID(); -- 试题id
            
            # 选项
			set item_seq = 1;-- 选项顺序
			SET item_title = SUBSTRING_INDEX(qt_options,'##',1);
			WHILE trim(qt_options) is not null && char_length(trim(qt_options)) <> 0
				DO 
				# set item_abc = substring_index(item_title,'、',1);
                set item_abc = LEFT(item_title,1); -- 截取选项中第一个字符,(A,B,C,D)
				SET qt_options = RIGHT(qt_options,char_length(qt_options)-char_length(item_title)-2); -- 剩余值
				set item_title = RIGHT(item_title,char_length(item_title)-2);-- 去掉前面的 A、B、 等
				INSERT INTO ejex_questions_item1(question_id,title,abc,seq) VALUES (qt_id,item_title,item_abc,item_seq);
				SET item_title = SUBSTRING_INDEX(qt_options,'##',1);
				set item_seq = item_seq + 1;
			END WHILE;
            
		END LOOP my_loop;
	CLOSE cur_que;

END$$
DELIMITER 

call insert_questions(); -- 调用
  • 期间遇到问题
  1. 中文字符计算长度:char_length() 并非 length()
  2. 不能使定义的变量(declare)与select中查询的字段名相同,否则数据为空

猜你喜欢

转载自blog.csdn.net/qq_26075861/article/details/81113234