tabla - ¿Existe algún tipo de lista de datos en los procedimientos almacenados de MySQL, o una forma de emularlos?
procedimientos almacenados mysql (4)
Me gustaría crear un procedimiento almacenado en MySQL que tomara una lista como argumento. Por ejemplo, supongamos que me gustaría poder configurar varias etiquetas para un artículo en una llamada, luego lo que quiero hacer es definir un procedimiento que tome la identificación del artículo y una lista de etiquetas para establecer. Sin embargo, parece que no puedo encontrar ninguna forma de hacerlo, no hay ningún tipo de datos de lista, por lo que 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 buclear?
¿Cómo usualmente trabajas con listas en procedimientos almacenados de MySQL?
Dependiendo de qué tan complicado desee obtener, puede usar una tabla de vinculación genérica. Para una de mis aplicaciones, hay varios informes en los que el usuario puede elegir, por ejemplo, una lista de clientes para ejecutar el informe en lugar de solo un cliente de un cuadro combinado. Tengo una tabla separada con 2 campos:
- UniqueID (guid)
- Identificación del artículo
El código psuedo 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 de elección, C #, realmente hago esto en la propia aplicación porque las funciones y los bucles de split () son más fáciles de programar en C # y luego en SQL, ¡sin embargo!
Tal vez deberías mirar la función SubString_Index () .
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 usted necesita. http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/en/set.html
Este artículo tiene una buena discusión sobre el problema de analizar una matriz a un procedimiento almacenado, ya que los procedimientos almacenados solo permiten el uso de parámetros de columna de tabla válidos.
Hay algunas cosas interesantes que puedes hacer con el tipo de tabla csv en mysql, es decir, si estás 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. Esta respuesta en el hilo mencionado anteriormente muestra una forma de hacerlo.
Generalmente dividiría la matriz antes de llegar a la base de datos y luego realizaría la consulta individualmente en cada elemento.