powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как имя таблицы в запросе выразить переменной?
25 сообщений из 80, страница 1 из 4
Как имя таблицы в запросе выразить переменной?
    #39153587
fedushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую всех!

Пытаюсь сделать следующую процедуру
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROCEDURE SetSeatStatus(status TINYINT UNSIGNED, id_place INT UNSIGNED, tableName TINYTEXT, OUT SeatStatus TINYINT UNSIGNED) 
BEGIN
START TRANSACTION;
SET SeatStatus:=(SELECT p FROM tableName WHERE id=id_place FOR UPDATE);
IF (SeatStatus<>status) THEN
UPDATE t SET p=status WHERE id=id_place;
END IF;
COMMIT;
END


В операторе SELECT вместо имени таблицы стоит переменная, которая содержит имя таблицы (заранее имя таблицы не известна). Однако переменная tableName воспринимается как имя таблицы и MySQL говорит, что такой таблицы не знает. Как ни пробовал ни пробовал ничего не получается. Что посоветуете?
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153595
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153621
fedushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю за отклик.
Получилось следующее.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DELIMITER //
CREATE PROCEDURE SetSeatStatus(status TINYINT UNSIGNED, id_place INT UNSIGNED, tableName TINYTEXT, OUT SeatStatus TINYINT UNSIGNED) 
BEGIN
START TRANSACTION;
SET @oper:=CONCAT(“SET SeatStatus:=(SELECT p FROM ”,tableName,”  WHERE id=id_place FOR UPDATE);”);
PREPARE operand FROM @oper;
EXECUTE operand;
DEALLOCATE PREPARE operand;
IF (SeatStatus<>status) THEN
SET @oper:=CONCAT(“UPDATE ”,tableName,” SET p=status WHERE id=id_place;”);
PREPARE operand FROM @oper;
EXECUTE operand;
DEALLOCATE PREPARE operand;
END IF;
COMMIT;
END
//
DELIMITER ;


Но теперь MySQL не признаёт выходную переменную SeatStatus. При вызове процедуры пишет - ERROR 1193 (HY000): Unknown system variable 'SeatStatus'.
Как теперь это обойти?
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153649
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedushok. Как ни пробовал ни пробовал ничего не получается. Что посоветуете?

Про prepared statement тебе уже сказали, но вообще если тебе такое нужно, то у тебя что-то совсем не так с подходом к проектированию базы данных. не должно такое быть необходимо в нормальной бд.
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153657
fedushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что конкретно не так с проектированием БД?
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153666
fedushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пришлось переделать следующим образом.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DELIMITER //
CREATE PROCEDURE SetSeatStatus(status TINYINT UNSIGNED, id_place INT UNSIGNED) 
BEGIN
START TRANSACTION;
SET @oper:=CONCAT(“SET @SeatStatus:=(SELECT p FROM  ”,@tableName,” WHERE id=”,id_place,” FOR UPDATE);”);
PREPARE operand FROM @oper;
EXECUTE operand;
DEALLOCATE PREPARE operand;
IF (@SeatStatus<>status) THEN
SET @oper:=CONCAT(“UPDATE ”,@tableName,” SET p=”,status,” WHERE id=”,id_place,”;”);
PREPARE operand FROM @oper;
EXECUTE operand;
DEALLOCATE PREPARE operand;
END IF;
COMMIT;
END
//
DELIMITER ;


Но для того, чтобы вызвать процедуру необходимо сначала определить глобальные переменные, которые используются в процедуре.
Код: sql
1.
2.
SET @SeatStatus:=2,@tableName=’t’;
CALL SetSeatStatus(0,4);


Так работает. Оценивая на такую конструкцию как программист, я понимаю что что-то не так. Это моя первая база. Может поможите советом по исправлению "что-то не так"?
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153692
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смысл в следующем (дополню MasterZiv)

На простых вещах (абстрагируемся от вашей темы, хотя вы ее и не показали)

1. у вас есть объект ТОВАРЫ, эта "сущность" должна быть описана одной таблицей с полем ТИП (холодильник, микроволновка и т.д)
2. у вас же под каждый тип своя таблица. Это в корне не правильно.

