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

时间:2019-07-07 12:24:35

标签: mysql variables stored-procedures

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

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)

1 个答案:

答案 0 :(得分:0)

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

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

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

但是,如果我可以提出建议,则此过程还有其他问题。我认为您正在使工作变得更加困难。

您不需要为任何这些使用准备好的语句。您可以将它们作为三个查询运行,并直接在查询中使用过程参数。但是,请将过程参数名称与要查询的列名称区分开,否则查询将变得模棱两可。

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

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

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

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

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

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”,但是您误解了将其固定为 / em>表示2019年。我确定他们将本年度称为0,无论他们将该过程称为什么年份。即明年,2020应该返回0,而2021应该返回1。您应该要求更完整的要求。