Строго говоря, ошибка, которую вы получили, вызвана этим:
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 для следующего года ", но вы неправильно поняли, что это fixed для 2019. Я уверен, что они имели в виду 0 для текущего года в любом году, когда они называют процедуру. То есть в следующем году 2020 должен вернуть 0, а 2021 должен вернуть 1. Вы должны запросить более полные требования.