При подходе 2 вам придется стряпать Prepare statement для каждого товара
При подходе 1 - достаточно SELECT * FROM Tovar WHERE tovar_type="холодильник"
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153698
fedushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправляюсь.
Мне необходимо сделать электронную кассу для нескольких кассиров для продажи билетов на различные мероприятия. Разумеется необходима одна база, с которой они все будут работать.
Есть одна таблица (MyISAM), которая содержит первичные данные по мероприятию: кто, где, с чем, и т.д. и в том числе название таблицы концертного зала. Получается, что одной записи таблицы с первичными данными о мероприятии соответствует одна вновь создаваемая таблица концертного зала. Концертных залов несколько, поэтому по своей структуре таблицы залов разнятся, так как похожих залов нет. Таблица концертного зала (InnoDB) содержит номер места, признак занятости и цену. То есть одна строка - одно место. Тип InnoDB + одно место сделано одной строкой для того, чтобы при транзакции были блокированы только те места, с которыми в данный момент времени работает кассир.
Как-то так...
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153700
fedushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как, вы считаете это надо изменить, чтобы "вогнать" БД с стандартные рамки, не упуская возможности однострочной ("одноместовой") блокировки при транзакции?
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153706
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
две таблицы
первая продажи
вторая конц зал (места) с полем (концертзал)
все
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153709
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedushok....кто, где, с чем, и т.д. и в том числе название таблицы концертного зала ...Концертных залов несколько, поэтому по своей структуре таблицы залов разнятся, так как похожих залов нет. - общая таблица Места в ззалах с полем Наим зала
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153712
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedushokЧто конкретно не так с проектированием БД?

структура неправильная.
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153713
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedushokИсправляюсь.
Мне необходимо сделать электронную кассу для нескольких кассиров для продажи билетов на различные мероприятия. Разумеется необходима одна база, с которой они все будут работать.
Есть одна таблица (MyISAM), которая содержит первичные данные по мероприятию: кто, где, с чем, и т.д. и в том числе название таблицы концертного зала. Получается, что одной записи таблицы с первичными данными о мероприятии соответствует одна вновь создаваемая таблица концертного зала. Концертных залов несколько, поэтому по своей структуре таблицы залов разнятся, так как похожих залов нет.

ну вот это и есть ошибки в проектировании бд.
не должно быть такого.
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153714
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedushokКак, вы считаете это надо изменить, чтобы "вогнать" БД с стандартные рамки, не упуская возможности однострочной ("одноместовой") блокировки при транзакции?


дай мне структуру твоей бд, тогда я смогу сказать, как изменить.
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153734
fedushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему это то что вы с меня спрашиваете
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153736
fedushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
две одинаковые картинки подряд получились...
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153749
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedushok,

нет мне надо не это, а Create table для всех таблиц.
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39153752
fedushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
CREATE TABLE events (
id_event INT UNSIGNED NOT NULL AUTO_INCREMENT,
artist TINYTEXT,
program TEXT,
min_price INT UNSIGNED,
max_price INT UNSIGNED,
id_hall INT UNSIGNED,
date DATE,
time TIME,
PRIMARY KEY (id_event),
FOREIGN KEY (id_hall) REFERENCES halls(id_hall)
) ENGINE=MyISAM;

CREATE TABLE places (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
vacant BOOL,
id_pr INT UNSIGNED,
PRIMARY KEY (id),
FOREIGN KEY (id_pr) REFERENCES prices_table(id_pr)
) ENGINE=InnoDB;

CREATE TABLE prices_table (
id_pr INT UNSIGNED NOT NULL AUTO_INCREMENT,
price_value INT UNSIGNED,
red TINYINT UNSIGNED,
green TINYINT UNSIGNED,
blue TINYINT UNSIGNED,
PRIMARY KEY (id_pr)
) ENGINE=MyISAM;

CREATE TABLE halls (
id_hall INT UNSIGNED NOT NULL AUTO_INCREMENT,
name TINYTEXT,
region TINYTEXT,
city TINYTEXT,
street TINYTEXT,
house CHAR(8),
file TINYTEXT,
PRIMARY KEY (id_hall)
) ENGINE=MyISAM;
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39154034
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это чё за шизонутый бред ?
Эт идиотизм какой-то, я тут нихрена не понимаю.

во-первых прежде всего в MyISAV нет FOREIGN KEY, он их просто не поддерживает.
Так что либо FOREIGN KEY + Inno, либо MyISAM.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE events (
id_event INT UNSIGNED NOT NULL AUTO_INCREMENT,
artist TINYTEXT,
program TEXT,
min_price INT UNSIGNED,
max_price INT UNSIGNED,
id_hall INT UNSIGNED,
date DATE,
time TIME,
PRIMARY KEY (id_event),
FOREIGN KEY (id_hall) REFERENCES halls(id_hall)
) ENGINE=MyISAM;

