2008-08-12 20 views
13

我想在MySQL中創建一個以列表爲參數的存儲過程。例如,假設我希望能夠在一次調用中爲一個項目設置多個標籤,那麼我想要做的是定義一個過程,該過程需要項目的ID和要設置的標籤列表。但是,我似乎無法找到任何方法來做到這一點,就我所知,沒有列表數據類型,但它可以被模擬嗎?請問標籤列表是逗號分隔的字符串,可以以某種方式拆分並循環播放?MySQL存儲過程中是否有任何列表數據類型,或者一種模擬它們的方式?

你通常如何處理MySQL存儲過程中的列表?

回答

8

This文章有一些很好的討論關於將數組解析爲存儲過程的問題,因爲存儲過程只允許有效的表列數據類型作爲參數。

你可以用mysql中的csv表類型來完成一些整潔的事情 - 也就是如果你正在將一個平面文件加載到db中。

您可以在存儲過程中創建一個臨時表,遍歷csv列表並將其插入臨時表,然後創建一個遊標,從該表中選擇值。在上面提到的線程中的這個answer顯示了這樣做的一種方式。

通常我會在我來到數據庫之前拆分數組,然後在每個項目上單獨執行查詢。

0

不知道這些是否可以專門在SP中工作,但在MySQL 5中有ENUM和SET數據類型可以滿足您的需求。 http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/en/set.html

+0

枚舉和集合僅適用於字符串。枚舉只允許一個集合中的一個值,所以不要允許可變數量的值。我也懷疑SET數據類型必須在存儲過程中預定義,所以使用有限(並不是說我可以使它工作) – beldaz 2012-04-12 00:48:23

0

在我的選擇,C#的編程語言,我真正做到這一點的應用程序本身,因爲拆分()函數和循環是C#,然後SQL編程容易,但是!

也許你應該看看SubString_Index()函數。

例如,以下將返回谷歌:

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

根據你想多麼複雜獲得,你可以使用一個通用的鏈接表。對於我的一個應用程序,用戶可能會選擇多個報告,例如客戶的列表以運行報告,而不是從組合框中選擇單個客戶。我有2場一個單獨的表:

  • 的UniqueID(GUID)
  • 項目ID

的僞代碼如下所示:

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  
相關問題