【问题标题】:SELECT INTO variable in MySQL - how to check that result exists and how to execute IF statements using the result?MySQL 中的 SELECT INTO 变量 - 如何检查结果是否存在以及如何使用结果执行 IF 语句?
【发布时间】:2016-05-21 17:30:54
【问题描述】:

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

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

是一些数据(即select返回了一个匹配),那个数据匹配(或不匹配)一些其他数据,并根据检查结果做出动作?我需要做类似的事情

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

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

【问题讨论】:

  • 您已经使用可以轻松转换为 SQL 语句的伪代码回答了您自己的问题。但问题是,您的 date2length2 参数在哪里定义?它们是存储过程参数吗?
  • @JonathonOgden 基本上我的问题是我应该写什么 SQL 语句,例如首先检查
  • 试试IS NOT NULLIF @date1 IS NOT NULL AND @length1 IS NOT NULL THEN.
  • 快速回答您的问题之一:您不必在 select 语句中使用之前声明变量。

标签: mysql sql stored-procedures


【解决方案1】:

以下过程应该做你想做的事:

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 可能不是。如果规则不同,条件表达式也需要改变。

如果您希望我解释我的代码的任何部分,我很乐意在好好休息一晚后这样做。

【讨论】:

    【解决方案2】:

    使用 If Exists 检查,是否返回数据(找到行)

    If Exists (SELECT start_date_time,length_time_interval_s FROM table LIMIT 1 INTO @date1, @length1)
    Then
            Some condition for insert1 or insert2
    Else
            Insert3
    End If
    

    【讨论】:

      猜你喜欢
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 2013-10-18
      • 2011-02-09
      • 1970-01-01
      相关资源
      最近更新 更多