Esiste un tipo di dati di elenco nelle procedure memorizzate MySQL o un modo per emularli?

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

  •  08-06-2019
  •  | 
  •  

Domanda

Vorrei creare una procedura memorizzata in MySQL che prenda un elenco come argomento.Ad esempio, supponiamo che vorrei essere in grado di impostare più tag per un elemento in una chiamata, quindi quello che voglio fare è definire una procedura che prenda l'ID dell'elemento e un elenco di tag da impostare.Tuttavia, non riesco a trovare alcun modo per farlo, non esiste un tipo di dati di elenco, per quanto ne so, ma può essere emulato in qualche modo?L'elenco dei tag potrebbe essere una stringa separata da virgole, che può in qualche modo essere divisa e ripetuta?

Come lavori solitamente con gli elenchi nelle procedure memorizzate MySQL?

È stato utile?

Soluzione

Questo L'articolo contiene alcune buone discussioni sul problema dell'analisi di un array in una procedura memorizzata poiché le procedure memorizzate consentono solo tipi di dati di colonne di tabella validi come parametri.

Ci sono alcune cose carine che puoi fare con csv table type in mysql, ovvero se stai caricando un file flat nel db.

È possibile creare una tabella temporanea nella procedura memorizzata, scorrere l'elenco CSV e inserirla nella tabella temporanea, quindi creare un cursore che seleziona i valori da quella tabella.Questo risposta nel thread sopra menzionato mostra un modo per farlo.

Generalmente dividerei l'array prima di accedere al database e quindi eseguirei la query individualmente su ciascun elemento.

Altri suggerimenti

A seconda di quanto complicato desideri ottenere, puoi utilizzare una tabella di collegamento generica.Per una delle mie applicazioni sono presenti diversi report in cui l'utente può scegliere, ad esempio un elenco di clienti su cui eseguire il report anziché un solo cliente da una casella combinata.Ho una tabella separata con 2 campi:

  • ID univoco (guida)
  • Numero identificativo dell'oggetto

Lo pseudocodice è simile al seguente:

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      

Nel mio linguaggio di programmazione Choice, C#, in realtà lo faccio nell'applicazione stessa perché le funzioni e i loop split() sono più facili da programmare in C# che in SQL, tuttavia!

Forse dovresti guardare Sottostringa_Indice() funzione.

Ad esempio, quanto segue restituirebbe google:

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

Non sono sicuro che funzioneranno in modo specifico in un SP, ma ci sono tipi di dati ENUM e SET in MySQL 5 che potrebbero fare ciò di cui hai bisogno.http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/en/set.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top