Добавление ключей сортировки и фильтра в хранимую процедуру Oracle - PullRequest
2 голосов
/ 30 декабря 2008

У меня есть хранимая процедура в Oracle, которая возвращает ссылку на оператор выбора оператора. Я хочу иметь возможность передавать имена столбцов и направление сортировки (например, «CompanyName DESC») и иметь возможность сортировать результаты или проходить фильтр, например «CompanyID> 400», и иметь возможность применять его к оператору выбора. Каков наилучший способ сделать это? Эта таблица находится в старой базе данных и имеет 90 столбцов, и я не хочу делать логику для каждой возможной комбинации.

Ответы [ 4 ]

2 голосов
/ 30 декабря 2008

Я думаю, что вы хотите курсор с 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 голос
/ 22 февраля 2011

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 (Address)))

1 голос
0 голосов
/ 02 января 2009

Как вы, наверное, поняли, ответ Р. Бемроуза проще реализовать, используя динамический SQL. По этой причине он, вероятно, используется чаще всего. Если вы сделаете это, обязательно сделайте это так, как он (/ она?), Используя переменную связывания (например, ИСПОЛЬЗОВАНИЕ p_sort), а не просто конкатенируя строку в lv_cursor_txt. Этот метод обеспечивает лучшую производительность и безопасность, чем конкатенация.

Во втором методе используются контексты приложения, которые, как я видел, использовались не часто, но я подозреваю, что они обеспечат лучшую производительность запроса, если вы часто его вызываете.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...