Există vreo listă de date în procedurile memorate MySQL sau o modalitate de a le emula?

Aș dori să creez o procedură stocată în MySQL care a luat o listă ca argument. De exemplu, spuneți că aș dori să pot seta mai multe etichete pentru un element într-un singur apel, atunci ceea ce vreau să fac este să definim o procedură care să ia identitatea elementului și o listă de etichete pe care să o setați. Cu toate acestea, nu pot să găsesc nici un fel de a face acest lucru, nu există nici un tip dat listă, în măsura în care știu, dar poate fi emulate într-un fel? Lista de etichete ar putea fi un șir separat prin virgulă, care poate fi împărțit și bifat?

Cum de obicei lucrați cu liste în procedurile memorate MySQL?

0
fr hi bn

4 răspunsuri

În limba mea de programare a opțiunii, C#, de fapt, fac acest lucru în aplicația însăși, deoarece funcțiile split() și buclele sunt mai ușor de programat în C# apoi SQL, cu toate acestea!

Poate ar trebui să te uiți la funcția SubString_Index() .

De exemplu, următorul text ar reveni la Google:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.google.com', '.', -2), '.', 1);
0
adăugat

În funcție de cât de complicat doriți să obțineți, puteți utiliza o tabelă de legătură generică. Pentru una dintre aplicațiile mele există mai multe rapoarte pe care utilizatorul le-ar putea alege, de exemplu o listă de clienți pentru a rula raportul mai degrabă decât un singur client dintr-o casetă combo. Am o masă separată cu 2 câmpuri:

  • ID unic (guid)
  • ElementId

Codul psuedo arată astfel:

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      
0
adăugat

This article has some good discussion on the problem of parsing an array to a stored procedure since stored procedures only allow valid table column data-types as parameters.

Există câteva lucruri bune pe care le puteți face cu csv tip de tabel în MySQL - adică dacă încărcați un fișier plat în db.

Puteți crea o tabelă temporară în procedura stocată, repetați lista cu csv și introduceți-o în tabela temp, apoi creați un cursor care selectează valorile din tabel. Acest răspuns din subiectul menționat mai sus arată o modalitate de a a face asta.

În general, aș diviza matricea înainte de a veni la baza de date și apoi să efectuez interogarea individuală pe fiecare element.

0
adăugat

Not sure if these will work specifically in a SP, but there are ENUM and SET datatypes in MySQL 5 which may do what you need. http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/en/set.html

0
adăugat
enums și seturi se aplică numai șirurilor. enums permite doar o valoare dintr-un set, deci nu permiteți un număr variabil de valori. De asemenea, bănuiesc că un tip de date SET trebuie să fie predefinit în procedura stocată, așa că este de uz limitat (nu că pot să-l lucrez oricum ...)
adăugat autor beldaz, sursa
MySQL - comunitatea Română
MySQL - comunitatea Română
19 participanți

Comunitatea română a programatorilor MySQL.