MySQL - хранимая процедура - объединение выбирает, затем обновляет и вставляет - PullRequest
1 голос
/ 24 июня 2011

Мне нужно создать хранимую процедуру MYSQL, которая будет использовать запрос UNION для поиска адреса электронной почты в одной из пяти таблиц.Как только адрес электронной почты найден, хранимой процедуре необходимо обновить поле в исходной таблице и вставить информацию в другую таблицу.

Вот мой союз:

SELECT email, 'table1' AS nameoftable, status FROM table1 
WHERE email = 'you@example.com'
UNION
SELECT email, 'table2' AS nameoftable, status FROM table2 
WHERE email =    'you@example.com'
UNION
SELECT email, 'table3' AS nameoftable, status FROM table3 
WHERE email = 'you@example.com'

Это должно вернутьодна запись, которая даст мне переменную nameoftable, которая мне понадобится на следующих шагах, например: you@example.com table1 A

Первая вставка: INSERT INTO черный список (электронная почта, имя таблицы, добавлено) SELECT email, 'nameoftable ', добавлено FROM nameoftable WHERE email =' you@example.com ';

Затем обновление: UPDATE nameoftable SET status =' D 'WHERE email =' you@example.com ';

Конечно, если нет записи, процедура должна завершиться.

Итак, я пытаюсь свернуть все это в одну хранимую процедуру.Эта хранимая процедура будет использоваться с почтовой программой, которая будет удалять электронные письма из различных списков по запросу.Прямо сейчас я делаю это вручную, и это становится утомительным.

Буду признателен за любые советы или идеи.Заранее спасибо.

1 Ответ

0 голосов
/ 24 июня 2011

Похоже, ваша проблема в том, что у вас есть имя таблицы в переменной, но вам нужно превратить значение этой переменной в идентификатор, чтобы вы могли делать с ним обычные SQL-операции.Вы могли бы сделать что-то несколько безобразное, подобное этому :

IF nameoftable = 'table1' THEN
    UPDATE table1 SET status = 'D' WHERE email = 'you@example.com';
ELSEIF nameoftable = 'table2' THEN
    UPDATE table2 SET status = 'D' WHERE email = 'you@example.com';
-- etc
END IF;

Или вы могли бы использовать подготовленное утверждение (которое, более или менее, является формой * 1008).*):

PREPARE stmt FROM CONCAT('UPDATE ', nameoftable, ' SET status = ? WHERE email = ?');
EXECUTE stmt USING 'D', 'you@example.com';

Я почти уверен, что CONCAT будет работать в этом контексте, но если нет, вы можете построить SQL как переменную и PREPARE, что:

SET @update = CONCAT('UPDATE ', nameoftable, ' SET status = ? WHERE email = ?');
PREPARE stmt FROM @update;
EXECUTE stmt USING 'D', 'you@example.com';

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...