Задавайте вопросы, мы ответим
Вы не зашли.
Скажите возможно ли хранить имена таблиц в базе и как с ними работать внутри БД.
Т.е. возможноли сделать вот так...
select id from (select p1 from test1 where p2=100); \\ p1- varchar.
На что мне выдаёт ошибку 42000. Как то обойти это можно не выходя за переделы БД? И будет ли это "красиво"?
Отредактированно demiurg (12.10.2011 21:45:17)
Неактивен
Неактивен
Нет. Не так. Я хочу хранить названия таблиц в другой таблице. Найти название таблицы через select и подставить его в другой select. Чтобы не нужно было на приложении , работающем с БД забирать переменную и формировать запрос из приложения. Т.е. значение столбца в какойто строчке передать как название таблицы ,в которой ведётся выборка,в запрос. А процедуры в этом плане мне ничего не дают.
Неактивен
Найти название таблицы через select и подставить его в другой select.
Без использования PREPARE STATEMENT это невозможно. А как использовать, написано в той теме, ссылку на которую дал vasya.
Неактивен
mysql> set @var='select p1 from test1 WHERE p2=100';
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE zx FROM @var;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE zx;
+----------+
| p1 |
+----------+
| device10 |
+----------+
1 row in set (0.00 sec)
Выводит. А что дальше то. Как теперь вывести данные из таблицы с названием device10 ? Там на этот счёт ничего не написано...
Неактивен
Неактивен
demiurg написал:
Выводит. А что дальше то. Как теперь вывести данные из таблицы с названием device10 ? Там на этот счёт ничего не написано...
А что делает пример в конце первого сообщения темы по ссылке??
Неактивен
оо спасибо. Заработало.
А ещё столнулся с непонятками в процедурах
ввожу
CREATE PROCEDURE my_proc(p1p int(255))
BEGIN
set @var1=CONCAT('select p1 from test1 WHERE p2=',p1p,' INTO @tbl');
PREPARE zx FROM @var1;
EXECUTE zx;
SET @var2=CONCAT('select * FROM ', @tbl);
PREPARE zy FROM @var2;
EXECUTE zy;
END;
А клиент воспринимае это не как единый код а как набор строчек... И стопорится на 3 строке.
ERROR 1064 (42000): 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 '' at line 3
************
ДА нужно просто работать с множеством таблиц и записывать в таблицу, соответствующую конкретным значениям логина и пароля.
Это получается такие манипуляции нужно проводить для каждого подключения или можно создать глобально такую процедуру?
Отредактированно demiurg (13.10.2011 01:05:05)
Неактивен
Используйте delimiter$$
далее текст создания процедуры
$$
P.S. В вашем случае можно обойтись одним подготовленным выражением, см пост №7
Неактивен
vasya написал:
Используйте delimiter$$
далее текст создания процедуры
$$
P.S. В вашем случае можно обойтись одним подготовленным выражением, см пост №7
Не помогает
ввожу:
delimiter$$
CREATE PROCEDURE my_proc(p1p int(255))
BEGIN
SELECT p1 from test1 WHERE p2=p1p INTO @tbl;
SET @var2=CONCAT('select * FROM ', @tbl);
PREPARE zy FROM @var2;
EXECUTE zy;
END;
$$
даёт:
mysql> delimiter$$
-> CREATE PROCEDURE my_proc(p1p int(255))
-> BEGIN
-> SELECT p1 from test1 WHERE p2=p1p INTO @tbl;
ERROR 1064 (42000): 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 'delimiter$$ CREATE PROCEDURE my_proc(p1p int(255))
BEGIN
SELECT p1 from test1 WH' at line 1
Отредактированно demiurg (13.10.2011 01:20:19)
Неактивен
Странно, а какая у вас версия mysql?
Неактивен
mysql-5.5.11-win32
работаю через mysql command line client
Отредактированно demiurg (13.10.2011 01:44:00)
Неактивен
Ага, сообразил. После delimiter должен быть пробел, т.е.
delimiter $$
И ещё, что значит int(255) ?
Неактивен
vasya написал:
Ага, сообразил. После delimiter должен быть пробел, т.е.
delimiter $$
И ещё, что значит int(255) ?
Оооо, заработало. Спасибо.
Да я создавал таблицу так. эксперименты проводил Максимальны размер вывода вроде бы..
Field | Type | Null | Key | Default | Extra
------+----------------+------+-----+---------+-------
p1 | varchar(100) | YES | | NULL |
p2 | int(255) | YES | | NULL |
Отредактированно demiurg (13.10.2011 02:07:17)
Неактивен
255-значное число ?
Неактивен
Эксперименты проводил )))) А таблицу взял как тестовую.
Кстати а не подскажете как сделать переменную wait_timeout постоянной. Чтобы не приходилось её задавать при каждом подключении. Делаю так set timeout=172800; Но при перезапуске подключения она опятьстановиться 28800.
Неактивен
Задать в конфиге (my.ini или my.cnf)
http://dev.mysql.com/doc/refman/5.0/en/ … it_timeout
Неактивен