如何协调提供分页的SQL Server存储过程与Mulesoft?

stszievb  于 2022-11-28  发布在  SQL Server
关注(0)|答案(1)|浏览(175)

我创建了一个存储过程,在执行时向调用者提供多个页面。在这个例子中,调用者来自Mulesoft。
下面是一些示例数据的创建代码和存储过程的逻辑。

CREATE SCHEMA pldScratch

CREATE TABLE pldScratch.SampleFruits 
(
    Id INT PRIMARY KEY IDENTITY(1,1) , 
    FruitName VARCHAR(50) , 
    Price INT
)
GO

INSERT INTO pldScratch.SampleFruits VALUES ('Apple', 20)
INSERT INTO pldScratch.SampleFruits VALUES ('Apricot', 12)
INSERT INTO pldScratch.SampleFruits VALUES ('Banana', 8)
INSERT INTO pldScratch.SampleFruits VALUES ('Cherry', 11)
INSERT INTO pldScratch.SampleFruits VALUES ('Strawberry', 26)
INSERT INTO pldScratch.SampleFruits VALUES ('Lemon', 4)  
INSERT INTO pldScratch.SampleFruits VALUES ('Kiwi', 14)  
INSERT INTO pldScratch.SampleFruits VALUES ('Coconut', 34) 
INSERT INTO pldScratch.SampleFruits VALUES ('Orange', 24)  
INSERT INTO pldScratch.SampleFruits VALUES ('Raspberry', 13)
INSERT INTO pldScratch.SampleFruits VALUES ('Mango', 9)
INSERT INTO pldScratch.SampleFruits VALUES ('Mandarin', 19)
INSERT INTO pldScratch.SampleFruits VALUES ('Pineapple', 22)
GO

-- examine the newly written data ordered by price
SELECT * 
FROM pldScratch.SampleFruits
ORDER BY price

-- stored procedure logic
DECLARE @PageNumber AS INT
DECLARE @RowsOfPage AS INT
DECLARE @MaxTablePage AS decimal(10,2) 
    
SET @PageNumber = 1
SET @RowsOfPage = 4 -- NOTE: I am expecting Mulesoft to send me the desired rows per page,
                  --       for now, I am dubbing the value as 4 with this small sampling.

SELECT @MaxTablePage = COUNT(*) FROM pldScratch.SampleFruits
SET @MaxTablePage = CEILING (@MaxTablePage / @RowsOfPage)

WHILE @MaxTablePage >= @PageNumber
BEGIN
    SELECT FruitName, Price 
    FROM pldScratch.SampleFruits
    ORDER BY Price 
       OFFSET (@PageNumber - 1) * @RowsOfPage ROWS
       FETCH NEXT @RowsOfPage ROWS ONLY

    SET @PageNumber = @PageNumber + 1
END

这个分页例程是有效的,因为我返回所有插入的13行,按价格排序为4页; 3页有4行(来自@RowsOfPage设置),1页(最后一页)有单行。数据看起来排序正确,偏移似乎起作用。
我的问题是:我如何将这个返回给MuleSoft?当这个执行时,数据在while循环中分页。我的想法是@PageNumber@MaxTablePage作为输入/输出参数。MuleSoft也需要OFFSET吗?
我在这里计算:(@PageNumber - 1) * @RowsOfPage@RowsOfPage将是来自MuleSoft调用的传入参数,OFFSET的计算值将改变WHILE LOOP中的每次迭代。
我没有使用过MuleSoft,所以我不确定我需要在这里做些什么来提供前端开发人员可能需要从存储过程返回的所有元素,以便将结果集分页给最终用户。请给出建议。

7gcisfzg

7gcisfzg1#

对于未来关注这一主题的人来说,使用MuleSoft产品的API开发人员的“行话”主要围绕TOP和SKIP。对于我这个后端开发人员来说,我不确定是否需要提供多个预先分页的数据集打包回调用API,或者是否期望从API接收传入参数,只返回所请求的单个数据集。
事实证明,SCALA/数据工程团队更喜欢打包的多个数据集,而MuleSoft产品API开发人员更喜欢单数据集方法。
也就是说,需要提供两种不同的访问方法。我最初分享的方法是为SCALA开发人员提供的,而MuleSoft产品API开发人员需要的方法是:

SELECT @MaxTablePage = count(*) FROM #ListOfInvoicesOrLoadOrders
  SET @MaxTablePage = CEILING(@MaxTablePage/@RowsOfPageOrSkip)

     SELECT 
         FruitName,Price
      FROM pldScratch.SampleFruits
      ORDER BY Price
       FROM #ListOfInvoicesOrLoadOrders
      ORDER BY InvoiceDate DESC, CustomerName ASC
      OFFSET (@RowsOfPage * @PageNumber) ROWS 
      FETCH NEXT @RowsOfPage ROWS ONLY

要使其正常工作,所需的存储过程参数如下:

@PageNumber int  -- input
       @RowsOfPage int  -- input
       @MaxTablePage decimal(10,2) OUTPUT

现在来解决评论部分下的“判断/说教”问题。
1.真实的的存储过程比我在这里展示的简单的水果样本要复杂得多,比如CTE和转换,它们在VIEW或FUNCTION中并不实用。
1.当为一组特定的开发人员打包多个数据集时,确实存在循环的原因。
1.在IT行业工作了40年之后,作为第二代数据库产品开发人员之一,使两阶段提交在分布式环境中成为可能,千万不要因为一个人没有用确切的方言表达一个问题而假设你希望它被问到,(a)这并不意味着你在和一个白痴说话;(B)这也不意味着对问题进行尖刻的纠正就足够了。我可以处理伴随着这个领域而来的尖刻。我发现令人疲惫的是处理所有的尖刻,而没有什么可尖刻的。如果你必须纠正,那就纠正吧--但在你不纠正的时候,要回答所问的问题。我们当中那些问这个问题的人会认为你不知道答案。如果是这样的话,不要留下评论,它听起来并不像你想象的那么聪明。

相关问题