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

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

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

Ответов (4)

Решение

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

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

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

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

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

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

Например, следующее будет возвращать google:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.google.com', '.', -2), '.', 1);

Не уверен, что они будут работать конкретно в SP, но в MySQL 5 есть типы данных ENUM и SET, которые могут делать то, что вам нужно. http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/en/set.html

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

  • Уникальный идентификатор (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