我在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. Oracle-存储过程
- 9. 如何将参数添加到C#中的过滤器存储过程XML?
- 10. 存储过程过滤
- 11. 未通过存储过程准确添加数据(Oracle 11g R2)
- 12. 添加过滤器到LiveGrid?
- 13. 如何将存储过程添加到Oracle数据库?
- 14. 文件错误的结束时添加存储过程到Oracle
- 15. 不添加参数到存储过程
- 16. 添加链接到存储过程
- 17. 将过滤器查询添加到Solr中单独排序
- 18. 秩序Oracle触发器和语句的执行存储过程
- 19. oracle存储过程加密密钥
- 20. 使用oracle进行存储过程过滤11 g
- 21. Oracle存储过程生成序列号?
- 22. C#Oracle存储过程参数顺序
- 23. 使用Oracle存储过程
- 24. 优化Oracle存储过程
- 25. Oracle存储过程性能
- 26. PHP与Oracle存储过程
- 27. Oracle存储过程失败
- 28. oracle sql存储过程
- 29. Mule exec Oracle存储过程
- 30. cfquery oracle存储过程
工作得很好。非常感谢你。 – stephenbayer 2008-12-30 20:58:00