我在Oracle中有一個存儲過程,它返回一個select語句遊標引用。我希望能夠傳遞列名和排序方向(例如:'CompanyName DESC'),並且能夠對結果進行排序,或者傳遞一個過濾器(如「CompanyID> 400」),並能夠將其應用於select語句。完成這個的最好方法是什麼?此表位於舊數據庫中,有90列,我不想爲每種可能的組合創建邏輯。添加排序鍵和過濾器到Oracle存儲過程
2
A
回答
2
我想你想與OPEN-FOR
和USING
光標。
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包也可能有幫助。
1
0
正如你可能知道的那樣,R. Bemrose的答案是使用動態SQL更簡單的實現。出於這個原因,它可能是最經常使用的。如果你這樣做,一定要按照他(她)的方式使用綁定變量(例如USING p_sort),而不是將字符串連接到lv_cursor_txt上。與連接相比,此方法可提供更好的性能和安全性。
第二種方法使用的應用程序上下文,我沒有看到過使用太多,但我懷疑會提供更好的查詢性能,如果你打電話查詢了很多。
祝你好運。
+0
爲了記錄,我是他。 – Powerlord 2009-01-02 17:51:59
1
http://forums.oracle.com/forums/thread.jspa?threadID=2177728&tstart=0
CASE WHEN:P4_SORT_ORDER = 1 THEN ROW_NUMBER()OVER(ORDER BY UPPER(ENAME))
或解碼(:Sort_var,1,ROW_NUMBER()OVER(ORDER BY UPPER( ENAME)),2,ROW_NUMBER()OVER(ORDER BY UPPER(Address)))
相關問題
- 1. 與添加過濾器,以由存儲過程
- 2. 談到Oracle存儲過程
- 3. oracle存儲過程
- 4. Oracle存儲過程
- 5. Oracle存儲過程
- 6. Oracle-存儲過程
- 7. 如何將存儲過程添加到Oracle數據庫?
- 8. 將過濾器查詢添加到Solr中單獨排序
- 9. oracle存儲過程加密密鑰
- 10. C#Oracle存儲過程參數順序
- 11. 在使用php時添加過濾器參數到流過濾器://過濾器
- 12. Oracle:存儲過程錯誤
- 13. cfquery oracle存儲過程
- 14. 調用Oracle存儲過程
- 15. 調度存儲過程「ORACLE」
- 16. 優化Oracle存儲過程
- 17. Mule exec Oracle存儲過程
- 18. Oracle:批量存儲過程
- 19. PHP與Oracle存儲過程
- 20. Oracle存儲過程問題
- 21. Oracle存儲過程問題
- 22. Oracle存儲過程幫助
- 23. 編寫Oracle存儲過程
- 24. Oracle java存儲過程
- 25. ASP.NET和Oracle存儲過程錯誤
- 26. Oracle存儲過程到視圖
- 27. extjs列表過濾器遠程存儲
- 28. 從SQL Server存儲過程執行Oracle存儲過程
- 29. 問題而將SQL Server存儲過程,Oracle存儲過程
- 30. 排序和過濾器不工作 - Ngtable
工作得很好。非常感謝你。 – stephenbayer 2008-12-30 20:58:00