熟悉stackoverflow成员,
我在这里有一个紧迫的问题。
我目前正在开发一个GridView
的迷你网络应用程序。 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
答案 0 :(得分:4)
您可以传递参数(@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
答案 1 :(得分:0)
传递
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
答案 2 :(得分:0)
它不优雅,但应该有效。提供代码并相应地排序:
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;
答案 3 :(得分:0)
这应该让你朝着正确的方向前进:
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等是输入 此过程的输出将是您想要的记录集