存储过程动态排序依据

时间:2013-07-01 10:32:21

标签: c# oracle stored-procedures plsql sql-order-by

熟悉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

4 个答案:

答案 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等是输入 此过程的输出将是您想要的记录集