2013-07-01 187 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等是輸入 此過程的輸出將是您想要的記錄集合