Синтаксическая ошибка в хранимой процедуре MariaDB с параметром

Я пытаюсь создать процедуру для железнодорожной базы данных на phpmyadmin. В котором номер поезда, дата поезда и категория считываются с пассажира. На основе значений, предоставленных пассажиром, соответствующая запись извлекается из таблицы Train_Status. Если желаемой категорией является AC, то общее количество мест AC и количество забронированных мест AC сравниваются, чтобы определить, можно ли забронировать билет или нет. Точно так же его можно проверить и для общей категории. Если билет можно забронировать, то информация о пассажире считывается и сохраняется в таблице Passenger.

Я почесал голову над синтаксисом procdure, но он все еще дает ошибку. Пытался изменить синтаксис, удалить условие проверки из переменных, но ничего не работает.

Ошибка, которую он дает,

"#1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MariaDB для правильного использования синтаксиса рядом с 'CHECK (train_number>=1 AND train_number<=5); ОБЪЯВИТЬ t_date ДАТА; DECLA...' в строке 6"

Версия mariadb — 10.4.25.

Вот это я создал

DELIMITER $$

CREATE PROCEDURE Booking (t_num int(1), t_date DATE, category varchar(10) )

BEGIN


  DECLARE t_num int(1) CHECK (train_number>=1 AND train_number<=5);
  DECLARE t_date DATE;
  DECLARE category ENUM('AC', 'General');
  DECLARE status ENUM('Confirmed', 'Waiting');

  DECLARE getTrain CURSOR FOR
  SELECT * FROM Train_Status
  WHERE train_number = t_num AND train_date = t_date;
  DECLARE trec Train_Status % ROWTYPE;



DBMS_OUTPUT.PUT_LINE('READING VALUES');
t_num := &t_num;
t_date := '&t_date';
category := '&category';

OPEN getTrain;
LOOP 
FETCH FROM getTrain INTO trec;
EXIT WHEN getTrain % NOTFOUND;
IF(category = 'AC') THEN

 IF(trec.t_acseats - trec.b_acseats) > 0 THEN
  status := 'Confirmed';
DBMS_OUTPUT.PUT_LINE('Seat Confirmed');
ELSIF(trec.t_acseats - trec.b_acseats) > -2 THEN 
status := 'Waiting';
DBMS_OUTPUT.PUT_LINE('Seat Waiting');
ELSE
DBMS_OUTPUT.PUT_LINE('Seat Not Available');
EXIT;
END IF;
IF status = 'Confirmed' OR status = 'Waiting' THEN
UPDATE Train_Status SET b_acseats = b_acseats + 1 WHERE
  TrainNumber = t_num and TrainDate = t_date;
END IF;

ELSIF(category = 'General') THEN
 IF(trec.t_genseats - trec.b_genseats) > 0 THEN
  status := 'Confirmed';
DBMS_OUTPUT.PUT_LINE('Seat Confirmed');

ELSIF(trec.t_genseats - trec.b_genseats) > -2 THEN
 status := 'Waiting';
DBMS_OUTPUT.PUT_LINE('Seat Waiting');
ELSE
DBMS_OUTPUT.PUT_LINE('Seat Not Available');
EXIT;
END IF;
IF status = 'Confirmed' OR status = 'Waiting' THEN
UPDATE Train_Status SET b_genseats = b_genseats + 1 
WHERE TrainNumber = t_num and TrainDate = t_date;
END IF;

ELSE 
DBMS_OUTPUT.PUT_LINE('Invalid Category');
END IF;
IF status = 'Confirmed' OR status = 'Waiting' THEN
INSERT INTO Passengers
VALUES ('&T_ID', t_num, t_date, '&Name', &Age, '&Sex', '&Address', status, category);
END IF;
END LOOP;
CLOSE getTrain;
END $$

DELIMITER ;

Что такое сообщение об ошибке?

Jens 21.12.2022 17:09

В нем говорится: «# 1064 - у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с «ПРОВЕРИТЬ (номер_поезда> = 1 И номер_поезда <= 5); DECLARE t_date DATE; DECLA...' в строке 6"

Ahsan Ahmed 21.12.2022 17:11

Проверить там нельзя

Jens 21.12.2022 17:19

Вы скопировали хранимую процедуру Oracle в mariadb. Языки, используемые хранимыми процедурами, сильно различаются между продуктами РСУБД. Крайне маловероятно, что хранимая процедура из одного будет выполняться в другом без изменений. Эта хранимая процедура должна быть полностью переписана для mariadb, так как там используется множество синтаксиса/функций, которые не поддерживаются mariadb.

Shadow 21.12.2022 17:22

Я тоже пробовал без проверки, не получилось @Jens

Ahsan Ahmed 21.12.2022 17:26

значит не работал?

Jens 21.12.2022 17:28

Выдал ту же ошибку

Ahsan Ahmed 21.12.2022 17:29

Есть ли подходящее руководство по синтаксису MariaDB? По крайней мере, на их веб-сайте нет хорошей документации для процедур. @Тень

Ahsan Ahmed 21.12.2022 17:30

@AhsanAhmed, их веб-сайт - лучшая документация, которую я видел для MariaDB. Следует отметить, что язык хранимых процедур MariaDB намного менее развит, а значит, намного менее сложен, чем язык Oracle. Возможно, то, что вы воспринимаете как отсутствие документации, — это просто отсутствие функций. Например, документация по синтаксису оператора declare на их веб-сайте ясно показывает, что он не поддерживает опцию проверки...

Shadow 21.12.2022 17:56

Да, возможно, ты прав. Я делаю некоторые успехи в этом. Надеюсь, получится сделать это без ошибок. Спасибо за помощь.

Ahsan Ahmed 21.12.2022 18:00

Не стесняйтесь запросить и/или написать функцию.

danblack 21.12.2022 23:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
11
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Проверка не может использоваться при объявлении переменных. Там должно быть только имя и тип данных.
  1. Проверьте синтаксис курсора из документации MariaDB.

Эти две вещи решат ваши 70% проблем. Остальное можно понять.

Другие вопросы по теме