MySQL存储过程中是否有任何列表数据类型,或者是一种模拟它们的方法?
我想在MySQL中创建一个以列表作为参数的存储过程。例如,假设我希望能够在一个调用中为一个项目设置多个标签,那么我想做的就是定义一个过程,该过程采用该项目的ID和要设置的标签列表。但是,据我所知,我似乎找不到任何方法可以做到这一点,没有列表数据类型,但是可以通过某种方式对其进行仿真吗?标签列表可以是逗号分隔的字符串,可以以某种方式拆分和循环吗?
我们通常如何在MySQL存储过程中使用列表?
解决方案
回答
不确定它们是否将特别在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
回答
在我的Choice语言C#中,我实际上是在应用程序本身中执行此操作,因为split()函数和循环在Cthen SQL中更容易编程,但是!
也许我们应该看看SubString_Index()函数。
例如,以下将返回google:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.google.com', '.', -2), '.', 1);
回答
根据我们要获得的复杂程度,可以使用通用链接表。对于我的一个应用程序,用户可以选择多个报告,例如,要运行报告的客户列表,而不是组合框中的单个客户。我有一个单独的表,其中包含2个字段:
- UniqueID(引导)
- 物品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
回答
本文对将数组解析为存储过程的问题进行了很好的讨论,因为存储过程仅允许将有效的表列数据类型用作参数。
我们可以使用mysql中的csv表类型来做一些整洁的事情,也就是说,如果我们正在将平面文件加载到db中。
我们可以在存储过程中创建一个临时表,遍历csv列表并将其插入到temp表中,然后创建一个游标,该游标从该表中选择值。上面提到的线程中的答案显示了执行此操作的方法。
通常,在进入数据库之前,我会先拆分数组,然后对每个项目分别执行查询。