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

StackOverflow https://stackoverflow.com/questions/8795

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

  • УникальныйID (руководство)
  • Идентификатор предмета

Псевдокод выглядит так:

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      

На моем языке программирования 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top