mysql - 使用游标的过程循环中出错

标签 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 个选项卡,并且每个选项卡都包含与下图相同的内容。

最佳答案

架构

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/

相关文章:

mysql - 构建 docker 镜像时初始化数据库脚本的最佳方法

php - 在 Laravel 中获取数据时获取重复行

mysql - MySQL 是否支持括号通配符?

MySQL 查询中的子查询

oracle - PL/SQL : Procedures Successful with compilation error

java - 在 Java 代码中启动 Oracle 存储过程

php - 注意: Array to string conversion in line 6! SQL问题

php - While 循环仅在 HTML 中显示 1 个结果

sql - 递归选择并连接相关表

postgresql - 另一个存储过程语法错误 - IF-THEN-ELSE