Есть ли какой-либо тип данных списка в хранимых процедурах MySQL или способ эмулировать их?

Я хотел бы создать хранимую процедуру в MySQL, которая приняла список в качестве аргумента. Например, скажем, что я хотел бы иметь возможность устанавливать несколько тегов для элемента за один вызов, а затем я хочу определить процедуру, которая принимает идентификатор элемента и список тегов для установки. Тем не менее, я не могу найти какой-либо способ сделать это, насколько я знаю, тип списка не существует, но можно ли его как-то эмулировать? Может ли список тегов быть строкой, разделенной запятыми, которую можно как-то разбить и зациклить?

Как вы обычно работаете со списками в хранимых процедурах MySQL?

12.08.2008 13:09:22
4 ОТВЕТА
РЕШЕНИЕ

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

Есть некоторые интересные вещи, которые вы можете сделать с типом таблицы csv в mysql - это если вы загружаете плоский файл в базу данных.

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

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

9
12.08.2008 14:02:46

Не уверен, что они будут работать конкретно в 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

0
24.01.2013 10:19:05
Перечисления и наборы применяются только к строкам. Перечисления допускают только одно значение из набора, поэтому не допускайте переменного числа значений. Я также подозреваю, что тип данных SET должен быть предопределен в хранимой процедуре, поэтому он имеет ограниченное использование (не то чтобы я все
beldaz 12.04.2012 00:48:23

На моем языке выбора Choice, C #, я фактически делаю это в самом приложении, потому что функции и циклы split () легче программировать на C #, чем на SQL, однако!

Возможно, вам стоит взглянуть на функцию SubString_Index () .

Например, следующее вернет Google:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.google.com', '.', -2), '.', 1);
0
12.08.2008 13:36:40

В зависимости от сложности, которую вы хотите получить, вы можете использовать общую таблицу ссылок. Для одного из моих приложений есть несколько отчетов, которые пользователь может выбрать, например, список клиентов, для которых нужно запустить отчет, а не только один клиент из комбинированного списка. У меня есть отдельная таблица с 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      
1
12.08.2008 13:48:24