存储过程动态排序依据
本文关键字:排序 动态 存储过程 | 更新日期: 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