2008-08-12 6 views
13

me gustaría crear un procedimiento almacenado en MySQL que tuvo 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, que yo sepa, ¿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?¿Hay algún tipo de lista de datos en los procedimientos almacenados de MySQL, o una forma de emularlos?

¿Cómo sueles trabajar con listas en los procedimientos almacenados en MySQL?

Respuesta

8

This 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 válidos de columna de tabla válida.

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

Puede crear una tabla temporal en el procedimiento almacenado, recorrer la lista csv e insertarla en la tabla temporal, luego cree un cursor que seleccione los valores de esa tabla. Este answer en el hilo mencionado anteriormente muestra una forma de hacerlo.

general sin dividir la matriz antes de llegar a la base de datos y luego realizar la consulta de forma individual en cada artículo.

0

No estoy seguro si éstos trabajan específicamente en un SP, pero hay ENUM y SET tipos de datos en MySQL 5 que puede 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

+0

enumeraciones y conjuntos sólo se aplican a las cadenas. las enumeraciones solo permiten un valor de un conjunto, por lo que no permite un número variable de valores. También sospecho que un tipo de datos SET debe estar predefinido en el procedimiento almacenado, por lo que es de uso limitado (no es que pueda hacerlo funcionar de todos modos ...) – beldaz

0

En mi lenguaje de programación de elección, C#, que realmente hacen esto en la propia aplicación, porque split() funciones y bucles son más fáciles de programar en C# a continuación, SQL, sin embargo!

Tal vez usted debe buscar en SubString_Index() función.

Por ejemplo, la siguiente volvería Google:

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

Dependiendo de lo complicado que desea obtener, se puede utilizar una tabla de enlace genérico. 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)
  • ItemID

El-pseudo código tiene este aspecto:

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  
Cuestiones relacionadas