2013-07-01 136 views
2

嗨伙计计算器成员,存储过程动态顺序通过

我有一个紧迫的问题在这里。

我目前正在开发一个迷你web应用程序GridViewGridView必须能够动态执行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

你好,我的asc/desc也必须是动态的。 我不知道用户想要在运行时排序多少列。 要订购的列数取决于用户点击的列数...... – WarChild

回答

0

请递给@OrderBy VARCHAR(10),@的ColumnName VARCHAR(50)在此SP两个参数。

尝试以下情况时的条件在SP

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

这是否真的可以在Oracle中使用? – sll

+0

我不知道关于甲骨文,但在SQL中它将工作 –

+0

在哪个版本的Sql Server? – sll

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; 
+0

这是否适用于多列分类? 据我的理解,这只适用于一个参数/列排序权? – WarChild

+0

你可以将它扩展到多列('WHEN -x THEN col1 || col2'),但它会导致组合爆炸,因为有2n!订购n个色谱柱的可能性(3个色谱柱为12个,5个为240个,10个为7个) –

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