2008-08-12 12 views
13

Bir listeyi argüman olarak alan MySQL'de saklı bir prosedür oluşturmak istiyorum. Örneğin, bir çağrıda bir öğe için birden fazla etiket ayarlayabileceğimi, sonra yapmak istediğim öğenin kimliğini ve ayarlanacak etiketlerin listesini alan bir prosedür tanımlamak olduğunu söylemek isterim. Ancak, bunu yapmanın herhangi bir yolunu bulmak mümkün görünmüyor, farkında olduğum kadarıyla bir veri türü detatipi yok, ama bir şekilde taklit edilebilir mi? Etiket listesi virgülle ayrılmış bir dizgedir, bu şekilde bir şekilde bölünebilir ve döngü yapılabilir mi?MySQL saklı yordamlarında veya taklit etme yöntemlerinde herhangi bir liste veri türü var mı?

Genellikle MySQL'de saklanan yordamlardaki listelerle nasıl çalışıyorsunuz?

cevap

8

This makale bazı iyi tartışma vardır ben 2 alanlarla ayrı bir tablo saklı yordamlar, parametre olarak geçerli bir tablo sütunu veri türlerine izin verdiğinden, bir diziyi saklı bir yordama ayırma problemi.

mysql içinde csv tablo türü ile yapabileceğiniz bazı düzgün şeyler var - yani db içine düz bir dosya yüklüyorsanız.

Saklı yordamda geçici bir tablo oluşturabilir, csv listesi üzerinde yineleyebilir ve geçici tabloya ekleyebilirsiniz, ardından o tablonun değerlerini seçen bir imleç oluşturabilirsiniz. Yukarıda belirtilen iplikteki answer, bunu yapmanın bir yolunu göstermektedir.

Genelde, ben veritabanına gelmeden önce diziyi bölerim ve sonra her öğede ayrı ayrı sorguyu gerçekleştiririm.

0

Özellikle SP'de çalışacaklarından emin değilsiniz, ancak ihtiyacınız olanı yapabileceğiniz MySQL 5'te ENUM ve SET veri türleri vardır. Bölünmüş() işlevlerini ve döngüler C# SQL programlamak kolaydır çünkü Seçim, C# benim programlama dilinde http://dev.mysql.com/doc/refman/5.0/en/enum.html

+0

enums ve setler yalnızca dizelere uygulanır. enums, bir kümeden yalnızca bir değere izin verir, bu nedenle değişken sayıda değere izin vermeyin. Ayrıca, saklı yordamda bir SET veri türünün önceden tanımlanması gerektiğinden de şüpheleniyorum, bu yüzden sınırlı bir kullanım var (her halükarda işe yaramayacağım ...) – beldaz

1

almak istiyorum ne kadar karmaşık bağlı olarak, genel bir bağlama tablosunu kullanabilirsiniz. Uygulamalarımdan biri için kullanıcının seçebileceği çeşitli raporlar vardır. Örneğin, bir müşterinin açılan listeden yalnızca bir müşteriden ziyade raporu çalıştırmak için bir müşteri listesi.

  • Uniqueıd (guid)
  • ItemID

psuedo kod şuna benzer::

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  
İlgili konular