当前位置: 首页 > 知识库问答 >
问题:

我可以在单个存储过程中使用2个表吗

田志尚
2023-03-14

我正在尝试编写一个存储过程,其中我使用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 //

错误:

以下查询失败:“CREATE DEFINER=root@localhostPROCEDUREselect_track_notifications(在datePostedDATETIME中,在recipientIdINT中,在packageIdINT中,以及在.accountIdINT中)不确定性包含SQL安全定义器,如果dateposteds

共有1个答案

慕璞
2023-03-14
  • 您在语句的末尾有一个额外的<code>END</code>
  • 此外,您还需要将分隔符重置为<code> 在最后
  • 如果语法为<code>ELSEIF…则(Else和if之间没有空格)
  • 此外,我认为您可能需要使用<code>SELECT..INTO</code>子句将SELECT查询的结果存储到变量中(您将对这些变量执行进一步的操作)

请尝试以下方法:

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 ;
 类似资料:
  • 问题内容: 我可以使用Hibernate条件来调用存储过程吗? 问题答案: 请参阅参考文档中的使用存储过程进行查询。 映射的查询这样来称呼。 映射查询可以返回实体。

  • 问题内容: 我有一个MYSQL存储过程SP1(),它返回一个结果集。 我想在SP2()内部调用SP1()并遍历SP1()的结果集以执行一些其他工作。 我不想从SP1()中包含我的逻辑,因为这会使SP2()过于复杂。 有什么建议么? 谢谢。 问题答案: 您想做的事情听起来并不是特别好,也许您应该考虑重新设计这两个过程。但是,您可以执行以下操作来快速解决此问题: 使您的sp2 sproc将其中间结果写

  • 问题内容: 我有一个用户定义的类型,它是SqlServer数据库中的数据表。我一直在使用Database,DbCommand等调用存储过程并获取数据集。数据集很方便,因为它们可以包含多个表。 现在我想传入一个数据表,所以我尝试了: 但是我收到一个异常,指出“ @BASE_ITEMIDS”不是正确的类型:“传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。参数1(\“ @ BASE_

  • 我需要向3个服务发送消息,并在最后聚合结果 这很容易通过发布订阅频道实现- 当其中一个服务实际上是对其他服务的2次调用时,就会出现问题。现在我想介绍另外的和聚合器。 例如。 因此不会对消息进行分组(逐个发送)。 聚合器1从聚合器2获取结果并发送消息,无需等待service activator组1的消息。 有什么建议吗?

  • 问题内容: MySql存储过程/函数可以在不使用临时表的情况下返回表吗? 创建以下过程 然后用 显示示例表-正如预期的那样-但似乎无法进行以下操作: 是否可以从存储过程/函数中返回查询结果表,如果可以,怎么办? 问题答案: 就目前而言,这是不可能的。 以下是该子句中可能使用的 文档: 如您所见,存储过程不在此列表中。

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’