2008-12-30 66 views
2

我在Oracle中有一個存儲過程,它返回一個select語句遊標引用。我希望能夠傳遞列名和排序方向(例如:'CompanyName DESC'),並且能夠對結果進行排序,或者傳遞一個過濾器(如「CompanyID> 400」),並能夠將其應用於select語句。完成這個的最好方法是什麼?此表位於舊數據庫中,有90列,我不想爲每種可能的組合創建邏輯。添加排序鍵和過濾器到Oracle存儲過程

回答

2

我想你想與OPEN-FORUSING光標。

CREATE OR REPLACE FUNCTION sort_table (
    p_sort VARCHAR2 
    ) 
IS 
    TYPE cursor_type IS REF_CURSOR; 
    cur_out cursor_type; 
    lv_cursor_txt VARCHAR2(300); 
BEGIN 
    lv_cursor_txt = 'SELECT * FROM table :sort'; 
    OPEN cur_out FOR lv_cursor_txt USING p_sort; 
    -- Opening the cursor isn't probably what you want, but I'm not sure how to associate the variables except on open 
    RETURN cur_out; 
END; 

這不是一個很好的例子,但我希望它有所幫助。

Oracle在Dynamic SQL頁面中對此進行了討論。 DBMS_SQL包也可能有幫助。

+0

工作得很好。非常感謝你。 – stephenbayer 2008-12-30 20:58:00

0

正如你可能知道的那樣,R. Bemrose的答案是使用動態SQL更簡單的實現。出於這個原因,它可能是最經常使用的。如果你這樣做,一定要按照他(她)的方式使用綁定變量(例如USING p_sort),而不是將字符串連接到lv_cursor_txt上。與連接相比,此方法可提供更好的性能和安全性。

第二種方法使用的應用程序上下文,我沒有看到過使用太多,但我懷疑會提供更好的查詢性能,如果你打電話查詢了很多。

祝你好運。

+0

爲了記錄,我是他。 – Powerlord 2009-01-02 17:51:59