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

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

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

Ответы [ 4 ]

9 голосов
/ 12 августа 2008

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

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

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

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

1 голос
/ 12 августа 2008

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

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

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

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

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.google.com', '.', -2), '.', 1);
0 голосов
/ 12 августа 2008

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

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