2008-12-30 69 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