首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql错误操作数应具有%1列存储过程

mysql错误操作数应具有%1列存储过程
EN

Stack Overflow用户
提问于 2019-07-07 20:24:36
回答 1查看 24关注 0票数 0

我尝试创建存储过程,但当我尝试我的代码时,它不工作,当我执行SP时,我的麻烦在@tgl上,为什么它的错误操作数应该有1列

代码语言:javascript
复制
BEGIN

SET @book = booking_id;



set @tgl = concat(("d"),('SELECT RIGHT(booking_checkin ,2) as date FROM pt_bookings WHERE booking_id = ',@book));

set @month =concat('SELECT mid(booking_checkin ,6,2) as month FROM pt_bookings WHERE booking_id = ',@book);

set @year = concat('SELECT IF(left(booking_checkin ,4)  = "2019", "0", "1") as year FROM pt_bookings WHERE booking_id = ',@book);


PREPARE stmt FROM @year;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

PREPARE stmt FROM @month;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

PREPARE stmt FROM @tgl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


END

我对@tgl的期望是数字+d (22d)

EN

回答 1

Stack Overflow用户

发布于 2019-07-07 21:04:30

严格地说,您得到的错误是由以下原因引起的:

set @tgl = concat(("d"),('SELECT... ',@book));

您可以连接字符串列表,但不能连接元组列表。你

但如果我可以提一些建议,你在这个过程中还有其他问题。我觉得你让事情变得更难了。

您不需要对其中的任何一个使用准备好的语句。您可以只将它们作为三个查询来运行,并直接在查询中使用过程参数。但是要使过程参数名与要查询的列名不同,否则查询将不明确。

代码语言:javascript
复制
CREATE PROCEDURE WhateverYourProcNameIs(IN in_booking_d INT)
BEGIN

  SELECT RIGHT(booking_checkin ,2) as date 
  FROM pt_bookings WHERE booking_id = in_booking_id;

  SELECT mid(booking_checkin ,6,2) as month 
  FROM pt_bookings WHERE booking_id = in_booking_id;

  SELECT IF(left(booking_checkin ,4)  = '2019', '0', '1') as year 
  FROM pt_bookings WHERE booking_id = in_booking_id;

END

这将生成三个查询结果,这可能不是您想要的结果,因为您必须编写更复杂的客户端代码才能得到第二个和第三个查询结果。

我认为您可能需要一个包含三列的查询结果。因此,您可以按以下方式编写此代码:

代码语言:javascript
复制
CREATE PROCEDURE WhateverYourProcNameIs(IN in_booking_d INT)
BEGIN

  SELECT RIGHT(booking_checkin ,2) as date, 
         MID(booking_checkin ,6,2) as month, 
         IF(LEFT(booking_checkin ,4)  = '2019', '0', '1') as year 
  FROM pt_bookings WHERE booking_id = in_booking_id;

END

我将使用内置函数进一步简化代码:

代码语言:javascript
复制
CREATE PROCEDURE WhateverYourProcNameIs(IN in_booking_d INT)
BEGIN

  SELECT DAY(booking_checkin) as date, 
         MONTH(booking_checkin) as month, 
         YEAR(booking_checkin) as year 
  FROM pt_bookings WHERE booking_id = in_booking_id;

END

我不知道你是怎么处理将2019转换为0和其他年份转换为1的表达式的,但这似乎不是一个好主意。那么2018、2020、2021、2022、2023以及随后的任何一年都是“1”吗?那也太没道理了。

哦,我猜要求是“本年度返回0,明年返回1”,但您误解了这一点将在2019年修复。我确信他们的意思是,无论他们称之为该过程的哪一年,当前年份的值都是0。例如,明年,2020应该返回0,2021应该返回1。您应该要求更完整的要求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56922131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档