【问题标题】:Can I use 2 tables in single stored procedure我可以在单个存储过程中使用 2 个表吗
【发布时间】:2019-03-17 09:10:58
【问题描述】:

我正在尝试编写一个存储过程,其中我使用 2 个表来根据条件获取数据,但它给出了错误。

我的 SP 是:

DELIMITER //
CREATE PROCEDURE select_notifications(IN datePosted DATETIME,IN recipientId INT,IN packageId INT,IN accountId INT)
BEGIN
 IF datePosted < NOW() THEN
  SELECT tn.subject_line,tn.message,tn.message_type FROM track_notifications AS tn WHERE tn.package_id=packageId AND tn.recipient_id=recipientId AND tn.account_id=accountId AND tn.date_posted = datePosted;
 ELSE IF datePosted > NOW()
  SELECT subject_line,message,message_type FROM track_notifications_new WHERE package_id=packageId AND recipient_id=recipientId AND account_id=accountId AND date_posted = datePosted;
 END IF;
END
END //

Mysql 错误:

以下查询失败:“CREATE DEFINER=root@localhost 程序select_track_notifications(IN datePosted DATETIME, IN recipientId INT,输入 packageId INT,输入 accountId INT) 不是 DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN IF datePosted NOW() THEN SELECT subject_line,message,message_type FROM track_notifications_new WHERE package_id=packageId AND recipient_id=recipientId AND account_id=accountId AND date_posted = datePosted;万一;结束”

【问题讨论】:

  • 你在ELSE IF条件之后忘记了THEN...
  • 我也已经尝试过了,但是得到了同样的错误,这就是为什么我在那个错误之后删除了
  • 你的这个错误是什么?
  • 更新了我的问题,请检查一次。
  • 每个 if 都必须有 then 和 end if(你的 else if 没有)并且你可能没有设置分隔符dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.html

标签: mysql stored-procedures


【解决方案1】:
  • 您的声明末尾有一个额外的END
  • 另外,您需要在最后将分隔符重置为;
  • 如果语法是 ELSEIF .... THEN 则为 Else(ELSE 和 IF 之间没有空格)。
  • 另外,我认为您可能需要使用 SELECT .. INTO 子句将选择查询的结果存储到变量中(您将在变量上执行进一步操作)。

请尝试以下方法:

DELIMITER //
DROP PROCEDURE IF EXISTS select_notifications //
CREATE PROCEDURE select_notifications(IN datePosted DATETIME,
                                      IN recipientId INT,
                                      IN packageId INT,
                                      IN accountId INT)
BEGIN
 IF datePosted < NOW() THEN
  SELECT tn.subject_line,
         tn.message,
         tn.message_type 
  FROM track_notifications AS tn 
  WHERE tn.package_id=packageId AND 
        tn.recipient_id=recipientId AND 
        tn.account_id=accountId AND 
        tn.date_posted = datePosted;

 ELSEIF datePosted > NOW() THEN 
  SELECT subject_line,
         message,
         message_type 
  FROM track_notifications_new 
  WHERE package_id=packageId AND 
        recipient_id=recipientId AND 
        account_id=accountId AND 
        date_posted = datePosted;
 END IF;
END //

DELIMITER ;

【讨论】:

  • @prasadchinthala 请阅读select .. into(答案中的链接)-您将在您的 SP 中需要它。
猜你喜欢
  • 2016-10-26
  • 2020-04-03
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2011-12-30
  • 2012-01-04
相关资源
最近更新 更多