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

您通常如何使用 MySQL 存储过程中的列表?

有帮助吗?

解决方案

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

您可以用 数据集 mysql 中的表类型 - 也就是说,如果您将平面文件加载到数据库中。

您可以在存储过程中创建一个临时表,迭代 csv 列表并将其插入到临时表中,然后创建一个从该表中选择值的游标。这 回答 在上面提到的线程中显示了一种执行此操作的方法。

一般来说,我会在访问数据库之前拆分数组,然后对每个项目单独执行查询。

其他提示

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

  • 唯一ID(引导)
  • 物品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      

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

也许你应该看看 子字符串索引() 功能。

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

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

不确定这些是否专门在 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top