代码之家  ›  专栏  ›  技术社区  ›  Theo

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

  •  13
  • Theo  · 技术社区  · 17 年前

    我想在MySQL中创建一个以列表为参数的存储过程。例如,假设我想在一次调用中为一个项设置多个标记,那么我想做的是定义一个过程,该过程将获取该项的ID和要设置的标记列表。然而,我似乎找不到任何方法来实现这一点,据我所知,这里没有列表数据类型,但是可以通过某种方式模拟它吗?标签列表可以是一个逗号分隔的字符串吗?它可以以某种方式被拆分和循环?

    您通常如何处理MySQL存储过程中的列表?

    4 回复  |  直到 12 年前
        1
  •  9
  •   roo    17 年前

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

    你可以做一些很好的事情 csv mysql中的表类型-也就是说,如果要将平面文件加载到数据库中。

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

    通常,我会在访问数据库之前拆分数组,然后对每个项分别执行查询。

        2
  •  1
  •   Clyde    17 年前

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

    • UniqueID(GUID)
    • 项目

    psuedo代码如下所示:

    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      
    
        3
  •  0
  •   GateKiller    17 年前

    在我选择的编程语言C中,实际上我在应用程序本身中这样做,因为split()函数和循环更容易在C和SQL中编程。

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

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

    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.google.com', '.', -2), '.', 1);
    
        4
  •  0
  •   NoNaMe    12 年前

    不确定这些是否在SP中特别有效,但MySQL5中有枚举和设置数据类型,它们可以满足您的需要。 http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/en/set.html

    推荐文章