Динамический PL / SQL-запрос, как игнорировать нулевые параметры? - PullRequest
1 голос
/ 08 февраля 2011

У меня есть процедура PL / SQL с несколькими параметрами. Когда веб-приложение вызывает процедуру, если оно не использует определенный параметр, оно принимает значение null, то есть

procedure test (param1 in varchar2, param2 in varchar2, param3 in varchar2, cursor out sys_refcursor)
...
end procedure test;

Я хочу сделать SQL-запрос, в котором я включаю данные параметры в предложение WHERE, только если параметр не является нулевым. Есть ли способ добиться этого элегантным способом, кроме построения SQL-запроса в строке и последующего открытия курсора для этой строки, например

vSQL := 'SELECT * from TABLE WHERE something = something_else';
if param1 IS NOT NULL
    vSQL := vSQL || 'AND some_param = ' || param1;

Ответы [ 3 ]

1 голос
/ 08 февраля 2011

Вы можете закодировать все это в один выбор

SELECT * from TABLE WHERE something = something_else
AND ((param1 IS NOT NULL AND some_param = param1) OR 1)
1 голос
/ 08 февраля 2011

Я ответил на аналогичный вопрос на dba.stackexchange.com

0 голосов
/ 08 февраля 2011

Создайте тестовую таблицу:

create table testtab
(
name_first varchar2(50),
name_last varchar2(50),
name_middle varchar2(50)
);

insert into testtab values ('Joe', 'Jones', 'A');
insert into testtab values ('Joe', 'Smith', 'A');
insert into testtab values ('Steve', 'Jones', 'B');
insert into testtab values ('Axl', 'Rose', 'C');
insert into testtab values ('Phil', 'McCracken', 'D');
commit;

Создайте свою процедуру:

CREATE OR REPLACE procedure ECDATA.get_testtab_rows
(i_name_first in varchar2 default null,
i_name_last in varchar2 default null,
i_name_middle in varchar2 default null,
o_cursor out sys_refcursor
) as

    v_result_cur    sys_refcursor;

begin

    open v_result_cur for
        select * from testtab
        where name_first like nvl(i_name_first, '%')
        and name_last like nvl(i_name_last, '%')
        and name_middle like nvl(i_name_middle, '%')
    ;

    o_cursor := v_result_cur;

end;
/

Затем назовите ее так:

declare

    v_cur sys_refcursor;
    testtab_rec testtab%rowtype;

begin

    get_testtab_rows(i_name_last=>'Jones', o_cursor=>v_cur);
    loop

        fetch v_cur into testtab_rec;
        exit when v_cur%notfound;
        dbms_output.put_line(testtab_rec.name_first || ' ' || testtab_rec.name_middle || ' ' || testtab_rec.name_last);

    end loop;

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