【问题标题】:MySQL: How to get results of stored procedure inside a stored function?MySQL:如何在存储函数中获取存储过程的结果?
【发布时间】:2010-10-24 08:22:06
【问题描述】:

我有一个存储过程,它可以进行非常复杂的连接并返回 1 行数据(使用了 LIMIT 1)。然后在我的应用程序中使用该数据进行一些计算。通过这种方式,我尝试将业务逻辑排除在存储过程之外。 但现在我需要在另一个存储函数中获取该数据以进行一些计算。我想创建存储函数的原因是因为它将在另一个返回数千行的查询中调用。

有可能吗?我不想在存储的函数中复制复杂的连接逻辑...... 我看到的唯一解决方案是使用输出参数。


----------------------------------
PS。我决定向你解释一下我的情况,也许你会给我另一个决定。

我需要计算货物的完税价格(即最​​终价格,包括包装、发货和清关)。这个关税完税价格的计算有点复杂,我不想在我的存储过程和函数中保留复杂的逻辑。所以我创建了一个存储过程,它选择计算价格所需的所有数据,并在我的应用程序中使用这些数据来计算价格。目前一切正常。

但是现在我需要创建一个包含已付完税价格的价目表,并且我们有数千种商品。因此,如果我为每个货物和平调用我的存储过程,它将花费数千次往返(查询)到服务器。这就是为什么我想创建一个函数来调用存储过程并根据返回的数据计算价格。然后我想像这样使用它:
SELECT Description, blablabla, Weight, ..., GetDeliveryDutyPaidPrice(...) FROM pricelist;

有什么想法吗?

【问题讨论】:

    标签: mysql database database-design architecture stored-procedures


    【解决方案1】:

    不是存储过程,而是视图。这应该可以解决您的问题。

    编辑:

    确切地说,您要做的是创建一个视图,其中包含您在计算中使用的所有列。视图类似于存储过程,因为它允许底层数据库引擎优化其性能,但它可以像普通表一样使用 WHERE 子句进行查询。因此,您的表的底层实现只能具有每个表所需的列(从而使您的架构简单),但是视图可以将不同表中的所有不同列组合成一个“表视图”,可以使用查询WHERE 子句。通过这种方式,您可以获得存储过程的好处(针对常用连接优化 SQL 连接)并能够适当地过滤结果(使用 WHERE 子句),同时仍将逻辑排除在数据库之外。

    真的。意见是一件非常非常非常好的事情。使用它们。

    【讨论】:

    • 我有那个存储过程的输入参数。视图如何提供​​帮助?能详细解释一下吗?
    • 该存储过程的输入参数是什么?如果您需要输入参数来生成输出行,那么您真的成功地将业务逻辑排除在存储过程之外了吗?
    • 嗯,只有join和where子句才需要输入参数
    • 反正还有一个问题。即使我创建了一个存储函数,该函数将使用从存储过程返回的数据进行计算——那么我最初的想法是失败,将逻辑排除在存储过程/函数之外。
    • 你是对的。您要做的是创建一个视图。我将在编辑回复时提供更多细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2020-10-23
    相关资源
    最近更新 更多