我尝试创建存储过程,但当我尝试我的代码时,它不工作,当我执行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)
发布于 2019-07-07 21:04:30
严格地说,您得到的错误是由以下原因引起的:
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”,但您误解了这一点将在2019年修复。我确信他们的意思是,无论他们称之为该过程的哪一年,当前年份的值都是0。例如,明年,2020应该返回0,2021应该返回1。您应该要求更完整的要求。
https://stackoverflow.com/questions/56922131
复制相似问题