Я пытаюсь создать процедуру для железнодорожной базы данных на 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 ;
В нем говорится: «# 1064 - у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с «ПРОВЕРИТЬ (номер_поезда> = 1 И номер_поезда <= 5); DECLARE t_date DATE; DECLA...' в строке 6"
Проверить там нельзя
Вы скопировали хранимую процедуру Oracle в mariadb. Языки, используемые хранимыми процедурами, сильно различаются между продуктами РСУБД. Крайне маловероятно, что хранимая процедура из одного будет выполняться в другом без изменений. Эта хранимая процедура должна быть полностью переписана для mariadb, так как там используется множество синтаксиса/функций, которые не поддерживаются mariadb.
Я тоже пробовал без проверки, не получилось @Jens
значит не работал?
Выдал ту же ошибку
Есть ли подходящее руководство по синтаксису MariaDB? По крайней мере, на их веб-сайте нет хорошей документации для процедур. @Тень
@AhsanAhmed, их веб-сайт - лучшая документация, которую я видел для MariaDB. Следует отметить, что язык хранимых процедур MariaDB намного менее развит, а значит, намного менее сложен, чем язык Oracle. Возможно, то, что вы воспринимаете как отсутствие документации, — это просто отсутствие функций. Например, документация по синтаксису оператора declare на их веб-сайте ясно показывает, что он не поддерживает опцию проверки...
Да, возможно, ты прав. Я делаю некоторые успехи в этом. Надеюсь, получится сделать это без ошибок. Спасибо за помощь.
Не стесняйтесь запросить и/или написать функцию.
- Проверка не может использоваться при объявлении переменных. Там должно быть только имя и тип данных.
- Проверьте синтаксис курсора из документации MariaDB.
Эти две вещи решат ваши 70% проблем. Остальное можно понять.
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
Что такое сообщение об ошибке?