【问题标题】:Is there any list datatype in MySQL stored procedures, or a way to emulate them?MySQL 存储过程中是否有任何列表数据类型,或模拟它们的方法?
【发布时间】:2008-08-12 13:09:22
【问题描述】:

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

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

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

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

    您可以使用 mysql 中的 csv 表类型做一些巧妙的事情 - 即如果您将平面文件加载到数据库中。

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

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

    【讨论】:

      【解决方案2】:

      根据您想要获得的复杂程度,您可以使用通用链接表。对于我的一个应用程序,用户可能会选择多个报告,例如要运行报告的客户列表,而不仅仅是组合框中的单个客户。我有一个包含 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      
      

      【讨论】:

        【解决方案3】:

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

        也许你应该看看SubString_Index() 函数。

        例如,以下将返回 google:

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

        【讨论】:

          【解决方案4】:

          不确定这些是否特别适用于 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

          【讨论】:

          • 枚举和集合仅适用于字符串。枚举只允许一组中的一个值,因此不允许可变数量的值。我还怀疑必须在存储过程中预定义一个 SET 数据类型,所以它的用途有限(不是说我无论如何都能让它工作......)
          猜你喜欢
          • 1970-01-01
          • 2019-01-02
          • 2019-12-18
          • 2017-08-15
          • 1970-01-01
          • 2019-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多