我有一个 MySQL 过程,我使用游标来:
CREATE DEFINER=`root`@`localhost` PROCEDURE `tax_to_salary`()
BEGIN
DECLARE basic_salary INTEGER;
DECLARE new_salary INTEGER;
DECLARE done INTEGER;
declare count INTEGER;
DECLARE counter INTEGER default 0;
DECLARE cur1 CURSOR FOR SELECT salary FROM employee;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
SELECT count(id) INTO count FROM employee;
SET @counter:=0;
OPEN cur1;
l1:LOOP
FETCH cur1 INTO basic_salary;
SET @counter:=@counter+1;
IF @counter>count THEN
leave l1;
end if;
IF basic_salary>2500 THEN
SET @new_salary := 500;
SET @basic_salary := @basic_salary - @new_salary;
else
SET @new_salary := 200;
SET @basic_salary := @basic_salary - @new_salary;
END IF;
SELECT emp_name, salary, basic_salary AS 'Salary after taxes' FROM employee;
END LOOP;
END
我得到了这个结果:
但是我的程序应该从所有超过 2500 的工资中删除 500,并从低于 2500 的工资中删除 200。 我尝试将最终的 SELECT 查询放入循环中,但我得到了 5 个选项卡,并且每个选项卡都包含与下图相同的内容。
最佳答案
架构
create table employee
( id int auto_increment primary key,
emp_name varchar(100) not null,
salary int not null
);
insert employee (emp_name,salary) values
('John',4400),
('Sarah',2700),
('Peter',2150),
('Ali',2650),
('Ashley',2650);
请注意,您的语言大于 2500,并且您说小于 2500。但它没有要求工资完全等于 2500。因此,下面是对该概念的一个修正(否则就没有减少)。
情况
最适合多种条件,但并非您的条件具备
select emp_name,salary,
CASE when salary>=2500 then salary-500
ELSE
salary-200
END as modified_salary
from employee;
+----------+--------+-----------------+
| emp_name | salary | modified_salary |
+----------+--------+-----------------+
| John | 4400 | 3900 |
| Sarah | 2700 | 2200 |
| Peter | 2150 | 1950 |
| Ali | 2650 | 2150 |
| Ashley | 2650 | 2150 |
+----------+--------+-----------------+
如果
对于像您这样的简单条件
select emp_name,salary,
if(salary>=2500,salary-500,salary-200) as modified_salary
from employee;
+----------+--------+-----------------+
| emp_name | salary | modified_salary |
+----------+--------+-----------------+
| John | 4400 | 3900 |
| Sarah | 2700 | 2200 |
| Peter | 2150 | 1950 |
| Ali | 2650 | 2150 |
| Ashley | 2650 | 2150 |
+----------+--------+-----------------+
没有理由像现在这样使用逐行游标。这就是人们刚开始使用 sql 时有时会做的事情。它们不仅慢,常常慢得令人难以忍受,而且使您无法利用关系的力量,而关系的力量使 sql 大放异彩。
换句话说,您正在尝试编写过程代码,并通过帮助 sql 引擎以这种思维方式解决问题来参与其中。它不希望以这种方式进行优化。你可以,但你会严重减慢速度。
正如您所说,您获得多个选项卡的原因是,根据您的策略,即使它在数字方面运行良好,每个 select 语句也会返回一个结果集。通过走危险的光标路线,您返回了其中的五个。
关于mysql - 使用游标的过程循环中出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34104334/