使用游标的过程循环错误

时间:2015-12-05 11:29:51

标签: mysql sql stored-procedures cursor

我有这个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

我得到了这个结果:

enter image description here

但我的程序应该从超过2500的所有工资中删除500,并从2500以下的工资中删除200。 我试图将最终的SELECT查询放在循环中,但我得到5个标签,每个标签包含下面相同的图像。

1 个答案:

答案 0 :(得分:1)

模式

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语句都会返回一个结果集。通过走危险的光标路线,你返回了其中的五个。