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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 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      

Ответ 4

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

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

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

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