CREATE TABLE halls (
id_hall INT UNSIGNED NOT NULL AUTO_INCREMENT,
name TINYTEXT,
region TINYTEXT,
city TINYTEXT,
street TINYTEXT,
house CHAR(8),
file TINYTEXT,
PRIMARY KEY (id_hall)
) ENGINE=MyISAM;



Эт ещё более -- менее. много дебилизма, конечно, но ничего.
Код: plaintext
artist -- должен быть справочник.

Код: plaintext
1.
2.
min_price INT UNSIGNED,
max_price INT UNSIGNED,--  на фиг не нужны.


Код: plaintext
1.
2.
date DATE,
time TIME,

-- у тебя же не один день и час будет спектакль или что там..
А несколько дней и несколько спектаклей/шоу в день. Нужно делать отдельно
расписание.



А вот дальше идёт полный идиотизм


Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE prices_table (
id_pr INT UNSIGNED NOT NULL AUTO_INCREMENT,
price_value INT UNSIGNED,
-- red green blue --> color
color INT,
PRIMARY KEY (id_pr)
) ENGINE=MyISAM;



Получается таблица из двух полей -- ID и ЦВЕТ.
На кой такая вообще нужна? Пиши сразу ЦВЕТ вместо ссылки на ЦВЕТ.
Если бы это был бы список городов, список стран -- понятно. Но это --
атомарное самодостаточное значение. Ни на хрен не нужен словарь.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE places (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
vacant BOOL,
--id_pr INT UNSIGNED,
COLOR INT NOT NULL,
PRIMARY KEY (id),
-- FOREIGN KEY (id_pr) REFERENCES prices_table(id_pr)
) ENGINE=InnoDB;



Место, признак занятости и цвет. ОК, и как это всё со спектаклями и залами связано ?
Не говоря уже о том, что место там обычно имеет РЯД, НОМЕР МЕСТА, и что-то типа того.
Название хотя бы места должно быть ?

Так что извини, правильной структуры тебе не будет.


В общем, вместо того, чтобы проектировать БД нормально, ты пьёшь неумеренно пиво и мучаешь людей идиотскими
вопросами из цикла "как сделать то, что никогда делать вообще не надо".
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39154155
fedushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрев данные "замечания", да еще сделанные в такой манере, делаю вывод - помощи не дождаться. Все "критика" свелась к не структуре БД, а к тому что "это поле лишнее и это тоже". До конца не понимая что нужно, делать такие выводы, мягко говоря, преждевременно. Если не хватает информации - спроси, из моих сообщений очевидно, что я готов предоставить что угодно. Самое главное, что всё сказанное не то чтобы явно не разрешает, но и не приближает к ответу на поставленный вопрос - "Что не так в структуре БД?".
Итак, теперь об идиотизме и пр.
MasterZivПро prepared statement тебе уже сказали, но вообще если тебе такое нужно, то у тебя что-то совсем не так с подходом к проектированию базы данных. не должно такое быть необходимо в нормальной бд.
Если берешься писать сообщение выражай свои мысли ясно, а не загадками. Любая мысль должна быть логически структурирована и закончена (анализ, критика, вывод, рекомендация) - это означает что в конце должен быть вывод, являющийся руководством к действию. Интересно, сколько лет моему советчику, если приходится ему это писать?
MasterZivструктура неправильная.
Ну наконец-то удалось дотянуть мысль моего "советчика" практически до середины её выражения!
MasterZivну вот это и есть ошибки в проектировании бд.
не должно быть такого.
Чего "такого"? Опять загадки...
MasterZivдай мне структуру твоей бд, тогда я смогу сказать, как изменить.
Здесь выясняется, что критика была сделана без анализа. Ведь для анализа необходимы исходные данные, которые мой "советчик" запросил практически в самом конце.
MasterZivнет мне надо не это, а Create table для всех таблиц.
Непонятно как представленная схема не даёт представление о структуре БД ...
MasterZivЭто чё за шизонутый бред ? ...
И в конечном итоге, чтобы получить совет я трачу время - рисую схемы и пр. Для чего? Для того, чтобы стать свидетелем того, как один индивид встал на четвереньки и просто начал гавкать. Если я захочу зоопарк, я пойду в зоопарк. Однако это форум ...

