首页 > 解决方案 > MySql - 在while循环中插入表

问题描述

我有一个takes表,我想将每个成绩记录转换为数值并将其存储在grade_point表中。

在此处输入图像描述

我初始化grade_point为:

CREATE TABLE IF NOT EXISTS university.grade_point (
    id VARCHAR(5),
    grade VARCHAR(2),
    grade_value NUMERIC(2 , 1)
);

我可以按以下方式解决问题:

我可以编写以下查询:

insert into grade_point(id, grade, grade_value) 
SELECT 
    id,
    grade,
    CASE
        WHEN grade LIKE 'A' THEN 4.0
        WHEN grade LIKE 'A-' THEN 3.7
        WHEN grade LIKE 'B+' THEN 3.3
        WHEN grade LIKE 'B' THEN 3.0
    END AS grade_value
FROM
    takes;

我想知道我是否可以使用procedure?

灵感来自公认的解决方案如何循环遍历表的所有行(MySQL)

delimiter 
create procedure update_grade_point()
begin
declare n int default 0
declare i int default 0
select count(grade) from takes into n    
set i = 0
while i < n do
    insert into grade_point(id, grade, grade_value) 
    select id, grade, 
        case
            when grade like 'A' then 4.0
            when grade like 'A-' then 3.7
            when grade like 'B+' then 3.3
            when grade like 'B' then 3.0
        end as grade_value
    from
        takes
    limit i, 1;
    set i = i + 1
end while
end;
delimiter ;

但是,上述查询响应为:

0 行受影响,1 个警告:1050 表 'grade_point' 已存在

当删除grade_point表并重新执行查询时,我有以下响应

0 行受影响

表中没有插入任何内容grade_point

你能告诉我我的遗漏或错误procedure吗?

问候。

标签: mysql

解决方案


我不知道,当一个简单的插入就足够时,你为什么要这样做

但是 ij 一个存储过程,你会使用一个循环

CREATE TABLE IF NOT EXISTS  grade_point (
    id VARCHAR(5),
    grade VARCHAR(2),
    grade_value NUMERIC(2 , 1)
);
CREATE TABLE IF NOT EXISTS takes (
    id VARCHAR(5),
    grade VARCHAR(2)
);
INSERT INTO takes VALUES ("1","A"),("2","B"),("3","A"),("4","B")
CREATE PROCEDURE update_grade_point (

)
BEGIN
  DECLARE finished INTEGER DEFAULT 0;
  DECLARE _grade varchar(2) DEFAULT "";
  DECLARE _id varchar(5) DEFAULT "";

  -- declare cursor for employee email
  DEClARE curtakes 
      CURSOR FOR 
          SELECT id,grade FROM takes;

  -- declare NOT FOUND handler
  DECLARE CONTINUE HANDLER 
        FOR NOT FOUND SET finished = 1;

  OPEN curtakes;

  getidGrade: LOOP
      FETCH curtakes INTO _id,_grade;
      IF finished = 1 THEN 
          LEAVE getidGrade;
      END IF;
                insert into grade_point(id, grade, grade_value) VALUES (_id,_grade,        case
            when grade like 'A' then 4.0
            when grade like 'A-' then 3.7
            when grade like 'B+' then 3.3
            when grade like 'B' then 3.0
        end);
  END LOOP getidGrade;
  CLOSE curtakes;

END
CALL update_grade_point()
SELECT * FROM grade_point
编号 | 等级 | 等级值
:- | :---- | ----------:
1 | 一个 | 4.0
2 | 乙| 3.0
3 | 一个 | 4.0
4 | 乙| 3.0

db<>在这里摆弄


推荐阅读