Я хотел бы создать хранимую процедуру в MySQL, которая приняла список в качестве аргумента. Например, скажем, что я хотел бы иметь возможность устанавливать несколько тегов для элемента за один вызов, а затем я хочу определить процедуру, которая принимает идентификатор элемента и список тегов для установки. Тем не менее, я не могу найти какой-либо способ сделать это, насколько я знаю, тип списка не существует, но можно ли его как-то эмулировать? Может ли список тегов быть строкой, разделенной запятыми, которую можно как-то разбить и зациклить?
Как вы обычно работаете со списками в хранимых процедурах MySQL?
В этой статье обсуждается проблема анализа массива хранимой процедуры, поскольку хранимые процедуры допускают использование только допустимых типов данных столбца таблицы в качестве параметров.
Есть некоторые интересные вещи, которые вы можете сделать с типом таблицы csv в mysql - это если вы загружаете плоский файл в базу данных.
Вы можете создать временную таблицу в хранимой процедуре, выполнить итерацию по списку csv и вставить ее во временную таблицу, а затем создать курсор, который выбирает значения из этой таблицы. Этот ответ в вышеупомянутой теме показывает способ сделать это.
Обычно я делю массив перед тем, как войти в базу данных, а затем выполняю запрос индивидуально для каждого элемента.
Не уверен, что они будут работать конкретно в SP, но в MySQL 5 есть типы данных ENUM и SET, которые могут делать то, что вам нужно. http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/ru/set.html
На моем языке выбора Choice, C #, я фактически делаю это в самом приложении, потому что функции и циклы split () легче программировать на C #, чем на SQL, однако!
Возможно, вам стоит взглянуть на функцию SubString_Index () .
Например, следующее вернет Google:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.google.com', '.', -2), '.', 1);
В зависимости от сложности, которую вы хотите получить, вы можете использовать общую таблицу ссылок. Для одного из моих приложений есть несколько отчетов, которые пользователь может выбрать, например, список клиентов, для которых нужно запустить отчет, а не только один клиент из комбинированного списка. У меня есть отдельная таблица с 2 полями:
- UniqueID (guid)
- ItemID
Псевдо-код выглядит так:
GUID guid = GenerateGUID()
try
for each customer in customerList { INSERT(guid, customerId) }
ExecuteSQLPocedure(guid)
--the procedure can inner-join to the list table to get the list
finally
DELETE WHERE UniqueID=guid