Благодарю Alex_Ustinov за совет. Я его использовал - все работает.
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39154169
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedushokПосмотрев данные "замечания", да еще сделанные в такой манере, делаю вывод - помощи не дождаться. Все "критика" свелась к не структуре БД,

Да не в манере дело, и не в критике.
А в отсутствии структуры БД как таковой вообще.

Поясни ДЕТАЛЬНО твои create table, чтобы было что-то понятно.

Я тебе детально расписал, что у тебя непонятно. Вот поясни, где у меня вопросы.

Да, про пиво -- это я тебя спутал, извини, не ты это был..
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39154171
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedushokСамое главное, что всё сказанное не то чтобы явно не разрешает, но и не приближает к ответу на поставленный вопрос - "Что не так в структуре БД?".


Наоборот, там всё очень ясно и близко к ответу.
Фактически у тебя НЕТ никакой структуры БД вообще.


Дальше цитаты не буду оформлять, извините...


Если берешься писать сообщение выражай свои мысли ясно, а не загадками. Любая мысль должна быть логически структурирована и закончена (анализ, критика, вывод, рекомендация) - это означает что в конце должен быть вывод, являющийся руководством к действию.


Я выражал свою мысль предельно ясно. Ещё раз: Если тебе нужно подтавлять в производственной БД имя таблицы в запрос
в виде данных, у тебя неверно спроектирована база, её надо переделывать.
У тебя не должно быть ни переменного числа таблиц в БД, ни "массивов таблиц", закодированных в их именах.

Здесь выясняется, что критика была сделана без анализа. Ведь для анализа необходимы исходные данные, которые мой "советчик" запросил практически в самом конце.


Чтобы сделать анализ, нужно понимать что-то. Твоя структура абсолютно непонятна, в ней нет мыслей.


Непонятно как представленная схема не даёт представление о структуре БД ...

Это и есть структура БД. Она даёт о структуре БД непосредственное представление.

MasterZivЭто чё за шизонутый бред ? ...
И в конечном итоге, чтобы получить совет я трачу время - рисую схемы и пр. Для чего? Для того, чтобы стать свидетелем того, как один индивид встал на четвереньки и просто начал гавкать. Если я захочу зоопарк, я пойду в зоопарк. Однако это форум ...

Да ладно ты, ну, поругался я немного, ничего страшного.
Но схема-то действительно бред сумашедшего.


Благодарю Alex_Ustinov за совет. Я его использовал - все работает.

Ну, ты можешь и дальше жить с кривой базой и мужественно преодолевать трудности, которых вообще не должно быть...
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39154190
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedushok,

препаре статемент это костыль ... дальше у вас будут проблемы

реально что нам нужно - Регистрация покупки билета с местом-рядом в кинотеатр таким то кассиром
таблицы
0. Кассиры KS
1. Мероприятия MP
2. Кинотеатры KT
---- Нужна опорная жесткая таблица место-ряд для каждого кинотеатра (одна на все) (id / id_kt / mesto / ryad ) MST
3. Таблица регистрации покупки билета на мероприятие в КиноТеатре REG_MP_KT
при покупке INSERT idKS, idMP, idKT, idMST.....
все, записали, что билет куплен (число где-то присоорудите)
по моему очень просто
из такой структуры вы найдете несложными запросами Свободные места и все остальное
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39154227
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov,

ну надо сказать что на самом деле предметная область достаточно сложна, потому что структура залов очень разная, и её сложно формализовать, мы такое делали, очень сложная предметка.

но сложна она не с точки зрения бд, а просто анализа. а по бд там все правильно.

но там таблиц 20 30 должно быть, но никак не 4 !
...
Рейтинг: 0 / 0
Как имя таблицы в запросе выразить переменной?
    #39154242
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

конечно таблиц может быть по необходимости гораздо больше,
просто более менее простой и правильный костячок не помешал бы
...остальное можно прикрутить по ходу.
Насчет залов - да. структура может быть сложная - галерки...фигорки и т.д. но можно тоже закодировать, на клиенте для визуализации распарсить...
Схема то простая, как покупка ж/д билета на одноименном сайте....... есть поезд-вагон с местами, покупаем билетик )
...
Рейтинг: 0 / 0
25 сообщений из 80, страница 1 из 4
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как имя таблицы в запросе выразить переменной?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]