mysql - MySQL 中的 SELECT INTO 变量 - 如何检查结果是否存在以及如何使用结果执行 IF 语句?

标签 mysql sql stored-procedures

如何在存储过程中检查查询结果

SELECT start_date_time,length_time_interval_s FROM table LIMIT 1 INTO @date1, @length1

是一些数据(也就是select返回了一个匹配),那个数据匹配(或者不匹配)其他一些数据,根据检查结果做 Action ?我需要做类似的事情

  • 如果返回数据(找到行)
    • 如果变量@date1 和@length1 等于之前设置的@date2 和@length2
      • 插入 1
    • else(如果变量不等于@date2 和@length2)
      • 插入2
  • else(如果没有返回数据,则为0行)
    • 插入3

此外,我是否必须预先声明@date1 和@length1,否则它们将在选择期间声明?文档有点不清楚。

最佳答案

下面的过程应该做你想做的:

CREATE PROCEDURE my_procedure (IN date2 DATETIME, IN length2 DATETIME)
  BEGIN
    DECLARE date1   DATETIME;
    DECLARE length1 DATETIME;
    DECLARE found   INTEGER DEFAULT TRUE;

    DECLARE cursor1 CURSOR FOR
      SELECT start_date_time, length_time_interval_s
        FROM table;

    DECLARE CONTINUE HANDLER FOR NOT FOUND
      SET found = FALSE;

    OPEN cursor1;
    FETCH cursor1 INTO date1, length1;

    IF found THEN
      IF date1 IS NULL or length1 IS NULL OR date1 <> date2 OR length1 <> length2 THEN
        -- perform insert2
      ELSE
        -- perform insert1
      END IF;
    ELSE
      -- perform insert3
    END IF;

    CLOSE cursor1;
  END;

像往常一样,我将错误处理和消除语法错误留给读者作为练习。

一个潜在的陷阱:IF 条件假定 table,start_date_timetable.length_time_interval_s 可能是 NULL,而 date2time2 可能不会。如果规则不同,条件表达式也需要更改。

如果您希望我解释我的代码的任何部分,经过一夜安眠,我很乐意这样做。

关于mysql - MySQL 中的 SELECT INTO 变量 - 如何检查结果是否存在以及如何使用结果执行 IF 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37366088/

相关文章:

java - 如何为具有复合主键和外键的 oneToMany 关系创建 Hibernate 映射文件?

mysql - 你能用 MySQL 结果集中的字符串替换数字吗?

sql - 如何获取十张不同字段名的表中的公共(public)字段

mysql - 对带有负数的 ENUM 列使用 SUM()

mysql - 在MySql中使用具有多个小数点的数字(例如1.4.4),可能吗?

sql - 获取存储过程的源代码控制

mysql - 如果我将全局 event_scheduler 关闭,运行事件会发生什么

c# - WPF MVVM 组合框 SelectionChanged/SelectedItem

mysql - 查询删除表中原来输入的所有数据并插入新数据

sql-server - SQL Server 存储过程的单元测试