Existe algum tipo de dados de lista nos procedimentos armazenados do MySQL ou uma maneira de emulá-los?

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

  •  08-06-2019
  •  | 
  •  

Pergunta

Eu gostaria de criar um procedimento armazenado no MySQL que usasse uma lista como argumento.Por exemplo, digamos que eu gostaria de poder definir várias tags para um item em uma chamada, então o que eu quero fazer é definir um procedimento que receba o ID do item e uma lista de tags a serem definidas.No entanto, não consigo encontrar nenhuma maneira de fazer isso, não existe um tipo de dados de lista, pelo que sei, mas pode ser emulado de alguma forma?A lista de tags poderia ser uma string separada por vírgula, que de alguma forma pode ser dividida e repetida?

Como você costuma trabalhar com listas em procedimentos armazenados do MySQL?

Foi útil?

Solução

Esse O artigo apresenta uma boa discussão sobre o problema de analisar uma matriz para um procedimento armazenado, uma vez que os procedimentos armazenados permitem apenas tipos de dados de colunas de tabela válidos como parâmetros.

Existem algumas coisas legais que você pode fazer com o csv tipo de tabela no mysql - isto é, se você estiver carregando um arquivo simples no banco de dados.

Você pode criar uma tabela temporária no procedimento armazenado, iterar sobre a lista csv e inseri-la na tabela temporária e, em seguida, criar um cursor que selecione os valores dessa tabela.Esse responder no tópico mencionado acima mostra uma maneira de fazer isso.

Geralmente eu dividiria o array antes de chegar ao banco de dados e então realizaria a consulta individualmente em cada item.

Outras dicas

Dependendo de quão complicado você deseja, você pode usar uma tabela de vinculação genérica.Para um dos meus aplicativos, há vários relatórios onde o usuário pode escolher, por exemplo, uma lista de clientes para executar o relatório, em vez de apenas um único cliente em uma caixa de combinação.Eu tenho uma tabela separada com 2 campos:

  • UniqueID (guiado)
  • ID do item

O código psuedo é assim:

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      

Na minha linguagem de programação preferida, C#, na verdade faço isso no próprio aplicativo porque as funções e loops split() são mais fáceis de programar em C# do que em SQL.

Talvez você devesse olhar SubString_Index() função.

Por exemplo, o seguinte retornaria google:

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

Não tenho certeza se funcionarão especificamente em um SP, mas existem tipos de dados ENUM e SET no MySQL 5 que podem fazer o que você precisa.http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/en/set.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top