¿Existe algún tipo de datos de lista en los procedimientos almacenados de MySQL o una forma de emularlos?

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

  •  08-06-2019
  •  | 
  •  

Pregunta

Me gustaría crear un procedimiento almacenado en MySQL que tomara una lista como argumento.Por ejemplo, digamos que me gustaría poder configurar varias etiquetas para un elemento en una sola llamada, entonces lo que quiero hacer es definir un procedimiento que tome el ID del elemento y una lista de etiquetas para configurar.Sin embargo, parece que no puedo encontrar ninguna manera de hacer esto, no hay ningún tipo de datos de lista, hasta donde yo sé, pero ¿se puede emular de alguna manera?¿Podría la lista de etiquetas ser una cadena separada por comas, que de alguna manera se puede dividir y recorrer?

¿Cómo suele trabajar con listas en procedimientos almacenados de MySQL?

¿Fue útil?

Solución

Este El artículo tiene una buena discusión sobre el problema de analizar una matriz en un procedimiento almacenado, ya que los procedimientos almacenados solo permiten tipos de datos de columnas de tabla válidos como parámetros.

Hay algunas cosas interesantes que puedes hacer con el csv tipo de tabla en mysql, es decir, si está cargando un archivo plano en la base de datos.

Puede crear una tabla temporal en el procedimiento almacenado, iterar sobre la lista csv e insertarla en la tabla temporal, luego crear un cursor que seleccione los valores de esa tabla.Este respuesta en el hilo mencionado anteriormente se muestra una forma de hacer esto.

Generalmente dividiría la matriz antes de llegar a la base de datos y luego realizaría la consulta individualmente en cada elemento.

Otros consejos

Dependiendo de lo complicado que quieras ser, puedes utilizar una tabla de enlaces genérica.Para una de mis aplicaciones, hay varios informes entre los que el usuario puede elegir, por ejemplo, una lista de clientes para ejecutar el informe en lugar de un solo cliente de un cuadro combinado.Tengo una tabla separada con 2 campos:

  • ID único (guid)
  • Identificación del artículo

El pseudocódigo se ve así:

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      

En mi lenguaje de programación preferido, C#, en realidad hago esto en la aplicación misma porque las funciones y bucles split() son más fáciles de programar en C# que en SQL, ¡sin embargo!

Quizás deberías mirar SubString_Index() función.

Por ejemplo, lo siguiente devolvería google:

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

No estoy seguro de si funcionarán específicamente en un SP, pero hay tipos de datos ENUM y SET en MySQL 5 que pueden hacer lo que necesita.http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/en/set.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top