2016-08-30 5 views
0

Эй, я хочу написать функцию в sql, которая вставляет параметры передачи обслуживания. Мой код:Mysql Вставить в переменные

CREATE PROCEDURE `p_add_client`(IN p_username VARCHAR(45),IN p_reach VARCHAR(45),IN p_purchase VARCHAR(45)) 
BEGIN 
set @str = ('INSERT INTO t_', p_username,'(Purchase,Reach) VALUES (p_purchase,p_reach)'); 
prepare stmt from @str; 
execute stmt; 
deallocate prepare stmt; 

, но он не работает. Я получаю код ошибки 1064. Может ли кто-нибудь мне помочь?

ответ

1

Вы отсутствуете CONCAT():

set @str = CONCAT('INSERT INTO t_', p_username, '(Purchase, Reach) VALUES (p_purchase, p_reach)'); 

Однако вы тогда получите ошибку при выполнении, поскольку переменные не известны. Итак, вы могли бы написать:

set @str = CONCAT('INSERT INTO t_', p_username, '(Purchase, Reach) VALUES (p_purchase, p_reach)'); 

prepare stmt from @str; 
execute stmt using p_purchase, p_reach; 
deallocate prepare stmt; 

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

+0

Фактически у меня был только один стол. но для 100 клиентов таблица имеет 1 * 10^7 строк. так что лучше для исполнения, если у каждого есть своя таблица. поэтому мне нужно проверить только несколько тысяч строк для клиента. это неправильно? на столе было бы очень легко – nicoschuck

+0

@nicoschuck. , , Вам нужна одна таблица с соответствующим индексом. Если у вас десять миллионов строк, вам также может понадобиться какая-то схема разбиения. –

Смежные вопросы