创建一个MySQL过程来声明一个游标来 Select 姓氏,首先 从EMPLOYEE表中获取姓名、工资和雇用日期.每一行 并打印员工的信息,如果员工的 薪金超过50,000美元,雇用日期在1997年12月31日之前 (显式游标问题). 这是我正在创建过程的问题陈述,但是我收到一个接近loop:的错误消息.我无法理解错误的确切原因.这是我们的密码:

DELIMITER //

CREATE PROCEDURE GetHighEarnersBefore1998(IN salary_threshold DECIMAL(10,2))

BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE emp_last_name VARCHAR(50);
  DECLARE emp_first_name VARCHAR(50);
  DECLARE emp_salary DECIMAL(10,2);
  DECLARE emp_hire_date DATE;

  DECLARE emp_cursor CURSOR FOR SELECT last_name, first_name, salary, hire_date FROM EMPLOYEE;

  OPEN emp_cursor;

loop:
  FETCH emp_cursor INTO emp_last_name, emp_first_name, emp_salary, emp_hire_date;
  SET done = CURSOR_ROWCOUNT = 0;

  IF emp_salary > salary_threshold AND emp_hire_date < '1997-12-31' THEN
    SET done = TRUE;
    SELECT CONCAT(emp_last_name, ', ', emp_first_name), emp_salary, emp_hire_date;
  END IF;

  LEAVE loop WHEN done;
END LOOP;

  CLOSE emp_cursor;
END //

DELIMITER ;

推荐答案

若干 comments :

  • CURSOR_ROWCOUNT不是MySQL中的函数.您是否习惯使用IBM DB2?据我所知,这是唯一一个有the CURSOR_ROWCOUNT function个的SQL数据库品牌.

  • LEAVE <label> WHEN <condition>不是MySQL的有效语法,或据我所知任何其他品牌的SQL.Oracle有EXIT WHEN <condition>,但不是MySQL.

  • 你把循环标签和LOOP关键字搞混了.你读过documentation or examples个吗?

  • 如果在循环内的每次迭代中执行SELECT查询,则会导致过程返回多结果集.我不相信这是你想要的.

  • 假设您修复了语法错误,那么循环将在遇到不满足条件的第一行退出.但是您没有为游标查询指定任何ORDER BY,因此您不能保证您的结果将包括符合条件的所有行.即使您打算在不满足条件的第一行中止循环,但如果不指定ORDER BY,顺序也是任意的,因此即使是一致的,也不能依赖它.

  • 就像MySQL中几乎所有使用游标一样,你的游标并不需要.您可以在不使用游标或循环的情况下获得结果,并且可以在单个结果集中获得结果.

示例:

CREATE PROCEDURE GetHighEarnersBefore1998(IN salary_threshold DECIMAL(10,2))
BEGIN
  SELECT last_name, first_name, salary, hire_date 
  FROM EMPLOYEE
  WHERE salary > salary_threshold AND hire_date < '1997-12-31'; 
END

此过程将生成一个结果集.它更容易编码,更容易阅读.

Mysql相关问答推荐

MySQL InnoDB:可以在没有回滚损失的情况下从运行的查询中进行大型插入吗

MySQL:一个查询中的SELECT语句,用于从一个表中检索所有数据,并仅从另一个表中检索一个数据

布尔值之间的 SQL less/greater 比较会产生意外结果

GoRM中行最大值查询返回"0"

MySQL MDL(元数据锁)为什么会导致死锁?

带有 JOIN 和 WHERE 子句的 INSERT 语句

for each 查询设置 MySQL @@session.time_zone 而不是 CONVERT_TZ 的缺点?

java.lang.NullPointerException:无法调用com.proj.my.repository.OrderRepository.save(Object),因为this.orderRepository为空

mysql 执行注释部分

MySQL在定义表的位置后抛出错误

Select 多列但仅按 1 列分组

Over() 函数不覆盖表中的所有行

WHERE SQL 语句中的列顺序是否重要

使用带有 ELSEIF 和 ELSE 的 3 列更新问题

如何按给定开始日期和结束日期的月份汇总?

有没有办法在 Zend Framework 1.5 中执行INSERT...ON DUPLICATE KEY UPDATE?

如何在 MySQL 中为用户设置默认架构

在另一个 where 语句(子查询?)中使用一个 sql 查询的结果

如何计算表格的列数

MySQL查询/子句执行顺序