存储过程动态排序依据

本文关键字:排序 动态 存储过程 | 更新日期: 2023-09-27 18:20:37

嗨,各位stackoverflow成员,

我有一个紧迫的问题。

我目前正在用GridView开发一个小型web应用程序。GridView必须能够动态执行multi column排序。每当用户点击不同的列时,我的C#应用程序都会解析这些列,并根据存储过程对asc/desc进行排序,以执行记录检索。因此,我的SP必须能够动态地处理输入。

我不希望使用动态SQL,希望坚持使用PL/SQL查询。

这是我的代码示例

SELECT ID,NAME FROM MY_TABLE WHERE ID='123' ORDER BY ID ASC, NAME DESC;

这部分ORDER BY ID ASC, NAME DESC必须是动态的。我希望根据我的申请中传递的参数来制定这一部分。

我目前正在处理DECODE函数和CASE函数,结果喜忧参半,因为我只能处理1个参数输入。如果用户在我的GridView上点击多列,我需要能够处理多列排序。

这个部分应该是动态的,并且能够处理多列排序。

ORDER BY ID ASC, NAME DESC, CLASS ASC。。。等等。

各位成员请为我指明正确的方向。谢谢

1) 不希望使用动态sql并在PL/sql中实现上述功能。

2) 参数输入可自定义,可以在前端进行任何操作。需要关于SP的帮助。

谨致问候,TP

存储过程动态排序依据

您可以为该(@SortIndex)传递参数

ORDER BY 
CASE WHEN @SortIndex = 1 THEN ID END ASC,
CASE WHEN @SortIndex = 2 THEN NAME END DESC
CASE WHEN @SortIndex = 3 THEN Title END ASC 

它并不优雅,但应该可以工作。提供代码编号并进行相应排序:

ORDER BY CASE myparam 
         WHEN  1 THEN col1 ASC 
         WHEN -1 THEN col1 DESC
         WHEN  2 THEN col2 ASC 
         WHEN -2 THEN col2 ASC
         END;

这应该会让你朝着正确的方向前进:

CREATE OR REPLACE PROCEDURE GET_DETAILS (ORDER_TYPE1   IN VARCHAR2(5)
                         ORDER_TYPE2   IN VARCHAR2(5)
                                         ORDER_FIELD1 IN VARCHAR2(5) 
                                         ORDER_FIELD2  IN VARCHAR2(5)
                     V_ID         IN VARCHAR2(5)
                                         OUTPUT_DATA  OUT REF_CURSOR)
    IS
BEGIN 
OPEN OUTPUT_DATA FOR 
SELECT ID,NAME FROM MY_TABLE WHERE ID=V_ID ORDER BY ORDER_FIELD1 ORDER_TYPE1, ORDER_FIELD2 ORDER_TYPE2;
END GET_DETAILS;

ORDER_TYPE1、ORDER_TYPE2、ORDER_FIELD1等为输入此过程的输出将是您想要的的记录集

通过

DECLARE @OrderBy VARCHAR(10)
DECLARE @ColumnName varchar(50) 

这两个参数作为存储过程的输入参数

尝试以下CASE条件作为:

ORDER BY CASE WHEN @OrderBy = 'ASC' THEN @ColumnName END ASC,
CASE WHEN @OrderBy = 'DESC' THEN @ColumnName END DESC