Gibt es einen Listendatentyp in gespeicherten MySQL-Prozeduren oder eine Möglichkeit, diese zu emulieren?

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

  •  08-06-2019
  •  | 
  •  

Frage

Ich möchte eine gespeicherte Prozedur in MySQL erstellen, die eine Liste als Argument verwendet.Angenommen, ich möchte in einem Aufruf mehrere Tags für ein Element festlegen können. Dann möchte ich eine Prozedur definieren, die die ID des Elements und eine Liste der festzulegenden Tags verwendet.Ich kann jedoch anscheinend keine Möglichkeit finden, dies zu tun. Soweit mir bekannt ist, gibt es keinen Listendatentyp, aber kann er irgendwie emuliert werden?Könnte die Liste der Tags eine durch Kommas getrennte Zeichenfolge sein, die irgendwie aufgeteilt und in einer Schleife durchlaufen werden kann?

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

War es hilfreich?

Lösung

Das Der Artikel enthält einige gute Diskussionen zum Problem des Parsens eines Arrays in eine gespeicherte Prozedur, da gespeicherte Prozeduren nur gültige Tabellenspaltendatentypen als Parameter zulassen.

Es gibt einige nette Dinge, die man damit machen kann csv Tabellentyp in MySQL – das heißt, wenn Sie eine Flatfile in die Datenbank laden.

Sie könnten in der gespeicherten Prozedur eine temporäre Tabelle erstellen, die CSV-Liste durchlaufen und in die temporäre Tabelle einfügen und dann einen Cursor erstellen, der die Werte aus dieser Tabelle auswählt.Das Antwort Im oben genannten Thread wird eine Möglichkeit gezeigt, dies zu tun.

Im Allgemeinen würde ich das Array aufteilen, bevor ich zur Datenbank komme, und dann die Abfrage für jedes Element einzeln durchführen.

Andere Tipps

Je nachdem, wie kompliziert Sie es gestalten möchten, können Sie eine generische Verknüpfungstabelle verwenden.Für eine meiner Anwendungen gibt es mehrere Berichte, aus denen der Benutzer auswählen kann, beispielsweise eine Liste von Kunden, für die der Bericht ausgeführt werden soll, und nicht nur einen einzelnen Kunden aus einem Kombinationsfeld.Ich habe eine separate Tabelle mit 2 Feldern:

  • UniqueID (Guid)
  • Artikel Identifikationsnummer

Der Pseudocode sieht so 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      

In der Programmiersprache meiner Wahl, C#, mache ich das tatsächlich in der Anwendung selbst, weil split()-Funktionen und -Schleifen in C# einfacher zu programmieren sind als in SQL. Allerdings!

Vielleicht solltest du mal reinschauen SubString_Index() Funktion.

Folgendes würde beispielsweise Google zurückgeben:

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

Ich bin mir nicht sicher, ob diese speziell in einem SP funktionieren, aber es gibt ENUM- und SET-Datentypen in MySQL 5, die möglicherweise das tun, 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top