SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.10.2011 21:44:32

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Как хранить и использовать имена таблиц

Скажите возможно ли хранить имена таблиц в базе и как с ними работать внутри БД.

Т.е. возможноли  сделать вот так...

select id from (select p1 from test1 where p2=100); \\ p1- varchar.

На что мне выдаёт ошибку 42000. Как то обойти это можно не выходя за переделы БД? И будет ли это "красиво"?

Отредактированно demiurg (12.10.2011 21:45:17)

Неактивен

 

#2 12.10.2011 21:58:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как хранить и использовать имена таблиц

Неактивен

 

#3 12.10.2011 23:17:05

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Re: Как хранить и использовать имена таблиц

Нет. Не так. Я хочу хранить названия таблиц в другой таблице. Найти название таблицы через select и подставить его в другой select. Чтобы не нужно было на приложении , работающем с БД забирать переменную и формировать запрос из приложения. Т.е. значение столбца в какойто строчке передать как название таблицы ,в которой ведётся выборка,в запрос.   А процедуры в этом плане мне ничего не дают.

Неактивен

 

#4 12.10.2011 23:22:30

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Как хранить и использовать имена таблиц

Найти название таблицы через select и подставить его в другой select.

Без использования PREPARE STATEMENT это невозможно. А как использовать, написано в той теме, ссылку на которую дал vasya.

Неактивен

 

#5 13.10.2011 00:00:10

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Re: Как хранить и использовать имена таблиц

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 ? Там на этот счёт ничего не написано...

Неактивен

 

#6 13.10.2011 00:05:12

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Как хранить и использовать имена таблиц

set @var='select p1 from test1 WHERE p2=100 INTO @tbl';
PREPARE zx FROM @var;
EXECUTE zx;
SET @var2 = 'select * FROM @tbl`;
EXECUTE zy

Неактивен

 

#7 13.10.2011 00:56:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как хранить и использовать имена таблиц

demiurg написал:

Выводит. А что дальше то. Как теперь вывести данные из таблицы с названием  device10 ? Там на этот счёт ничего не написано...

А что делает пример в конце первого сообщения темы по ссылке??

select p1 from test1 WHERE p2=100 INTO @tbl;
set @var = concat('select * from ',@tbl);
PREPARE zx FROM @var;
EXECUTE zx;

Неактивен

 

#8 13.10.2011 01:00:15

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Re: Как хранить и использовать имена таблиц

оо спасибо. Заработало.

А ещё столнулся с непонятками в процедурах

ввожу
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)

Неактивен

 

#9 13.10.2011 01:04:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как хранить и использовать имена таблиц

Используйте delimiter$$
далее текст создания процедуры
$$

P.S. В вашем случае можно обойтись одним подготовленным выражением, см пост №7

Неактивен

 

#10 13.10.2011 01:19:27

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Re: Как хранить и использовать имена таблиц

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)

Неактивен

 

#11 13.10.2011 01:37:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как хранить и использовать имена таблиц

Странно, а какая у вас версия mysql?

Неактивен

 

#12 13.10.2011 01:41:15

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Re: Как хранить и использовать имена таблиц

mysql-5.5.11-win32

работаю через mysql command line client

Отредактированно demiurg (13.10.2011 01:44:00)

Неактивен

 

#13 13.10.2011 01:45:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как хранить и использовать имена таблиц

Ага, сообразил. После delimiter должен быть пробел, т.е.
delimiter $$

И ещё, что значит int(255) ?

Неактивен

 

#14 13.10.2011 02:06:35

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Re: Как хранить и использовать имена таблиц

vasya написал:

Ага, сообразил. После delimiter должен быть пробел, т.е.
delimiter $$

И ещё, что значит int(255) ?

Оооо, заработало. Спасибо.

Да я создавал таблицу так. эксперименты проводил smile Максимальны размер вывода вроде бы..

Field | Type           | Null | Key | Default | Extra
------+----------------+------+-----+---------+-------
p1    | varchar(100) | YES  |     | NULL    |
p2    | int(255)       | YES  |     | NULL    |

Отредактированно demiurg (13.10.2011 02:07:17)

Неактивен

 

#15 13.10.2011 04:05:48

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как хранить и использовать имена таблиц

255-значное число ?

Неактивен

 

#16 13.10.2011 17:58:29

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Re: Как хранить и использовать имена таблиц

Эксперименты проводил )))) А таблицу взял как тестовую.

Кстати а не подскажете как сделать переменную wait_timeout  постоянной. Чтобы не приходилось её задавать при каждом подключении. Делаю так set timeout=172800; Но при перезапуске подключения она опятьстановиться 28800.

Неактивен

 

#17 13.10.2011 18:58:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как хранить и использовать имена таблиц

Задать в конфиге (my.ini или my.cnf)

http://dev.mysql.com/doc/refman/5.0/en/ … it_timeout

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson