Помогите с MySql кодом.
| |
Nizarius | Дата: Воскресенье, 28 Июля 2013, 03:20 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| В общем, прохожу обучающий урок по созданию Травиана (как примера браузерной стратегии), но там был устаревший Денвер. Теперь у меня mysql 5.5 и данный код не подходит. Мне надо создать игровую карту с двумя координатами (x и y).
Вот описание кода в уроке: "Сейчас, перед нами возник вопрос инициализации всех полей в создаваемой нами игре. Конечно мы может 255 раз написать SQL-запрос INSERT, но это не интересно и поступило предложение сделать хранимую процедуру на языке mySQL, чтоб генерация участков в таблице fields выглядела более компактно. Так как мы планируем не более 4 типов картинок для незанятых под поселки участков, то, следовательно процедура должна случайным образом формировать значение в поле fid_type таблицы fields. Но если Вы, вдруг, захотите увеличить количество картинок до 5 или 10, то лучше это предусмотреть сразу и, поэтому, мы будет передавать в процедуру генерации полей два аргумента:
1 - начальный номер генерируемого поля 2 - конечный номер генерируемого поля
В строке 1 мы объявляем создание процедуры с именем makefields и указываем, что ей нужно передавать два аргумента (param1 и param2, оба имеющие тип - целое число (int)). В строках с 4-6 мы объявляем три переменные x,y и st, которые будем использовать далее. В строках 7-8 мы открываем два цикла по координатам x и y (это обе наши ранее объявленные переменные). Так как каждый из этих циклов повторяется с 1 до 15, то, все что идет далее до строки 12 - повторится 15х15=225 раз. А это, не что иное как строки с 9 по 11. В 9 строке мы генерируем случайное число в диапазоне от param1 до param2. Это стандартная формула создания диапазона случайных чисел. И если мы передадим в процедуру makefields аргументы 1 и 4, то в строке 9 в переменную st сгенерируется число от одного до четырех и никак не иначе. Далее, в строке 10 Вы видите оператор SQL INSERT , который вставляет значения переменных x,y и сгенерированного значения переменной st в подготовленную нами ранее таблицу fields"
Вот сам код:
Код create procedure makefields (param1 int, param2 int) BEGIN declare x int default 1; declare y int default 1; declare st int default 0; WHILE y <= 15 DO WHILE x <= 15 DO SET st = RAND()*10 / (10 + 1) * ((param2 - param1) + param1)+0.5; insert into fields (xcoord,ycoord,fid_type) values (x,y,st); SET x = x+1; END WHILE; SET x = 1; SET y = y+1; END WHILE; END;
CALL makefields(1,4);
MySQL выдает ошибку: "Неполное SQl выражение" и указывает на строчку с "END;"
Такие процедуры повторяются пять раз в коде игры. И везде выдается данная ошибка с указанием на END. Объясните плиз, что надо исправить.
Сообщение отредактировал Nizarius - Воскресенье, 28 Июля 2013, 03:21 |
|
| |
HerrPotapov | Дата: Воскресенье, 28 Июля 2013, 19:08 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Интересное дело. Такая ошибка при поиске в гугле появляется только один раз... В этой теме. Пожалуйста, скопируй реальный текст ошибки
Добавлено (28.07.2013, 19:08) --------------------------------------------- А вообще попробуй добавить вот это. Насколько я знаю это опционально, но все же.
Код CREATE PROCEDURE `makefields` (IN param1 INT, IN param2 INT) LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT 'A procedure' BEGIN ...
Discord: alpotapov#1741
Интервью с разработчиком WarCastle - Читаем и вникаем!
Сообщение отредактировал HerrPotapov - Воскресенье, 28 Июля 2013, 19:10 |
|
| |
Nizarius | Дата: Воскресенье, 28 Июля 2013, 20:12 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| Цитата (HerrPotapov) Интересное дело. Такая ошибка при поиске в гугле появляется только один раз... В этой теме. Пожалуйста, скопируй реальный текст ошибки
Эта ошибка выдается в программе dbForge Studio for MySQL. Если вводить в самой базе данных (через денвер), то ошибка выдается следующая:
Код "SQL-запрос:
BEGIN DECLARE x INT DEFAULT 1;
Ответ MySQL:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'declare x int default 1' at line 2 " Добавлено (28.07.2013, 20:12) --------------------------------------------- А всё, спасибо за помощь. Надо теперь писать с delimiter. Код должен был выглядеть так:
Код DELIMITER //
create procedure makeresfields (p_fid int) BEGIN -- Фермы insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (253,280,1,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (304,273,1,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (262,332,1,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (315,325,1,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (461,360,1,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (386,196,1,p_fid); -- Рудники insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (269,228,2,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (434,305,2,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (490,306,2,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (483,249,2,p_fid); -- Лес insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (323,195,3,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (446,210,3,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (362,391,3,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (381,346,3,p_fid); -- Глина insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (360,236,4,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (425,255,4,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (308,378,4,p_fid); insert into res_fields (rf_xcoord,rf_ycoord,rft_id,fid) values (412,394,4,p_fid); END//
DELIMITER ;
CALL makeresfields(49); CALL makeresfields(67);
Сообщение отредактировал Nizarius - Воскресенье, 28 Июля 2013, 20:00 |
|
| |
|