将排序键和过滤器添加到Oracle存储过程

时间:2008-12-30 18:44:15

标签: oracle stored-procedures

我在Oracle中有一个存储过程,它返回一个select语句游标引用。我希望能够传递列名和排序方向(例如:'CompanyName DESC')并能够对结果进行排序,或者传递过滤器,例如'CompanyID> 400'并且能够将其应用于select语句。完成此任务的最佳方法是什么?这个表位于一个旧的数据库中,有90列,我不想为每种可能的组合做逻辑。

4 个答案:

答案 0 :(得分: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包也可以提供帮助。

答案 1 :(得分:1)

答案 2 :(得分:1)

http://forums.oracle.com/forums/thread.jspa?threadID=2177728&tstart=0

CASE WHEN:P4_SORT_ORDER = 1那么     ROW_NUMBER()OVER(按上标(ENAME)排序)

或解码(:Sort_var,1,ROW_NUMBER()OVER(ORDER BY UPPER(ENAME)),2,ROW_NUMBER()OVER(ORDER BY UPPER(地址)))

答案 3 :(得分:0)

正如您可能已经想到的那样,R. Bemrose的答案是使用动态SQL实现起来更简单。出于这个原因,它可能是最常使用的。如果你这样做,一定要按照他/她做的方式,使用绑定变量(例如USING p_sort),而不是将字符串连接到lv_cursor_txt。此方法比连接提供更好的性能和安全性。

第二种方法使用的应用程序上下文,我没有看到太多,但我怀疑如果你经常调用查询会提供更好的查询性能。

祝你好运。