我有一个存储过程,它会产生非常复杂的连接并返回1行数据(使用LIMIT 1)。在我的应用程序中,我然后使用该数据进行一些计算。这样我就会尝试将业务逻辑保留在存储过程之外。 但是现在我需要在另一个存储函数中获取该数据以进行一些计算。我想创建存储函数的原因是因为它将在另一个返回数千行的查询中调用。
有可能吗?我不想在存储的函数中复制复杂的连接逻辑... 我看到的唯一解决方案是使用输出参数。
-----------------------------------
PS。我决定向你解释我的情况,也许你会给我另一个决定。
我需要计算货物的交货税价格(最终价格,包括包装,交货和清关)。计算这个交付税的付出代价有点复杂,我不想在我的存储过程和函数中保留复杂的逻辑。所以我创建了一个存储过程,选择了计算价格所需的所有数据,并在我的应用程序中使用该数据来计算价格。现在一切都很好。
但是现在我需要创建一个具有交付税价格的价目表,我们有数千种商品。因此,如果我为每个货物的和平调用我的存储过程,它将需要数千次往返(查询)到服务器。这就是为什么我想创建一个函数来调用存储过程并根据返回的数据计算价格。然后我想这样使用它:
SELECT Description,blablabla,Weight,...,GetDeliveryDutyPaidPrice(...)FROM pricelist;
有什么想法吗?
答案 0 :(得分:1)
而不是存储过程,使其成为一个视图。这应该可以解决你的问题。
编辑:
准确地说,您要做的是创建一个视图,其中包含您在计算中使用的所有列。视图类似于存储过程,因为它允许底层数据库引擎针对其性能进行优化,但是可以使用WHERE子句以与普通表相同的方式查询它。因此,您的表的底层实现只能包含每个表所需的列(从而使您的模式简单),但视图可以将不同表中的所有不同列组成一个单独的“表视图”,可以使用它查询WHERE子句。通过这种方式,您可以获得存储过程的好处(优化常用连接的SQL连接),并能够适当地过滤结果(使用WHERE子句),同时仍然保持逻辑不在数据库中。
真。观点是非常非常好的事情。使用它们。