Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2012, 20:53   #1
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию MySQL. Хранимая процедура зависает при выполнении

Приует. Работаю в phpmyadmin, написал процедуру, она проверяет некоторые поля некоторой таблицы на заянятость. если первое поле свободно. то в него заносятся данные и все, если это поле зайнято. то проверяется следующий столбец. Так вот, когда выполняю эту процедуру в phpmyadmin, то все зависает, никаких сообщений об ошибке или о удачном выполнении нету, просто надпись - выполняется запрос, или типа того (у меня на украинском все), так вот оно выполняется очень долго, а в поля в таблицах никак не изменяются. Что в этой процедуре не так?
Код:
DROP PROCEDURE `insert_new_char`;
CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_new_char`(IN `nick` VARCHAR(20), IN `idd` INT(11)) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER BEGIN
SELECT @n:=num FROM id_and_char_id WHERE id=idd;
IF @n<5 THEN
SELECT @var1:=ch1 FROM id_and_char_id WHERE id=idd;
SELECT @var2:=ch2 FROM id_and_char_id WHERE id=idd;
SELECT @var3:=ch3 FROM id_and_char_id WHERE id=idd;
SELECT @var4:=ch4 FROM id_and_char_id WHERE id=idd;
SELECT @var5:=ch5 FROM id_and_char_id WHERE id=idd;
IF @var1!=0 THEN
UPDATE id_and_char_id SET ch1=nick WHERE id=idd;
UPDATE id_and_char_id SET num=@n+1 WHERE id=idd;
#INSERT INTO chars (nick,spawn_x,spawn_y,_spawn_z) VALUES (nick,0,0,0);
ELSEIF @var2 !=0 THEN
UPDATE id_and_char_id SET ch2=nick WHERE id=idd;
UPDATE id_and_char_id SET num=@n+1 WHERE id=idd;
#INSERT INTO chars (nick,spawn_x,spawn_y,_spawn_z) VALUES (nick,0,0,0);
ELSEIF @var3 !=0 THEN
UPDATE id_and_char_id SET ch3=nick WHERE id=idd;
UPDATE id_and_char_id SET num=@n+1 WHERE id=idd;
#INSERT INTO chars (nick,spawn_x,spawn_y,_spawn_z) VALUES (nick,0,0,0);
ELSEIF @var4 !=0 THEN
UPDATE id_and_char_id SET ch4=nick WHERE id=idd;
UPDATE id_and_char_id SET num=@n+1 WHERE id=idd;
#INSERT INTO chars (nick,spawn_x,spawn_y,_spawn_z) VALUES (nick,0,0,0);
ELSEIF @var5 !=0 THEN
UPDATE id_and_char_id SET ch5=nick WHERE id=idd;
UPDATE id_and_char_id SET num=@n+1 WHERE id=idd;
#INSERT INTO chars (nick,spawn_x,spawn_y,_spawn_z) VALUES (nick,0,0,0);
END IF;
END IF;
END
lawliet93 вне форума Ответить с цитированием
Старый 31.12.2012, 22:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
то все зависает
Может на запись ставится блокировка?
Разве нельзя вместо множества select сделать один типа:
Код:
SELECT 
@var1:=ch1, 
@var2:=ch2, 
@var3:=ch3, 
@var4:=ch4, 
@var5:=ch5 
FROM id_and_char_id WHERE id=idd;
?
Цитата:
UPDATE id_and_char_id SET num=@n+1 WHERE id=idd;
Зачем это в каждом условии? Убери. Вынеси в конец первого IF

А как по мне так структура не верная, раз приходится анализ по полям делать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.01.2013, 00:55   #3
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Может на запись ставится блокировка?
Разве нельзя вместо множества select сделать один типа:
Код:
SELECT 
@var1:=ch1, 
@var2:=ch2, 
@var3:=ch3, 
@var4:=ch4, 
@var5:=ch5 
FROM id_and_char_id WHERE id=idd;
?

Зачем это в каждом условии? Убери. Вынеси в конец первого IF

А как по мне так структура не верная, раз приходится анализ по полям делать.
Структура чего?
lawliet93 вне форума Ответить с цитированием
Старый 01.01.2013, 01:01   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
А как по мне так структура не верная, раз приходится анализ по полям делать.
Согласен с Виталием - проблема определенно есть со структурой таблиц
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.01.2013, 02:56   #5
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Согласен с Виталием - проблема определенно есть со структурой таблиц
тогда помогите составить более подходящую структуру. Сейчас у меня такая структура.
Есть таблицы logins, id_and_char_id, chars. При регистрации в таблицу logins заносятся логин и пароль, и добавляется id который с автоинкрементом, этот же id сразу же заносится в таблицу id_and_char_id. Если пользователь хочет создать персонажа, вызывается не работающая процедура, которая проверяет счетчик персонажей в таблице id_and_char_id (макс - 5), если он меньше пяти, то в первое свободное поле (char1,char2...) заносится ник нового перса, после этого этот же ник заносится в таблицу chars. Я наваял недоструктуру с недоблоксхемой. (картинка во вложениях)
Я-то новичек в проэктировании БД, как не трудно догадатся. По-этому насоветуйте советов, как лучше составить БД для решения вышеописанных задач? Спасибо заранее!
Изображения
Тип файла: jpg табл.jpg (113.9 Кб, 137 просмотров)
lawliet93 вне форума Ответить с цитированием
Старый 01.01.2013, 13:16   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну так сделай таблицу
[idЮзера] [Номер перса]
Туда заноси нового персонажа, проверяя
Код:
Если (select count(Номер перса) from этатаблица) <5 то
insert нового персонажа
inset [idЮзера] [Номер перса] в эту таблицу
И вместо пяти полей у тебя будет пять записей, отбираемых по idЮзера
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.01.2013, 14:06   #7
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну так сделай таблицу
[idЮзера] [Номер перса]
Туда заноси нового персонажа, проверяя
Код:
Если (select count(Номер перса) from этатаблица) <5 то
insert нового персонажа
inset [idЮзера] [Номер перса] в эту таблицу
И вместо пяти полей у тебя будет пять записей, отбираемых по idЮзера
а для ников надо еще одну таблицу? [idЮзера] [НикПерса] ?
lawliet93 вне форума Ответить с цитированием
Старый 01.01.2013, 15:17   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я думаю достаточно будет переделать твою id_and_char_id, поскольку от нее все равно не много толку.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.01.2013, 15:33   #9
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я думаю достаточно будет переделать твою id_and_char_id, поскольку от нее все равно не много толку.
тогда я не допер, куда мне ники пихать? вы имели ввиду таблицу [idЮзера] [Номер перса] [Ник] или [idЮзера] [Номер перса] ??
lawliet93 вне форума Ответить с цитированием
Старый 01.01.2013, 16:25   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я всего лишь предлагал тебе на каждый новый персонаж заводить не новое поле а новую запись. А как ты уже это заложишь в программу тебе решать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хранимая процедура. WizarD.89 SQL, базы данных 13 24.11.2012 16:17
Хранимая процедура Jrcfyf БД в Delphi 1 14.02.2012 18:45
При выполнении кода форма зависает. Как вывести прогрессбар? plato Общие вопросы Delphi 4 06.01.2010 15:37
Хранимая процедура. nimf БД в Delphi 2 22.04.2008 13:16
VB6. Программа зависает при выполнении. Artinka Помощь студентам 2 03.04.2008 00:06