2008-08-12 6 views
13

Ich möchte eine gespeicherte Prozedur in MySQL erstellen, die eine Liste als Argument nahm. Angenommen, ich möchte mehrere Tags für ein Element in einem Aufruf definieren können. Dann möchte ich eine Prozedur definieren, die die ID des Elements und eine Liste der festzulegenden Tags annimmt. Wie auch immer, ich kann keinen Weg finden, dies zu tun, es gibt keinen Listen-Datentyp, soweit ich weiß, aber kann er irgendwie emuliert werden? Könnte die Liste der Tags eine durch Kommas getrennte Zeichenfolge sein, die irgendwie aufgeteilt und durchgeschleift werden kann?Gibt es einen Listen-Datentyp in gespeicherten MySQL-Prozeduren oder eine Möglichkeit, sie zu emulieren?

Wie arbeiten Sie normalerweise mit Listen in gespeicherten MySQL-Prozeduren?

Antwort

8

This Artikel einige gute Diskussion hat Zum Problem der Analyse eines Arrays in eine gespeicherte Prozedur, da gespeicherte Prozeduren nur gültige Tabellenspalten-Datentypen als Parameter zulassen.

Es gibt einige nette Dinge, die Sie mit dem Tabellentyp csv in mysql tun können - das heißt, wenn Sie eine flache Datei in die Datenbank laden.

Sie könnten eine temporäre Tabelle in der gespeicherten Prozedur erstellen, über die CSV-Liste iterieren und in die temporäre Tabelle einfügen und dann einen Cursor erstellen, der die Werte aus dieser Tabelle auswählt. Diese answer im oben genannten Thread zeigt einen Weg, dies zu tun.

Im Allgemeinen würde ich das Array teilen, bevor ich in die Datenbank komme und dann die Abfrage für jedes Element einzeln ausführen.

0

Nicht sicher, ob diese speziell in einem SP funktionieren, aber es gibt ENUM- und SET-Datentypen in MySQL 5, die tun können, was Sie brauchen. http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/en/set.html

+0

Enums und Sets gelten nur für Strings. Aufzählungen erlauben nur einen Wert aus einer Menge. Lassen Sie daher keine variable Anzahl von Werten zu. Ich vermute auch, dass ein SET-Datentyp in der Stored Procedure vordefiniert sein muss, ist also von begrenztem Nutzen (nicht dass ich es irgendwie funktionieren kann ...) – beldaz

0

In meiner Programmiersprache der Wahl, C#, das tue ich dies tatsächlich in der Anwendung selbst, weil split() Funktionen und Schleifen sind einfacher in C# programmiert dann SQL, aber!

Vielleicht sollten Sie sich SubString_Index() Funktion ansehen.

Zum Beispiel folgendes würde Google zurück:

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

Je nachdem, wie kompliziert Sie erhalten möchten, können Sie eine generische Verknüpfungstabelle verwenden. Für eine meiner Anwendungen gibt es mehrere Berichte, bei denen der Benutzer beispielsweise eine Liste von Kunden auswählen kann, um den Bericht anstatt nur eines einzelnen Kunden aus einem Kombinationsfeld auszuführen. Ich habe eine separate Tabelle mit zwei Feldern:

  • UniqueID (GUID)
  • ItemID

Der psuedo-Code sieht wie folgt aus:

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