MySQL存储过程中是否有任何列表数据类型,或者是模拟它们的方法?

时间:2008-08-12 13:09:22

标签: mysql stored-procedures

我想在MySQL中创建一个以列表作为参数的存储过程。例如,假设我希望能够在一次调用中为项目设置多个标签,那么我想要做的是定义一个过程,该过程接受项目的ID和要设置的标签列表。但是,我似乎无法找到任何方法来做到这一点,据我所知,没有列表数据类型,但可以以某种方式进行模拟吗?标签列表可以是逗号分隔的字符串,可以以某种方式拆分和循环吗?

你如何处理MySQL存储过程中的列表?

4 个答案:

答案 0 :(得分:9)

This文章讨论了将数组解析为存储过程的问题,因为存储过程只允许有效的表列数据类型作为参数。

你可以使用mysql中的csv表类型做一些巧妙的事情 - 也就是你将平面文件加载到数据库中。

您可以在存储过程中创建临时表,迭代csv列表并将其插入临时表,然后创建一个光标,从该表中选择值。上面提到的帖子中的answer显示了这样做的方法。

通常我会在进入数据库之前拆分数组,然后对每个项目单独执行查询。

答案 1 :(得分:1)

根据您想要获得的复杂程度,您可以使用通用链接表。对于我的一个应用程序,有几个用户可能选择的报告,例如运行报告的客户列表,而不是组合框中的单个客户。我有一个包含2个字段的单独表格:

  • UniqueID(guid)
  • 的ItemID

psuedo-code看起来像这样:

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      

答案 2 :(得分: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

答案 3 :(得分:0)

在我的编程语言Choice,C#中,我实际上是在应用程序本身中执行此操作,因为split()函数和循环更容易在C#和SQL中编程,但是!

也许你应该看看SubString_Index()功能。

例如,以下内容将返回google:

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