Операнд ошибки MySQL должен иметь 1 столбец хранимой процедуры - PullRequest
0 голосов
/ 07 июля 2019

я пытаюсь создать хранимую процедуру, но когда я пробую свой код, он не работает, моя проблема появляется на @tgl, когда я выполняю SP, почему у ее операнда ошибки должен быть 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 голосов
/ 07 июля 2019

Строго говоря, ошибка, которую вы получили, вызвана этим:

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. Вы должны запросить более полные требования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...